Day19
使用文件字节输入流和输出流==》乱码;因为两端的编码解码的方式不一样,(Windows系统==》GBK,IDEA==》UTF-8(万国码));使用转换流可以解决问题
一、Reader:用于读取字符流的抽象类
1、常规的方法:
- int read():读取单个字符,返回对应字符的ASCAII码或其他的整数;
- int read(char[] cbuf):将字符读入数组;
- int read(char[] cbuf, int off, int len):指定数组读取的范围;
二、InputStreamReader(转换流):Reader的直接子类
1、字节流通向字符流的桥梁,为了达到高效率,建议在BufferedReader内包装InputStreamReader
2、构造方法:public InputStreamReader(InputStream in,Charset cs):第一个参数是一个InputStream,第二个参数传递的是要设置的编码格式
3、常规方法:public int read();public int read(char[] cbuf,int offset,int length)
4、步骤:实例化对象–>调用读方法–>关闭资源
三、FileReader:InputStreamReader的直接子类,没有特有的方法,都是继承父类
1、FileReader是用来读取字符文件的便捷类,其构造方法也是调用super(new FileInputStream(file))
注意:FileReader用于读取字符流,需要读取原始字节流,建议使用FileInputStream
2、构造方法:public FileReader(File file):参数是一个文件的名称;public FileReader(String fileName):文件的路径
3、常规方法:int read();public int read(char[] cbuf,int offset,int length)都是继承父类的方法
四、BufferedReader(缓冲流):自带缓冲区,是Reader的直接子类
1、使用好处:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取(速度快、效率高)
2、构造方法:public BufferedReader(Reader in):需要传递一个Reader对象
3、常规方法:public String readLine():读取一行数据,返回值是读取的是当前数据
4、步骤:实例化对象–>调用readLine()–>关闭资源
五、Writer:用于字符流写入的抽象类
1、常规方法:
- 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):写入字符串的指定的一部分;
六、 OutputStreamWriter(转换流):Writer的直接子类
1、字符流通向字节流的桥梁,为了达到高效率,建议在BufferedWriter内包装InputStreamWriter
2、构造方法:public OutputStreamWriter(OutputStream out,Charset cs)第一个参数是输出流对象,第二个是设置编码格式
3、常规方法:public void write(int c);public void write(char[] cbuf,int off,int len)
七、FileWriter:OutputStreamWriter的直接子类,没有特有的方法,都是继承父类
1、构造方法:FileWriter(File file);FileWriter(String fileName)
2、步骤:实例化对象–>调用其写入方法–>调用flush()方法–>关闭资源
八、BufferedWriter(缓冲流):自带缓冲区,是Writer的直接子类
1、构造方法:public BufferedWriter(Writer out)传递了一个Writer对象
2、特有的方法:public void newLine()等同于"\r\n"==>也就是换行
九、ObjectOutputStream、ObjectInutputStream(对象流)
1、ObjectOutputStream把对象写入到文件里(父类OutputStream)
序列化:把对象转换成字节序列==>才能保存在文件里
- 构造方法:public ObjectOutputStream(OutputStream out)需要传递OutputStream来构建一个文件地址或者文件
- 写入的方法:public final void writeObject(Object obj)写一个对象
- 步骤:实例化对象–>调用写入方法–>关闭资源
java.io.NotSerializableException当实例需要具有序列化接口时,抛出此异常(序列化异常)
- serialVersionUID:相当于对象序列化的唯一表示符, 如果在序列化的时候,不加这个标识符系统会给生成一个默认的标识符,只要修改类的信息就会生成一个新的表示符 ,所有产生了这个问题(序列号不对应)
解决方式:给其生成一个标识符UID
2、ObjectInutputStream把文件中的对象读取出来(父类InputStream)
反序列化:把字节序列转换成对象==>方便读取(是对以前序列化的对象进行反序列,其他的不行)
- 构造方法:ObjectInputStream(InputStream in)
- 读取的方法:public final Object readObject()
- 步骤:实例化对象–>调用读取得方法–>关闭资源
3、对象流操作多个对象的方法(第一种)
package com.yxlim.day19;
import java.io.*;
/**
* 第一种方法处理存取Object流
* 加入一个空对象
*/
public class First {
public static void main(String[] args)
throws IOException, ClassNotFoundException {
write1();
read1();
}
//写入
public static void write1() throws IOException{
ObjectOutputStream oos=new ObjectOutputStream(
new FileOutputStream("Actor.txt"));
oos.writeObject(new Actor("xiao李"));
oos.writeObject(new Actor("xiao林"));
oos.writeObject(null); //处理方法
oos.flush();
//关闭资源
oos.close();
}
//读取
public static void read1()
throws IOException, ClassNotFoundException{
ObjectInputStream ois=new ObjectInputStream(
new FileInputStream("Actor.txt"));
Object obj=null;
//遍历Object
while ((obj=ois.readObject())!=null) {
System.out.println(obj);
}
//关闭资源
ois.close();
}
}
4、对象流操作多个对象的方法(第二种)
package com.yxlim.day19;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
/**
* 第二种方法处理存取Object流
* 使用集合存储
*/
public class Second {
public static void main(String[] args)
throws IOException, ClassNotFoundException {
write2();
read2();
}
//写入
public static void write2() throws IOException{
ObjectOutputStream oos=new ObjectOutputStream(
new FileOutputStream("Actor.txt"));
List<Actor> list=new ArrayList<>(); //处理方法
list.add(new Actor("xiao李"));
list.add(new Actor("xiao林"));
oos.writeObject(list);
oos.flush();
//关闭资源
oos.close();
}
//读取
public static void read2()
throws IOException, ClassNotFoundException{
ObjectInputStream ois=new ObjectInputStream(
new FileInputStream("Actor.txt"));
List<Actor> list=(List<Actor>)ois.readObject();
System.out.println(list);
//关闭资源
ois.close();
}
}