12缓冲流、转换流、序列化流、打印流

12缓冲流、转化流、序列化流、打印流

IO流最后一部分

1、缓冲流

字节缓冲流

字节输入缓冲流:BufferedInputStream
字节输出缓冲流:BufferedOutputStream

缓冲流的特点是效率高,因为缓冲流内部有一个缓冲区,可以起到加速的作用。
缓冲流其实并不具备读写到的能力,它的真正作用是给其他流提供加速。

字节缓冲流构造方法:
BufferedInputStream(InputStream in):参数要传递一个字节输入流。
BufferedInputStream(OutputStream out):参数要传递一个字节输出流。

字节缓冲流读写的方法:
字节缓冲流也属于字节流,里面读写的方法和之前学习的字节流读写的方法一模一样。

字节缓冲流的使用:
(1)创建字节缓冲流对象
(2)调用write方法写数据或者read方法读数据
(3)释放资源

使用缓冲流读写一个字节数组的方式复制文件:

public static void main(String[] args) throws IOException {
        //创建字节输入缓冲流
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d\\aa.jpg"));
        //创建字节输出缓冲流
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("d\\bb.jpg"));
        //记录时间
        long start = System.currentTimeMillis();
        //开始读写,一次读写一个字节数组
        byte[] bArr = new byte[1024];
        int len;
        while ((len = bis.read(bArr)) != -1) {
            //将读取到的内容写到文件中
            bos.write(bArr, 0, len);
        }
        //记录时间
        long end = System.currentTimeMillis();
        System.out.println(end - start);
        //释放资源
        bos.close();
        bis.close();
}

字符缓冲流

字符输出缓冲流:BufferedReader
字符输出缓冲流:BufferedWriter

字符缓冲流的构造方法:
BufferedReader(Reader in):参数要传递字符输入流
BufferedWriter(Writer in):参数要传递字符输出流

字符缓冲流读写数据的方法:
字符缓冲流也属于字符流,里面读写数据的方法和我们之前学习的字符流的读写数据的方法一模一样。

字符缓冲流的使用步骤:
(1)创建字符缓冲流
(2)读或写
(3)关流。
注意:如果是字符缓冲输出流,需要刷新(字符缓冲输出流也属于字符流,需要刷新)

public static void main(String[] args) throws IOException {
        method2();
    }
    /*
        字符输入缓冲流
     */
    public static void method2() throws IOException {
        //创建字符输入缓冲流对象
        BufferedReader br = new BufferedReader(new FileReader("day12\\file01.txt"));
        //开始读取,一次读取一个字符
        int i;
        while ((i = br.read()) != -1) {
            //将读取到的数据进行输出
            System.out.print((char)i);
        }
        //释放资源
        br.close();
    }

    /*
        字符输出缓冲流
     */
    public static void method() throws IOException {
        //创建字符输出缓冲流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("day12\\file01.txt"));
        //调用write方法写数据
        bw.write("你好");
        //刷新
        bw.flush();
        //释放资源
        bw.close();
}

在字符缓冲流中有一些特别的方法。
BufferedWriter中,有一个特别的方法叫做newLine,可以实现一个跨平台的换行。
Void newLine():向文件中写一个换行。
BufferedReader中,有一个特别的方法叫做readLine,可以读取一行数据。
String readLine():读取一行数据并将该数据返回,如果已经读取结束,返回值为null。
注意:readLine方法不会读取换行符,只能读取换行符之前的内容,如果要对读取到的内容进行换行。需要手动实现。

public static void method() throws IOException {
    BufferedReader br = new BufferedReader(new FileReader("E:\\develop\\ToWorking\\Day12\\src\\Class_Demo\\asd.txt"));
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
}
public static void method1() throws IOException {
    BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\develop\\ToWorking\\Day12\\src\\Class_Demo\\asd.txt"));
    bw.write("床前明月光");
    bw.newLine();
    bw.flush();
    bw.write("疑是地上霜");
    bw.newLine();
    bw.flush();
    bw.close();
}

2、转换流

在windows中,文件默认的编码方式是GBK的编码。
FileReader字符输入流读取数据采用是的idea默认的编码UTF-8。
FileReader读取数据采用的编码和文件的编码不一致,那么就引发的乱码问题。
如果想要指定编码进行读写,那么可以使用转换流去实现。

InputStreamReader是转换流,属于字符流,用来读取,可以指定编码从文件中读取数据,转换流本身并不具备读或者写的功能,他的作用是查询编码表并转码的操作。

InputStreamReader(InputStream in):参数要传递一个字节输入流。使用该构造方法创建的转换流对象会以开发平台默认的编码方式(UTF-8)读取。
InputStreamReader(InputStream in, String CharsetName):第一个参数为字节输出流,第二个参数为字符串的编码方式, 该构造方法创建的转换流对象会使用指定的编码方式读取。

InputStreamReader的读取的方法:
InputStreamReader是属于字符流的,里面读取的方法和字符流读取的方法一模一样。

InputStreamReader使用步骤:
1. 创建InputStreamReader转换流对象
2. 调用read方法读取数据。
3. 释放资源
如果创建转换流对象时,指定的编码不存在,那么会报错。
在这里插入图片描述

package cn.itcast.demo02_convert_stream;

import java.io.*;

public class Demo02InputStreamReader {
    public static void main(String[] args) throws IOException {
        //readGBK();
        readUTF8();
    }

