Java初识

**

构造方法与文件读取


前言

这个系列是根据B站UP主:刘二大人的“Java编程语言入门”的系列视频,将所讲的内容手打出来的( 类似课堂笔记 ),配合视频食用效果更佳。

PS:萌新第一次写博客,如发现了错误,请帮忙指出,万分感谢!最后,希望大家食用愉快,一起进步!


一、代码简介

分为4个类:FileMain,FileStudent,Main,Student

二、

##FileMain

代码如下:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Scanner;

public class FileMain {
    public static void main(String[] args) throws IOException {
        /*扔给了虚拟机*/
        FileStudent[] students = null;
        InputStream is = new FileInputStream("C:\\Users\\Dell\\Desktop\\Java尝试\\构造方法与文件读取\\Construction method and file reading\\.idea\\data\\info.txt");
        /*路径分为绝对路径和相对路径
         *前者是D盘中的路径
         * 后者是Java里面的,如data\\info.txt
         * 注意:一个\是反义字符,\\才是合法路径
         * 注意:文件名可以因为打错等原因找不到,这里交给虚拟机即可
         *  */

        Scanner scanner = new Scanner(is,"UTF-8");

        // Scanner scanner = new Scanner(System.in);
        /*InputStream 输入流
         *我们把输入看做一个管道,scanner提供了相当复杂的字节流的解析功能
         *键盘上,字符被一个个敲出来;同样的,文件也是一个字符流
         * */


        /*
        *因为scanner读进来不一定是这个整数
        * 因此我们最常见的方法是每次都读一行,然后一行行的进行解析
        *
        int x1 = scanner.nextInt();
        int x2 = scanner.nextInt();
        scanner.nextLine();
        //在前面加一行,把回车干掉!
        String s1 = scanner.nextLine();
        System.out.println(x1);
        System.out.println(x2);
        System.out.println(s1);
        //注意:nextLine()会把回车当做要读的一行
        */

        /*最大的问题是怎样判断行数,我们可以看里面是否还有内容*/
        //但下面的这个方法有一个不好的地方,我们只有等他跑完才知道有多少内容
        //解决方法有两个,一个是使用集合类,可以不断的往里面添加元素,
        //或者是在info.txt最前面加上行数
        int count = Integer.valueOf(scanner.nextLine());
        students = new FileStudent[count];//会自动调用默认的构造函数

        /*
        while (scanner.hasNext()) {
            String line = scanner.nextLine();
            String[] tokens = line.split(",");
            //鼠标长时间停在split,可以看出第三行 public String[] split
            //regex:regular expression
            //System.out.println(tokens);
            //上面会显示出数组,Arrays.toString的功能是把字符串数组转化成字符串,所以用
            System.out.println(Arrays.toString(tokens));

            //接下来把三个元素分开
            String name = tokens[0];
            int age = Integer.valueOf(tokens[1]);
            double grade = Double.valueOf(tokens[2]);

            //创建一个新对象
            FileStudent student = new FileStudent(name,age,grade);
            System.out.println(student.msg());

        }
        */
        for(int i=0;i<count;i++){
            String line = scanner.nextLine();
            String[] tokens = line.split(",");
            //接下来把三个元素分开
            String name = tokens[0];
            int age = Integer.valueOf(tokens[1]);
            double grade = Double.valueOf(tokens[2]);
            //创建一个新对象
            students[i] = new FileStudent(name,age,grade);
        }
        for(FileStudent stu:students){
            System.out.println(stu.msg());
        }
        //FileStudent stu :students 增强for循环 students 是个集合 而stu就是遍历的每个学生实体类
        is.close();
    }
}


FileStudent


代码如下:

//目的是构造一组学生信息
public class FileStudent {
    //字段也可以在这里进行初始化
    private String name = "unnamed";
    private int age = 0;
    private double grade = 0.0 ;

    public FileStudent(String name,int age,double grade){
        this.name = name;
        this.age = age;
        this.grade =grade;
    }
    public FileStudent(){

    }

    public String msg(){
        return "this student "+name+age+grade;
    }

}

Main

public class Main {
    public static void main(String[] args) {
        Student student = new Student();
        student.setName("Mike");
        String name = student.getName();
        System.out.println(name);
        student.setName("Jack");
        System.out.println(name);
        //两次输出结果均为Mike,涉及引用
        Student student1 = new Student("Mike",21,3.5);
        Student Javk = new Student("Javk");
        //如果构造函数只设立了name,其他的值会为0;
        Student somebody = new Student();
        //注意:如果咱们自己写了一个构造方法,编译器中那个全空的默认方法是不会再加上的
        //故而,如果仍需使用那个方法,咱们可以自己在新建一个
    }
}

Student

//这里留一个坑,package为什么重要后面说
public class Student {
    //字段也可以在这里进行初始化
    private String name;
    //private String name = “unnamed”
    private int age;
    //private int age = 0;
    private double grade;
    //private double grade = 0.0 ;

    //构造函数1,3个变量都有设置
    public Student(String name,int age,double grade){
        this.name = name;
        this.age = age;
        this.grade =grade;
    }
    //构造函数2
    public Student(String name){
        this.name =name;
    }

    //构造函数3
    public Student (int age){
        this.age =age;
        this.name = "Jann";
        this.grade = 3.6;
    }

    public Student (){
        this.name = "unnamed";
        this.age = 0;
        this.grade = 0;
        //结果为:unnamed,0,0
    }
    /*
    public Student (){

    }
    //结果为:NULL,0,0
    //默认的构造方法没有参数(构造方法也可以自定义)
    */

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

总结

我们都会有光明的未来!