(以下内容全部来自上述课程)
缓冲流
1. 字节缓冲流
原理:底层自带了长度为8192的缓冲区提高性能
1.1拷贝文件(一次读写一个字节)
//1.创建缓冲流的对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("myio\\a.txt"));
BufferedOutputStream bos = new Buffered0utputStream(new File0utputStream("myio\\copy.txt"));
//2.循环读取并写到目的地
int b;
while ((b = bis.read()) != -1){
bos.write(b);
}
//3.释放资源
bos.close();
bis.close( );
1.2 拷贝文件(一次读写一个字节数组)
//1.创建缓冲流的对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("myio\\a.txt"));
BufferedOutputStream bos = new Buffered0utputStream(new File0utputStream("myio\\copy2.txt"));
//2.拷贝(一次读写多个字节)
byte[] bytes = new byte[1024];
int len;
while((len = bis.read(bytes)) != -1){
bos.write(bytes, 0, len);
} I
//3.释放资源
bos.close();
bis.close();
1.3 提高效率的原理
2. 字符缓冲流
原理:底层自带了长度为8192的缓冲区提高性能
2.1 方法
2.2 使用
- 输入
//1.创建字符缓冲输入流的对象
BufferedReader br = new BufferedReader(new FileReader("myio\\a.txt"));
//2.读取数据//细节:
//readLine方法在读取的时候,一次读一整行,遇到回车换行结束
// 但是他不会把回车换行读到内存当中
/*String line1 = br.readLine();
System.out.println(line1);
String line2 = br.readLine();
System.out.println(line2);*/
String line;
while ((( line = br.readLine()) != null)){
System.out.println(line);
}
//3.释放资源
br.close();
- 输出
//1.创建字符缓冲输出流的对象
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt", true));
//2.写出数据
bw.write( str:"123");
bw.newLine( );|
bw.write( str: "456" );
bw.newLine();
//3.释放资源
bw.close();
转换流
是字符流和字节流之间的桥梁。
1. 利用转换流按照指定字符编码读取
/*利用转换流按照指定字符编码读取(了解)
因为JDK11:这种方式被淘汰了。替代方案(掌握)*/
//1.创建对象并指定字符编码
/*
InputStreamReader isr = new InputstreamReader(new FileInputStream("myio\\gbkfile.txt"),"GBK");
//2.读取数据 int ch;
while ((ch = isr.read()) !=-1){
System.out.print((char)ch);}
//3.释放资源 isr.close();
*/
FileReader fr = new FileReader("myio\\gbkfile.txt",Charset.forName("GBK"));
//2.读取数据
int ch;
while ((ch = fr.read()) != -1){
System.out.print((char)ch);
}
//3.释放资源
fr.close();
2. 利用转换流按照指定字符编码写出
/*利用转换流按照指定字符编码写出*/
//1.创建转换流的对象
/*OutputStreamWriter osw = new outputStreamWriter(new File0utputStream("myio\\b.txt"),"GBK");
//2.写出数据
osw.write("你好你好");
//3.释放资源
osw.close();*/
FileWriter fw = new FileWriter("myio\\c.txt",Charset.forName("GBK"));
fw.write( str:"你好你好");
fw.close();
3. 将本地文件中的GBK文件,转成UTF-8
/*将本地文件中的GBK文件,转成UTF-8*/
//1.JDK11以前的方案
/* InputstreamReader isr = new InputstreamReader(new FileInputstream("myio\\b.txt"),"GBK");
outputstreamWriter osw = new outputstreamWriter(new FileOutputStream("myio\\d.txt"),"UTF-8");
int b;
while((b = isr.read()) != -1){
osw.write(b);
}
osw.close( );| isr.close();*/
//2.替代方案
FileReader fr = new FileReader("myio\\b.txt",Charset.forName("GBK"));
FileWriter fw = new FileWriter("myio\\e.txt",charset.forName("UTF-8"));
int b;
while ((b = fr.read()) != -1){
fw.write(b);
}
fw.close();
序列化流(对象操作输出流)
可以把Java中的对象写到本地文件中
1. 方法
/*
需求:
利用序列化流/对象操作输出流,把一个对象写到本地文件中
构造方法:
public 0bjectOutputStream(OutputStream out) 把基本流变成高级流
成员方法:
public final void write0bject(0bject obj) 把对象序列化(写出)到文件中去
*/
//1.创建对象
Student stu = new Student("zhangsan", 23);
//2.创建序列化流的对象/对象操作输出流
0bject0utputStream oos = new 0bject0utputStream(new File0utputStream("myio\\a.txt"));
//3.写出数据
oos.write0bject(stu);
//4.释放资源
oos.close();
2. 细节
Serializable接口里面是没有抽象方法,标记型接口
一旦实现了这个接口,那么就表示当前的Student类可以被序列化
理解:
- 一个物品的合格证
反序列化流(对象操作输入流)
可以把序列化到本地文件中的对象,读取到程序中来
1. 方法
/*需求:
利用反序列化流/对象操作输入流,把文件中中的对象读到程序当中构造方法:
public ObjectInputStream(InputStream out) 把基本流变成高级流
成员方法:
public 0bject read0bject( ) 把序列化到本地文件中的对象,读取到程序中来
*/
//1.创建反序列化流的对象
0bjectInputStream ois = new 0bjectInputStream(new FileInputStream("myio\\a.txt"));
//2.读取数据
0bject o = ois.read0bject();
//3.打印对象
System.out.print1n(o);
//4.释放资源
ois.close();
2. 细节
- 使用序列化流将对象写到文件时,需要让Javabean类实现Serializable接口。
否则,会出现NotSerializableException异常 - 序列化流写到文件中的数据是不能修改的,一旦修改就无法再次读回来了
- 序列化对象后,修改了Javabean类,再次反序列化,会不会有问题?
会出问题,会抛出InvalidClassException异常
**解决方案:**给Javabean类添加serialVersionUID(序列号、版本号) - 如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?
**解决方案:**给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程