每篇文章都是成长的证明!
这是我参加【掘金日新计划·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("刘秀");
}
}
打印流可以实现方便、高效的打印数据到文件中去,实现打印什么数据就是什么数据。
结束,呼~