目录
二、FileInputStream与FileOutputStream
四、BufferedInputStream与BufferedOutputStream
五、BufferedReader与BufferedWriter
六、InputStreamReader与OutputStreamWriter
七、ObjectInputStream与ObjectOutputStream
一、总体概览
字节流与字符流分类如上,下面简要介绍各个流的使用方式,进行梳理方便日后查看。
二、FileInputStream与FileOutputStream
文件字节输入流FileInputStream
//文件输入流创建,与文件接通
InputStream is = new FileInputStream("IO\\src\\data.txt");
//使用read方法读一个字节
int b;
while ((b=is.read())!=-1){
System.out.println((char) b);
}
//使用read方法读取字节数组
byte[] buffer = new byte[3]; //一次流几个字节
int len;
while ((len = is.read(buffer))!=-1) { //读了几个字节,装进去
String rs1 = new String(buffer,0,len); //读多少,倒多少。适用小于等于3
System.out.println(rs1);
}
文件字节输出流FileOutputStream
//文件输出流创建,与文件接通
OutputStream os = new FileOutputStream("IO\\src\\data5.txt");//先清空之前的,再写新数据
//OutputStream os1 = new FileOutputStream("IO\\src\\data5.txt",true);//不请空,追加
//写一个字节进去
os.write('a');
//写一字节数组进去
os.write("\r\n".getBytes());
byte[] buffer = {'a',45};
os.write(buffer);
byte[] buffer2 = "你好".getBytes();
os.write(buffer2);
//写数据,一定要刷新
os.flush();
//释放资源,其也包含刷新,流便无法再使用
os.close();
三、FileReader与FileWriter
文件字符输入流FileReader
//创建一字符输入管道与源文件接通
Reader fr = new FileReader("IO\\src\\data.txt");
//字符数组读
char[] buffer = new char[1024]; //1K字符
int len;
while ((len=fr.read(buffer))!=-1){
String s = new String(buffer,0,len); //解码
System.out.print(s);
}
文件字符输出流FileWriter
//创建一字符输出流与文件接通
Writer fw = new FileWriter("IO\\src\\data10.txt");
//Writer fw = new FileWriter("IO\\src\\data10.txt",true);//追加数据
//写入字符
fw.write(98);
fw.write('a');
fw.write("你好呀");
fw.write("sad撒加快了",0,4);
fw.write("\r\n");
fw.flush();
fw.close();//关闭包含刷新
四、BufferedInputStream与BufferedOutputStream
字节缓冲流自带8K缓冲区,使用时将原始字节流包装为缓冲流
字节缓冲输入流BufferedInputStream与字节缓冲输出流BufferedOutputStream
//创建字节输入缓冲流与字节输出缓冲流
try (InputStream is = new FileInputStream(new File("D:\\picture\\ori.jpg"));
InputStream bis = new BufferedInputStream(is);//包装成高级管道
OutputStream os = new FileOutputStream("D:\\picture\\copy.jpg");
OutputStream bos = new BufferedOutputStream(os);//包装
) {
//定义一字节数组
byte[] buffer = new byte[1024];
int len;
//读并写入
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
}
五、BufferedReader与BufferedWriter
字符缓冲输入流BufferedReader
readLine()方法很nice
//创建流与文件接通
Reader is1 = new FileReader(new File("D:\\picture\\ori.jpg"));
BufferedReader bir1 = new BufferedReader(is1);
//按行读取,一次读一行
String line;
while ((line= bir1.readLine())!=null){
System.out.println(line);
}
字符缓冲输出流BufferedWriter
newLine()可以写入一空行
//创建流与文件接通
Writer w = new FileWriter("day24_buffer\\src\\data1");
BufferedWriter bw = new BufferedWriter(w);
//写入
bw.write("你好");
bw.write(",");
//空一行
bw.newLine();
bw.write("旅行者");
//关闭加刷新
bw.close()
六、InputStreamReader与OutputStreamWriter
字节流转字符流
字符输入转换流InputStreamReader:
public InputStreamReader(InputStream is ,String charset):可以把原始的字节流按照指定编码转换成字符输入流,这样字符流中的字符就不乱码了(重点)
字符输出转换流OutputStreamWriter:
public OutputStreamWriter(OutputStream os,String charset):可以把原始的字节输出流按照指定编码转换成字符输出流(重点)
七、ObjectInputStream与ObjectOutputStream
对象序列化:
作用:以内存为基准,把内存中的对象存储到磁盘文件中去,称为对象序列化。
使用到的流是对象字节输出流:ObjectOutputStream
方法:public final void writeObject(Object obj) 把对象写出去到对象序列化流的文件中去
对象序列化,对象需先继承Serializable这一接口
Student s1 = new Student("小明",45);
//对象序列化
OutputStream os = new FileOutputStream("buffer\\src\\object.txt");
ObjectOutputStream oos = new ObjectOutputStream(os);
//调用序列化方法
oos.writeObject(s1);
oos.close();
对象反序列化:
使用到的流是对象字节输入流:ObjectInputStream
作用:以内存为基准,把存储到磁盘文件中去的对象数据恢复成内存中的对象,称为对象反序列化
方法:public Object readObject() 把存储到磁盘文件中去的对象数据恢复成内存中的对象返回
InputStream is = new FileInputStream("buffer\\src\\object.txt");
ObjectInputStream ois = new ObjectInputStream(is);
Student s =(Student) ois.readObject();
System.out.println(s);
关键点:
1.对象序列化,对象需先继承Serializable这一接口
2.不想序列化的变量可加transien修饰
3.序列化版本化,反序列化版本化需要与序列化一致,更改该值可强制重新序列化
八、PrintStream与PrintWriter
作用:打印流可以实现方便、高效的打印数据到文件中去。打印流一般是指:PrintStream,PrintWriter两个类。
可以实现打印什么数据就是什么数据,例如打印整数97写出去就是97,打印boolean的true,写出去就是true。
PrintStream
//流与文件接通
PrintStream ps =new PrintStream(new FileOutputStream("buffer\\src\\data5.txt"));
PrintStream ps1 =new PrintStream("buffer\\src\\data5.txt");//直接通向文件
//输出
ps.println(97);
ps.println('a');
ps.println(true);
ps.close();
PrintWriter
Writer w = new FileWriter("day24_buffer\\src\\data5.txt");
PrintWriter pw = new PrintWriter(w);
pw.print("你好");
pw.print("\r\n");
pw.print("旅行者");
pw.close();
更改打印流
//原打印流,流向控制台
System.out.println("打赏");
PrintStream ps = new PrintStream("buffer\\src\\log.txt");
//更改打印流,使其流向文件
System.setOut(ps);
System.out.println("基地");