输入和输出处理——字符流
字符流 = 字节流 + 编码表
用字节流复制文本的时候,文本文件也会有中文,编译不出错,原因是最终底层操作会自动进行字节流拼接(第一个字节都是负数)
Reader类
Reader类常用方法
- int read( )
- int read(char[] c)
- read(char[] c,int off,int len)
- void close( )
子类InputStreamReader常用构造方法:
从字节流到字符流的桥梁,读取字节,并使用指定的编码将其解码为字符。字符集可以指定或平台默认
-
InputStreamReader(InputStream in)
-
InputStreamReader(InputStream in,String charsetName)
FileReader类
- FileReader类是InputStreamReader的子类
- FileReader(File file)
- FileReader(String name)
- 该类只能按照本地平台的字符编码来读取数据,用户不能指定其他的字符编码类型
- System.out.println(System.getProperty(“file.encoding”))获得本地平台的字符编码类型
FileReader读取文件步骤
//引入相关的类
import java.io.Reader;
import java.io.FileReader;
Import java.io.IOExceprion;
//创建FileReader对象
Reader fr= new FileReader("D:\\myDoc\\简介.txt");
//读取文本文件的数据
fr.read();
//关闭相关的流对象
fr.close();
BufferedReader类:
BufferedReader类
提高字符流读取文本文件的效率:使用FileReader类与BufferedReader类
- BufferedReader类是Reader类的子类
- BufferedReader类带有缓冲区
- 按行读取内容的readLine()方法,特有的方法
- BufferedReader常用的构造方法:BufferedReader(Reader in)
BufferedReader读文本文件步骤
-
引入相关的类
import java.io.FileReader; import java.io.BufferedReader; import java.io.IOException;
-
构造BufferedReader对象和FileReader对象
Reader fr = new FileReader("C:\\myTest.txt "); BufferedReader br=new BufferedReader(fr);
-
调用readLine()方法读取数据
br.readLine();
-
关闭文件流对象
br.close(); fr.close();
乱码解决
FileReader fr = new FileReader("c:\\myDoc\\hello.txt");
BufferedReader br = new BufferedReader(fr);
FileInputStream fis = new FileInputStream("c:\\myDoc\\hello.txt");
//使用InputStreamReader并设置编码格式
InputStreamReader fr = new InputStreamReader(fis,"UTF-8");
BufferedReader br = new BufferedReader(fr);
Writer类
Writer类常用方法
-
writer(String str);
-
write(String str,int off,int len)
str – 写入的字符串;
off – 从开始写入字符的偏移量;
len – 要写入的字符数;
-
void close()
-
void flush() :刷新流, 将写入任何缓冲的输出字节并刷新到底层流 。
子类OutputStreamWriter常用的构造方法:
是从字符凑到字节流的桥梁,使用指定的charact将字符编码为字节。字符集可以指定或平台默认
- OutputStreamWriter(OutputStream out)
- OutputStreamWriter(OutputStream out,String charsetName)
FileWriter类
- FileWriter类是OutputStreamWriter的子类
- FileWriter (File file)
- FileWriter (String name)
- 该类只能按照本地平台的字符编码来写数据,用户不能指定其他的字符编码类型
FileWriter写文件
-
引入相关的类
-
创建FileReader对象
Writer fw= new FileWriter("D:\\myDoc\\简介.txt");
-
写文本文件 关闭相关的流对象
fw.write(); fw.close();
BufferedWriter类:
BufferedWriter类
提高字符流写入文本文件的效率:用FileWriter类与BufferedWriter类
-
BufferedWriter类是Writer类的子类
-
BufferedWriter类带有缓冲区
-
BufferedWriter常用的构造方法:BufferedWriter(Writer out)
使用 BufferedWriter写文件步骤
-
引入相关的类
-
构造BifferedWriter对象和FileWriter对象
FileWriter fw = new FileWriter("C:\\myTest.txt"); BufferedWriter bw = new BufferedWriter(fw);
-
调用write()方法写数据
bw.write();
-
流对象的清空和关闭
方法名 说明 flush() 刷新流,还可以继续写数据(真正写数据是字节流,字符流相对于字节流是有缓冲的)
| close() | 关闭流,释放资源,但是在关闭之前会先刷新流,一旦关闭,就不能写数据 |
bw.flush(); fw.close();
读写二进制文件
-
DataInputStream类
FileInputStream的子类
与FileInputStream类结合使用读取二进制文件
-
DataOutputStream类
FileOutputStream的子类
与FileOutputStream类结合使用写二进制文件
DataInputStream类读取二进制文件
-
引入相关的类
-
构造数据输入流对象
FileInputStream fis = new FileInputStream("C:\\HelloWorld.class"); DataInputStream dis = new DataInputStream(fis);
-
调用read()方法读取二进制数据
dis.read();
-
关闭数据输入流
dis.close();
DataOutputStream写二进制文件
-
引入相关的类
-
构造数据输入流对象
FileOutputStream outFile = new FileOutputStream("C:\\HelloWorld.class"); DataOutputStream out = new DataOutputStream(outFile);
-
调用read()方法读取二进制数据
out.write();
-
关闭数据输入流
out.close();
序列化和反序列化
概念:
- 序列化是:将对象的状态写入到特定的流中的过程
- 反序列化是:从特定的流中获取数据重新构建对象的过程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ouMKc7bR-1659961776863)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\1659576558813.png)]
序列化实现步骤:
使用集合保存对象,可以将集合中的所有对象序列化
- 实现Serializable接口
- 创建对象输出流
- 调用writerObject()方法将对象写入文件
- 关闭对象输出流
反序列化实现步骤:
如果向文件中使用序列化机制写入多个对象,那么反序列化恢复对象时,必须按照写入的顺序读取
- 实现Serializable接口
- 创建对象输入流
- 调用readObject()方法读取对象
- 关闭对象输入流
(img-ouMKc7bR-1659961776863)]
序列化实现步骤:
使用集合保存对象,可以将集合中的所有对象序列化
- 实现Serializable接口
- 创建对象输出流
- 调用writerObject()方法将对象写入文件
- 关闭对象输出流
反序列化实现步骤:
如果向文件中使用序列化机制写入多个对象,那么反序列化恢复对象时,必须按照写入的顺序读取
- 实现Serializable接口
- 创建对象输入流
- 调用readObject()方法读取对象
- 关闭对象输入流