文章目录
1、节点流和处理流
1.1、基本介绍
1.2、节点流和处理流一览图
1.3、节点流和处理流的区别和联系
1.4、处理流的功能主要体现在以下两个方面
1.5、处理流-BufferedReader 和 BufferedWriter
1.5.1、应用案例 1
使用BufferedReader 读取文本文件,并显示在控制台
package reader_;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/**
* bufferedReader 使用
*/
public class BufferedReader_ {
public static void main(String[] args) throws IOException {
String filePath = "e:\\a.java";
// 创建 bufferedReader
BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
// 读取
String line; // 按行读取, 效率高
// 说明
// 1. bufferedReader.readLine() 是按行读取文件
// 2. 当返回 null 时, 表示文件读取完毕
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
// 关闭流, 这里注意只需要关闭 BufferedReader, 因为底层会自动的去关闭 节点流
// 源码
/*
public void close() throws IOException {
synchronized (lock) {
if (in == null)
return;
try {
in.close(); // in 就是我们传入的 new FileReader(filePath), 关闭了
} finally {
in = null;
cb = null;
}
}
}
*/
bufferedReader.close();
}
}
1.5.2、应用案例 2
使用BufferedWriter 将“hello, 北京”,写入到文件中
package writer_;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
/**
* BufferedWriter 的使用
*/
public class BufferedWriter_ {
public static void main(String[] args) throws IOException {
String filePath = "e:\\ok.txt";
// 创建 BufferedWriter
// 说明:
// 1. new FileWriter(filePath, true) 表示以追加的方式写入
// 2. new FileWriter(filePath), 表示以覆盖的方式写入
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath));
bufferedWriter.write("hello, 北京!");
bufferedWriter.newLine(); // 插入一个和系统相关的换行
bufferedWriter.write("hello, 南京!");
bufferedWriter.newLine();
bufferedWriter.write("hello, 天津!");
bufferedWriter.newLine();
// 说明: 关闭外层流即可, 传入的 new FileWriter(filePath), 会在底层关闭
bufferedWriter.close();
}
}
1.5.3、应用案例 3
综合使用 BufferedReader 和 BufferedWriter 完成文本文件拷贝,注意文件编码
package writer_;
import java.io.*;
public class BufferedCopy_ {
public static void main(String[] args) {
// 1. BufferedReader 和 BufferedWriter 是安装字符操作
// 2. 不要去操作 二进制文件[声音,视频,doc, pdf ], 可能造成文件损坏
// BufferedInputStream
// BufferedOutputStream
String srcFilePath = "e:\\a.java";
String destFilePath = "e:\\a2.java";
BufferedReader br = null;
BufferedWriter bw = null;
String line;
try {
br = new BufferedReader(new FileReader(srcFilePath));
bw = new BufferedWriter(new FileWriter(destFilePath));
// 说明: readLine 读取一行内容, 但是没有换行
while ((line = br.readLine()) != null) {
// 每读取一行, 就写入
bw.write(line);
// 插入一个换行
bw.newLine();
}
System.out.println("拷贝完毕...");
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭流
try {
if (br != null) {
br.close();
}
if (bw != null) {
bw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
1.6、处理流-BufferedInputStream 和 BufferedOutputStream
BufferedInputStream
BufferedOutputStream
要求:编程完成图片/音乐的拷贝(要求使用Buffered…流)
package outputstream_;
import java.io.*;
/**
* 演示使用 BufferedOutputStream 和 BufferedInputStream 使用
* 使用他们, 可以完成二进制文件拷贝
* 思考: 字节流可以操作二进制文件, 可以操作文本文件吗?当然可以
*/
public class BufferedCopy02 {
public static void main(String[] args) {
String srcFilePath = "e:\\a.java";
String destFilePath = "e:\\a3.java";
// 创建 BufferedOutputStream 对象 BufferedInputStream 对象
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
// 因为 FileInputStream 是 InputStream 子类
bis = new BufferedInputStream(new FileInputStream(srcFilePath));
bos = new BufferedOutputStream(new FileOutputStream(destFilePath));
// 循环的读取文件, 并写入到 destFilePath
byte[] buff = new byte[1024];
int readLen = 0;
// 当返回 -1 时, 就表示文件读取完毕
while ((readLen = bis.read(buff)) != -1) {
bos.write(buff, 0, readLen);
}
System.out.println("文件拷贝完毕~~~");
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭流, 关闭外层的处理流即可, 底层会去关闭节点流
try {
if (bis != null) {
bis.close();
}
if (bos != null) {
bos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
1.7、对象流-ObjectInputStream 和 ObjectOutputStream