Java学习-10-韩顺平老师

Java-文件与IO流02

目录:

01-节点流和处理流02-对象流
03-标准输入输出流
04-转换流
05-propreties类

节点流和处理流

基本概念:

1.节点流可以从一个特定的数据源读写数据,如FileReader、FileWriter。
2.处理流(也叫包装流)是"连接"在已存在的流(节点流或处理流)之上,为程序
  提供更强大的读写功能,如BufferedReader,BufferedWriter。

节点流和处理流一览图:

java数据处理工具 java 数据处理包_java

两者的区别和联系:

1.节点流是底层流/低级流,直接跟数据源相接。
2.处理流包装节点流,既可以消除不同节点流之间的差异,也可以提供更加
  方便的方法来完成输入和输出。
3.处理流(也叫包装流)对节点流进行包装,使用修饰器设计模式,不会直接与
  数据源相连。
4.处理流的功能主要体现在以下两个方面:
	1)性能方面:主要以缓存的方式来提高输入输出效率。
	2)操作的便捷:处理流可以提供一些更加便捷的方法来一次输入输出大批量的数据。

字节流对应的处理流
BufferedOutputStream && BufferedInputStream

public class Buffered_ {
    public static void main(String[] args) throws IOException {
        String str = "hello,world"; // 定义一个字符写入
        // 创建一个 BufferedOutputStream对象,传入一个FileOutputStream对象,以追加形式写入
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("e:\\a.txt", true));
        bos.write(str.getBytes());
        // 读取文件
        byte[] buf = new byte[8];
        int len = 0;
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("e:\\a.txt"));
        while ((len = bis.read(buf)) != -1){
            System.out.print(new String(buf,0,len));
        }
        bos.close();
        bis.close();
    }
}

字符流对应的处理流
BufferedWriter && BufferedReader

public class Buffered_ {
    public static void main(String[] args) throws IOException {
        // 创建一个BufferedWriter,传入一个FileWriter对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("e:\\a.txt"));
        // 写入字符串
        bw.write("hello,word");
        bw.newLine();
        bw.write("hello,word");
        bw.close();
        String line = "";
        // 创建一个BufferedReader,传入一个FileReader对象
        BufferedReader br = new BufferedReader(new FileReader("e:\\a.txt"));
        // 遍历输出
        while((line = br.readLine()) != null){
            System.out.println(line);
        }
        br.close();
    }
}

对象流

序列化和反序列化

1.序列化就是在保存数据时,保存数据的值和数据的类型。
2.反序列化就是在恢复数据时,恢复数据的值和数据的类型。
3.需要让某个对象支持序列化机制,则必须让其类是可以序列化的,让类序列化可以实现以下接口:
	1)Serializable // 这是一个接口标记
	2)Externalizable

ObjectOutputStream && ObjectInputStream

public class ObjectFile_ {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // 通过ObjectOutputStream将对象序列化存储
        ObjectOutputStream oop = new ObjectOutputStream(new FileOutputStream("e:\\a.dat"));
        // 必须写入可序列化的对象
        oop.writeInt(100); // int -> Integer对象
        oop.writeDouble(33.3);// double -> Double对象
        oop.writeFloat(20.2f);// float -> Float
        oop.writeChar('A'); // char -> Character
        // 写入自己定义的对象时,该对象必须实现了Serializable接口
        oop.writeObject(new Dog("旺财",3)); //
        oop.close();

        // 通过反序列化
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e:\\a.dat"));
        // 反序列读取的时候必须和写入顺序一致,并且如果序列化了对象,
        // 那么反序列的时候,也必须要保证能访问到该对象
        System.out.println(ois.readInt());
        System.out.println(ois.readDouble());
        System.out.println(ois.readFloat());
        System.out.println(ois.readChar());
        System.out.println(ois.readObject());
        ois.close();
    }
}

class Dog implements Serializable{
    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

标准输入输出流

基本介绍:

类型			默认设备
System.in  	 InputStream  	键盘
System.out   PrintStream    显示器
public class System_ {
    public static void main(String[] args) {
        System.out.println(System.in.getClass());
        PrintStream out = System.out;
        out.println("我爱写代码");
    }
}

转换流

基本概念:

1.InputStreamReader:Reader的子类,可以将InputStream(字节流)转换成Reader(字符流)。
2.InputStreamReader:Writer的子类,可以将OutputStream(字节流)转换成Reader(字符流)。
3.当处理纯文本问题的时候,如果使用字符流效率更高,并且可以有效的解决中文问题,建议使用转换流。

InputStreamReader && OutputStreamWriter

public class Transformation_ {
    public static void main(String[] args) throws IOException {
        // OutputStreamWriter可以将字节输出流转转换成字符输出流,并且设置编码格式,解决中问乱码问题
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
                                        new FileOutputStream("e:\\a.txt"),"gbk"));
        bw.write("hello,我爱写代码");
        bw.close(); // 释放资源
        String line ="";
        // InputStreamReader 可以将字节输入流转换成字符输入流,提高了效率,解决了中文乱码问题
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("e:\\a.txt"), "gbk"));
        // 遍历输出
        while ((line =br.readLine())!= null){
            System.out.println(line);
        }
    }
}

Properties类

基本介绍和常用方法:

作用:用来便捷的管理xxx.properties配置文件
方法:
1.load:加载配置文件的键值对到Properties对象。
2.list:将数据显示到指定设备。
3.getProperty:获取键值对。
4.setProperty:设置键值对到Properties对象。
5.store:将Properties中的键值对存储到配置文件,保存信息到配置文件,
	    如果有中文,会存储unicode码。
public class Properties_ {
    public static void main(String[] args) throws IOException {
        Properties properties = new Properties();
        // 写入文件
        properties.setProperty("user","tom");
        properties.setProperty("psw","11111");
        properties.setProperty("age","10");
        properties.store(new FileOutputStream("src\\mysql.properties"),null);
        // 读取 文件
        properties.load(new FileInputStream("src\\mysql.properties"));
        System.out.println(properties.getProperty("user")); // tom
        // 修改文件内容
        properties.setProperty("user","jack");
        // 显示信息到默认显示屏
        properties.list(System.out);
    }
}

文件与IO流小结,欢迎大家交流学习!