    //定义方法,读取UTF-8编码的文件
    public static void readUTF8() throws IOException {
        //创建InputStreamReader转换流对象
        //InputStreamReader isr = new InputStreamReader(new FileInputStream("d:\\file02-utf8.txt"));
        InputStreamReader isr = new InputStreamReader(new FileInputStream("d:\\file02-utf8.txt"), "utf-8");
        //调用read方法读取数据。
        int i;
        while ((i = isr.read()) != -1) {
            //将读取到的数据进行输出
            System.out.print((char)i);
        }

        //释放资源
        isr.close();
    }
    //定义方法,读取GBK编码的文件。
    public static void readGBK() throws IOException {
        //创建InputStreamReader转换流对象,并指定GBK的编码方式
        InputStreamReader isr = new InputStreamReader(new FileInputStream("d:\\file01-gbk.txt"), "gbk");
        //调用read方法读取数据。
        int i;
        while ((i = isr.read()) != -1) {
            //将读取到的数据进行输出
            System.out.print((char)i);
        }

        //释放资源
        isr.close();
    }
}

OutputStreamWriter是转换流, 用来写数据, 可以指定编码写数据。
OutputStreamWriter属于字符流, 会以字符为单位去写。

OutputStreamWriter构造方法:
OutputStreamWriter(OutputStream out):需要传递一个字节输出流, 该构造方法创建的转换流对象会按照开发平台默认的编码去写数据。
OutputStreamWriter(OutputStream out, String charsetName):第一个参数要传递字节输出流,第二个参数要传递字符串的编码方式,该构造方法创建的对象会按照指定的编码写数据。

OutputStreamWriter其他方法:
OutputStreamWriter是字符流,里面写数据的方法和之前字符流写数据的方法一模一样

OutputStreamWriter使用步骤:
1. 创建OutputStreamWriter转换流对象,指定编码
2. 写数据。
3. 刷新。
4. 释放资源。

public static void writeUTF8() throws IOException {
//创建转换流对象
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(“d:\file04-utf8.txt”), “utf-8”);
//调用write方法写数据。
osw.write(“你好”);
//3. 刷新
osw.flush();
//4. 关流
osw.close();
}

/*
    定义方法,用来写GBK的文件
 */
public static void writeGBK() throws IOException {
    //1. 创建OutputStreamWriter转换流对象,指定编码
    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d:\\file03-gbk.txt"), "gbk");
    //2. 调用write方法写数据
    osw.write("你好");
    //3. 刷新
    osw.flush();
    //4. 关流
    osw.close();

}

3、序列化流

ObjectOutputStream是序列化流,可以将java程序中的对象写到文件中。

ObjectOutputStream的构造方法:
ObjectOutputStream(OutputStream out):参数要传递一个字节输出流。
ObjectInputStream写对象的特有方法:
Void writerObject(Object obj):向文件中写一个对象。

序列化流的使用步骤:
(1)创建ObjectOutputStream序列化流对象
(2)调用writerObject()方法
(3)关流
要使用序列化流写的对象,一定要实现Serializable接口
Serializable接口中没有任何内容。
这个接口仅仅起到一个标记作用,只有实现这个接口的类的对象,才可以被序列化,才可以写到文件中。

当使用反序列化流从文件中读取对象时,会对比当前类的版本号和文件中保存的版本号是否一致。如果不一致,那么就会抛出异常。
如果要解决该文件,可以给类固定一个版本号,让类不管怎么修改,版本号都不变。

如果向给类固定一个版本号,那么可以给这个类提供一个静态常量。
1. 这个常量必须使用private static final修饰
2. 这个常量必须是long类型
3. 这个常量必须叫做serialVersionUID

ObjectInputStream是反序列化流,可以将文件中的对象读取到Java程序中。

ObjectInputStream构造方法:
ObjectInputStream(InputStream in): 参数要传递一个字节输入流。

ObjectInputStream读取对象的方法(特有的方法):
Object readObject(): 从文件中读取对象并返回。

反序列化流的步骤:
1. 创建ObjectInputStream对象。
2. 调用readObject方法,读取对象
3. 调用close方法释放资源。

注意:如果调用readObject方法读取对象时,该对象所对应的类不存在,那么会报错(ClassNotFoundException)

注意:
1. static修饰的成员变量不能被序列化,无法写到文件中。
2. 如果我们不希望某个成员变量被序列化,同时又不希望使用static关键字, 那么可以使用transient关键字。
transient表示瞬态, 被transient修饰的成员变量无法被序列化。

在这里插入图片描述
在这里插入图片描述

4、打印流

printStream是打印流

特点:打印流只有输出没有输入。
输出数据十分方便。

PrintStream构造方法:
PrintStream(String fileName):参数要传递一个字符串的文件路径。
PrintStream(File file):参数要传递File对象。
PrintStream(OutputStream out):参数要传递字节输出流。

PrintStream写数据的方法(特有的方法):
void print(任意类型): 写任意类型的数据。
void println(任意类型): 写任意类型的数据,写完之后会自动换行。

PrintStream的使用步骤:
1. 创建流对象
2. 写数据。
3. 关流

System.out.print()里面的System.out其实就是一个打印流,也叫做标准输出流。
System.out这个打印流的目的地是控制台,会将内容输出到控制台。

setOut

在System中有一个静态方法叫做setOut,可以改变标准输出流的目的地:
static void setOut(PrintStream out) :参数要传递打印流,参数打印流的目的地是什么将来标准输出流的目的就是什么。

猜你喜欢

转载自blog.csdn.net/weixin_45507013/article/details/99091329
今日推荐