一、笔记
一、字符流
Reader :用于读取字符流的抽象类
子类是 InputStreamReader==> FileReader
Reader公有的方法:
int read() 读取单个字符。
int read(char[] cbuf) 将字符读入数组。
int read(char[] cbuf, int off, int len) 指定数组读取的范围
FileReader 来读取字符文件的便捷类 ==> super(new FileInputStream(file)); 还是转换为字节流开始读取 == > GBK 因为GBK 里两个负数表示一个汉字,读取到两个负数之后再把其合拼起来,正数就直接显示了.
注意:FileReader 用于读取字符流。要读取原始字节流,请考虑使用 FileInputStream
FileReader构造方法:
public FileReader(File file) 参数是一个文件的名称
public FileReader(String fileName) 文件的路径
构造的书写过程:
1. 实例化这个FileReader
2. 把这个FileReader 对象指向要读文件的位置
FileReader方法:
int read() 读取单个字符。
int read(char[] cbuf, int offset, int length) 将字符读入数组中的某一部分。
使用 FileReader 的基本步骤:
1.实例化这个类
2.调用其read()方法
3. 关闭资源
读取的方式:(两种)
1.一个一个字符进行读取,
2.读取多个
Writer: 写入字符流的抽象类
子类 OutputStreamWriter ==> FileWriter
Writer常规的一些方法:
close() 关闭此流,但要先刷新它。
abstract void flush() 刷新该流的缓冲。
void write(char[] cbuf) 写入字符数组。
abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
void write(int c) 写入单个字符。
void write(String str) 写入字符串。
void write(String str, int off, int len) 写字符串的指定的一部分
FileWriter: 用来写入字符文件的便捷类
注意点:用于写入字符流。要写入原始字节流,请考虑使用 FileOutputStream
FileWriter构造
FileWriter(File file)
FileWriter(String fileName)
构造的书写过程:
1.实例化这个FileWriter
2. 如果这个文件不存在会创建文件
3. 把 FileWriter 执行要写入文件位置
FileWriter使用步骤:
1.实例化这个对象
2.调用其写的方法: 用FileWriter 来写自带一个缓冲区(也就是将字符转换成字节)
3.调用其flush() 方法 , 将缓冲区里的数据刷到文件里
4.关闭资源
字符为啥不能读取图片以及视频:
原因:
字符流最终还是字节流进行读取 ==> 只是做了一个处理的功能<
字节转换成字符的依据
对应的某码 Utf-8 GBK ASCALL ==> 就会出现图片视频丢位
图片与视频打不开(图片打码不一样)
字符带缓冲区的流: BufferedReader与BufferedWriter
BufferedReader
好处:
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取(速度快,效率高)
构造方法:
public BufferedReader(Reader in) 需要传递一个Reader 对象
方法:
public String readLine() 读取一行数据 返回值是读取的当前数据
使用缓冲区流来进行读取的步骤:
1.实例化 BufferedReader
2.调用 readLine()
3.关闭资源
BufferedWriter:
好处:
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
构造方法
public BufferedWriter(Writer out) 传递了 一个Writer 对象
独特的方法
public void newLine() 等同于"\r\n" ==>也就是换行
使用缓冲区流来写入数据的一个基本步骤:
1.实例化 BufferedWriter
2.调用其write()
3.关闭资源
二、转换流
InputStreamReader: 字节流通向字符流的桥梁
建议:为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader
构造方法:
public InputStreamReader(InputStream in,Charset cs)
第一个参数是一个 InputStream 第二个参数传递的是要设置的编码格式
常规的方法:
read()
InputStreamReader使用步骤:
1. 实例化InputStreamReader
2. 调用其读的方法
3.关闭资源
OutputStreamWriter:字符流通向字节流的桥梁
建议:为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器
构造方法:
public OutputStreamWriter(OutputStream out,Charset cs)
第一个参数是: 输出流对象 , 第二个:设置编码格式
常规的方法:
write()
BufferedWriter使用步骤
1. 实例化OutputStreamWriter
2. 调用其写的方法
3.关闭资源
三、对象流
ObjectOutputStream
==> 把对象写入到文件里 父类是OutputStream
构造:
public ObjectOutputStream(OutputStream out) 需要来传递OutputStream 可以构建一个文件地址或者是文件
写的方法:
public final void writeObject(Object obj) 这个方法就是写一个对象
使用步骤
1.实例化ObjectOutputStream
2.调用写的方法
3.关闭资源
java.io.NotSerializableException api:当实例需要具有序列化接口时,抛出此异常 (序列化异常)
serialVersionUID 相当于对象序列化的唯一表示符, 如果在序列化的时候,不加这个标识符系统会给.
生成一个标识符, 只要修改类的信息就会生成一个新的表示符 ,所有产生了这个问题: 解决方式:给其生成一个标识符UID
序列化: 对象从内存到其他设备的过程。(把对象转换成字节序列==>才能保存在文件里 )
反序列化:对象从其他设备到内存的过程。(把字节序列转换成对象 ==> 方便读取 )
写对象的时候必须序列化:
步骤:
1.实现序列化的接口
2.需要生成一个唯一的表示符
ObjectInutputStream
把文件中的对象读取出来
注意点: ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列
构造方法:
ObjectInputStream(InputStream in)
读对象的方法:
public final Object readObject()
步骤:
1.实例化ObjectInputStream
2.调用读的方法
3.关闭资源
二、总结
第十九天的学习,今天学习了三个大流,三个流里有许多的详细的流,学起来不难,但是真的太多了,好难记,而且好容易记混,用起来感觉也好乱,有时候不知道哪个是输出哪个是写入。
最后总结的流为:八流
- BufferedWriter ==》 OutputStreamWriter ==》FileOutputStream
- BufferedReader==》InputStreamReader ==》 FileInputStream
- FileReader FileWrite
例子:
public static void main(String[] args) throws IOException {
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("5.txt"),"utf-8"));
bw.write("中公好");
bw.newLine();
bw.write("中公正好\r\n");
bw.write("中公真的好\r\n");
bw.flush();
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream("5.txt"),"utf-8"));
String str=null;
while ((str=br.readLine())!=null){
System.out.println(str);
}
br.close();
bw.close();
}
今天学习的对象操作流记得要实现接口序列化
例子:
public class Student implements Serializable{
两种构造+set和get方法
}
下面是输出多个对象两种方法:
public static void main(String[] args) throws IOException, ClassNotFoundException {
// // 第一种循环输出多个对象
// ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("7.txt"));
// oos.writeObject(new Student("林俊杰",19));
// oos.writeObject(new Student("周杰伦",20));
// oos.writeObject(null);
// oos.close();
// ObjectInputStream ois=new ObjectInputStream(new FileInputStream("7.txt"));
// Object obj=null;
// while ((obj=ois.readObject())!=null){
// System.out.println(obj);
//
// }
// 第二种用集合封装好再输出
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("8.txt"));
ArrayList<Student> list=new ArrayList<>();
list.add(new Student("林俊杰",19));
list.add(new Student("周杰伦",20));
oos.writeObject(list);
oos.close();
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("8.txt"));
ArrayList<Student> list1=(ArrayList<Student>) ois.readObject();
System.out.println(list1);
}