转换流、序列化对象、打印流

60 阅读3分钟

每篇文章都是成长的证明!

这是我参加【掘金日新计划·10月更文挑战】的第三天

一、转换流

不同的编码在读取时会存在乱码问题,因而,我们需要保证代码编码与文件编码一致,防止乱码的出现!

1、字符输入转换流

InputStreamReader,可以把原始的字节流按照指定编码转换成字符输入流。

public class InputStreamReaderDome1 {
    public static void main(String[] args) throws IOException {
        //1、提取文件的原始字节流,默认UTF-8
        InputStream is = new FileInputStream("C:\Users\DELL\Desktop\record.txt") ;

        //2、把原始字符流转换成字符输入流
        Reader isr = new InputStreamReader(is) ;//默认UTF-8的方式转换成字符流。
        Reader isr1 = new InputStreamReader(is,"GBK");//以指定的GBK编码转换字符流。

        BufferedReader br = new BufferedReader(isr);
        String line;
        while((line = br.readLine() )!= null){
System.out.println(line);
        }
    }
}

首先需要确定文件原始字节流,然后把字节流以指定编码转换成字符输入流,这样字符输入流中的字符就不会乱码。

2、字符输出转换流

OutputStreamWriter,可以把字节输出流按照指定编码转换成字符输出流。

public class OutputStreamWriterDome2 {
    public static void main(String[] args) throws IOException {
        //1、定义一个字节输出流
        OutputStream os = new FileOutputStream("File-app/src/out1.txt");
        //2.把原始的字节输出流转换成字符输出流
        Writer osw = new OutputStreamWriter(os) ;//默认UTF-8写字符
        Writer osw1 = new OutputStreamWriter(os,"GBK");//指定GBK的方式写字符
        //3.把低级的字符输出流包装成高级的缓冲字符输出流
        BufferedWriter bw = new BufferedWriter(osw) ;
        bw.write("你好,同志!") ;
        bw.newLine() ;

        bw.close() ;
    }
}

二、序列化对象

1、对象序列化

定义:以内存为基准,把内存中的对象存储到磁盘文件中去。 ObjectOutputStream,对象字节输出流

public class ObjectOutputStreamDome1 {
    public static void main(String[] args) throws IOException {
        //1、创建学生对象
        Student s = new Student("zhang",'男',19);
        //2、使用对象字节输出流包装字节输出流管道
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("File-app/src/out2.txt") );
        //3、调用序列化方法
        oos.writeObject(s);

        oos.close();
    }
}

2、对象反序列化

定义:以内存为基准,把存储到磁盘文件中去的对象数据恢复成内存中的对象。 ObjectlnputStream,对象字节输入流

public class ObjectInputStreamDome2 {
    public static void main(String[] args) throws Exception {
        //1、创建对象字节输入流管道包装低级的字节输入流管道
        ObjectInputStream is = new ObjectInputStream(new FileInputStream("File-app/src/out2.txt"));
        //2、调用对象字节输入流的反序列化方法
        Student s = (Student)is.readObject();

        System.out.println(s);
    }
}

3、注意

(1)对象如果要序列化,必须实现Serializable序列化接口。

(2)transient修饰的成员变量不参与序列化。

(3)序列化的版本号与反序列化的版本号必须一致才不会出错。

三、打印流

1、PrintStream,PrintWriter

PrintStream继承自字节输出流OutputStream,支持写字节数据的方法。

PrintWriter继承自字符输出流Writer,支持写字符数据出去。

public class PrintDome {
    public static void main(String[] args) throws Exception {
        //1、创建一个打印流对象
       // PrintStream ps = new PrintStream("file-app/src/data.txt");
        PrintWriter ps1 = new PrintWriter("file-app/src/data2.txt");//打印功能上与PrintStream的使用没有区别

        //ps.println(1);
        ps1.println(9);
        //ps.close();
        ps1.close() ;
    }
}

2、输出语句的重定向

定义:属于打印流的一种应用,可以把输出语句的打印位置改到文件。

public class PrintDome2 {
    public static void main(String[] args) throws FileNotFoundException {
        System.out.println("嬴政");
        System.out.println("刘邦");

        //改变输出语句的位置
        PrintStream ps = new PrintStream("file-app/src/data.txt");
        System.setOut(ps);//把系统打印流改成我们自己的打印流

        System.out.println("王莽");
        System.out.println("刘秀");
    }
}

打印流可以实现方便、高效的打印数据到文件中去,实现打印什么数据就是什么数据。

结束,呼~