目录
上篇请看:JAVA输入输出流(IO流)上篇_代码不会敲的博客-CSDN博客
缓冲流
缓冲流概述
- 缓冲流也称为高效流、或者高级流。之前学习的字节流可以称为原始流。
- 作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能
缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能
字节缓冲流
字节缓冲流自带8KB缓冲区,可以提高原始字节流、字符流读写数据的性能
- 字节缓冲输入流:BufferedInputStream,提高字节输入流读取数据的性能,读写功能上并无变化。
- 字节缓冲输出流:BufferedOutputStream,提高字节输出流读取数据的性能,读写功能上并无变化。
构造器 |
说明 |
public BufferedInputStream(InputStream is) |
可以把低级的字节输入流包装成一个高级的缓冲字节输入流管道,从而提高字节输入流读数据的性能 |
public BufferedOutputStream(OutputStream os) |
可以把低级的字节输出流包装成一个高级的缓冲字节输出流,从而提高写数据的性能 |
建议使用字节缓冲输入流、字节缓冲输出流,结合字节数组的方式,目前来看是性能最优的组合。
public class BufferInputTest1 {
public static void main(String[] args) {
try {
InputStream is = new FileInputStream("D:\test\outputTest.txt");
BufferedInputStream bis = new BufferedInputStream(is);
OutputStream os = new FileOutputStream("D:\test\outputTest3.txt");
OutputStream bos = new BufferedOutputStream(os);
} catch (Exception e) {
e.printStackTrace();
}
}
}
字符缓冲流
字符缓冲流自带8K缓冲区 可以提高原始字符流读写数据的性能
字符缓冲输入流:BufferedReader,性能提升了,多了readLine()按照行读取的功能
- 作用:提高字符输入流读取数据的性能,除此之外多了按照行读取数据的功能。
字符缓冲输出流:BufferedWriter, 性能提升了,多了newLine()换行的功能
- 作用:提高字符输出流写取数据的性能,除此之外多了换行功能
构造器 |
说明 |
public BufferedReader(Reader r) |
可以把低级的字符输入流包装成一个高级的缓冲字符输入流管道,从而提高字符输入流读数据的性能 |
public BufferedWriter(Writer w) |
可以把低级的字符输出流包装成一个高级的缓冲字符输出流管道,从而提高字符输出流写数据的性能 |
import java.io.*;
public class BufferReaderTest2 {
public static void main(String[] args) {
//1.创建一个字符输入流管道与文件接通
try (Reader f = new FileReader("D:\test\outputTest.txt");
//包装包装成一个高级的缓冲字符输入流管道
BufferedReader bf = new BufferedReader(f);
){
String s;
while ((s = bf.readLine()) != null)
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.Writer;
public class BufferWriterTest3 {
public static void main(String[] args) {
//1.创建一个字符输出流管道与目标接通
// 覆盖管道,每次启动都会清空文件之前的数据 true---追加数据,不覆盖
try (Writer f = new FileWriter("D:\test\outputTest3.txt", true);
//包装
BufferedWriter bf = new BufferedWriter(f);
){
bf.write("我爱中国!");
bf.newLine(); //换行操作
bf.write("我爱中国!!");
bf.newLine();
bf.write("我爱中国!!!");
bf.newLine();
} catch (Exception e) {
e.printStackTrace();
}
}
}
转换流
可以解决乱码问题
- 使用字符输入转换流
- 可以提取文件(GBK)的原始字节流,原始字节不会存在问题。
- 然后把字节流以指定编码转换成字符输入流,这样字符输入流中的字符就不乱码了
import java.io.*;
public class InputS {
public static void main(String[] args) {
//代码是utf-8格式-----读取其他格式会乱码
File f = new File("D:\test\Read-GBK.txt");
try (BufferedReader br = new BufferedReader(new FileReader(f))
) {
String line;
while ((line = br.readLine()) != null)
System.out.println(line);
} catch (Exception e) {
e.printStackTrace();
}
}
}
字符输入转换流
字符输入转换流:InputStreamReader,可以把原始的字节流按照指定编码转换成字符输入流。
public InputStreamReader(InputStream is) |
可以把原始的字节流按照代码默认编码转换成字符输入流。几乎不用,与默认的FileReader一样。 |
public InputStreamReader(InputStream is ,String charset) |
可以把原始的字节流按照指定编码转换成字符输入流,这样字符流中的字符就不乱码了 |
import java.io.*;
public class InputS2 {
public static void main(String[] args) {
//代码是utf-8格式-----读取其他格式会乱码
//使用字符输入转换流解决乱码问题
File f = new File("D:\test\Read-GBK.txt");
try (InputStream is = new FileInputStream(f);
Reader isr = new InputStreamReader(is, "GBK");
BufferedReader br = new BufferedReader(isr)
) {
String line;
while ((line = br.readLine()) != null)
System.out.println(line);
} catch (Exception e) {
e.printStackTrace();
}
}
}
字符输出转换流
字符输出转换流:OutputStreamWriter,可以把字节输出流按照指定编码转换成字符输出流
可以把字符以指定编码获取字节后再使用字节输出流写出去: “我爱你中国”.getBytes(编码)
也可以使用字符输出转换流实现。
public OutputStreamWriter(OutputStream os) |
可以把原始的字节输出流按照代码默认编码转换成字符输出流。几乎不用。 |
public OutputStreamWriter(OutputStream os,String charset) |
可以把原始的字节输出流按照指定编码转换成字符输出流 |
import java.io.*;
public class OutputS3 {
public static void main(String[] args) throws Exception {
//字节输出流
OutputStream os = new FileOutputStream("D:\test\Read-GBK.txt", true);
//以设定格式写入
Writer osw = new OutputStreamWriter(os, "GBK");
//包装成高级的字符缓冲流
BufferedWriter bw = new BufferedWriter(osw);
bw.write("中国我爱你!!!");
bw.close();
}
}
序列化对象
对象序列化
作用:以内存为基准,把内存中的对象存储到磁盘文件中去,称为对象序列化。对象必须实现序列化接口
对象序列化: 使用到的流是对象字节输出流:ObjectOutputStream
构造器 |
说明 |
public ObjectOutputStream(OutputStream out) |
把低级字节输出流包装成高级的对象字节输出流 |
方法名称 |
说明 |
public final void writeObject(Object obj) |
把对象写出去到对象序列化流的文件中去 |
import java.io.Serializable;
//对象要序列化,必须要实现Serializable接口
public class People implements Serializable {
private static final long serialVersionUID = 1; //声明序列化的版本号
private String name;
private int age;
// private transient int passwd; //transient修饰的变量不参与序列化
public People(String name, int age) {
this.name = name;
this.age = age;
}
public People(){
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "People{" +
"name='" + name + ''' +
", age=" + age +
'}';
}
}
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class ObjectOutputS {
public static void main(String[] args) throws Exception {
People p = new People("小明", 20);
//对象序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\test\outputTest4.txt"));
//调用序列化方法
oos.writeObject(p);
//资源释放
oos.close();
}
}
对象反序列化
作用:以内存为基准,把存储到磁盘文件中去的对象数据恢复成内存中的对象,称为对象反序列化。
使用到的流是对象字节输入流:ObjectInputStream
构造器 |
说明 |
public ObjectInputStream(InputStream out) |
把低级字节输如流包装成高级的对象字节输入流 |
方法名称 |
说明 |
public Object readObject() |
把存储到磁盘文件中去的对象数据恢复成内存中的对象返回 |
import java.io.FileInputStream;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
public class ObjectInputS2 {
public static void main(String[] args) throws Exception {
//1.创建对象字节输入流
ObjectInput is = new ObjectInputStream(new FileInputStream("D:\test\outputTest4.txt"));
//2.使用对象字节输入流的反对象序列化
People p = (People) is.readObject();
is.close();
System.out.println(p);
}
}
打印流
PrintStream、PrintWriter
作用:打印流可以实现方便、高效的打印数据到文件中去。两者在打印功能上都是使用方便,性能高效(核心优势)
打印流一般是指:PrintStream,PrintWriter两个类。
- PrintStream继承自字节输出流OutputStream,支持写字节
- PrintWrite继承自字符输出流Writer,支持写字符
可以实现打印什么数据就是什么数据,例如打印整数97写出去就是97,打印boolean的true,写出去就是true。
构造器 |
说明 |
public PrintStream(OutputStream os) |
打印流直接通向字节输出流管道 |
public PrintStream(File f) |
打印流直接通向文件对象 |
public PrintStream(String filepath) |
打印流直接通向文件路径 |
方法 |
说明 |
public void print(Xxx xx) |
打印任意类型的数据出去 |
import java.io.PrintStream;
public class PrintS {
public static void main(String[] args) throws Exception {
//1.创建一个打印流对象
PrintStream ps = new PrintStream("D:\test\outputTest5.txt");
ps.println(111);
ps.println("aaaaa");
ps.println("看到这句话的都是大哥");
ps.close();
}
}
输出语句的重定向
属于打印流的一种应用,可以把输出语句的打印位置改到文件
PrintStream ps = new PrintStream("文件地址");
System.setOut(ps);
import java.io.PrintStream;
public class PrintS2 {
public static void main(String[] args) throws Exception {
PrintStream ps = new PrintStream("D:\test\outputTest6.txt");
System.setOut(ps);
System.out.println("你好!!");
System.out.println("我是xxx!!");
System.out.println("啦啦啦啦!!");
System.out.println("啦啦啦!!");
System.out.println("啦啦!!");
ps.close();
}
}