IO流
输入还是输出的参考系是相对于内存来说的。
input输入流:从硬盘到内存中
output输出流:从内存到硬盘中
分类
字节流
字节流什么文件都可以处理
字符流
字符流只能处理文本类型的文件
输入流 | 输出流 | |
---|---|---|
字符流 | Reader | Writer |
字节流 | InputStream | OuputStream |
FileWriter类
// 创建了一个流对象指向了D盘下的abc.txt
// 创建一个新文件
// 如果原文件不存在,则使用创建的这个新文件
// 如果原文件存在,则使用新创建的文件覆盖原文件
// append:如果设置为true,那么文件可以继续拼接
FileWriter fw = new FileWriter(“D:\\abc.txt”,true);
// 写数据 FileWriter默认有一个缓冲区
fw.write(“aaa”);
// 冲刷缓冲区 -->立即保存
fw.flush();
// 关闭流 在关流时候会默认冲刷一次缓冲区
fw.close();
// 将这个对象标记为垃圾对象
fw = null;
FileWriter异常处理
FileWriter fw = null;
try {
fw = new FileWriter("D:\\abc.txt");
fw.write("abc");
// 防止关流失败,导致数据遗留在缓冲区产生数据丢失
fw.flush();
}catch (IOException e){
// 打印栈轨迹
e.printStackTrace();
}finally {
// 判断流对象是否初始化成功
if (fw != null){
try {
fw.close();
}catch(IOException e){
e.printStackTrace();
}finally {
// 如果关流成功,标记垃圾对象来释放内存
// 如果关流失败,则强制回收这个对象
fw = null;
}
}
}
JDK1.7特性–>try–with–resources
// 格式:try(必须是AutoCloseable的子类对象)
// 资源会自动释放,不需要写close()
// 注意:try()中的对象的初始化必须在()中
// 1.7特性:try ... with ...resources
try(FileWriter fw = new FileWriter("D:\\abc.txt")){
fw.write("abc");
}catch (IOException e){
e.printStackTrace();
}
FileReader类
// 字符输入流
// 创建流对象
FileReader fr = new FileReader("D:\\abc.txt");
// int c;
// while((c = fr.read()) != -1){
// System.out.println((char)c);
// }
// 定义一个空的字符数组
char[] cs = new char[3];
// 返回值是实际读取到的数量,读取失败返回-1
int len;
// 将数据读取到字符数组中
// 读取到末尾返回-1
while ((len =fr.read(cs)) != -1){
System.out.print(new String(cs,0,len));
}
// 关闭流
fr.close();
BufferedReader类和BufferedWriter类
// 自带缓冲区的字节输入流
// BufferedReader的构造方法中需要传入一个Reader的对象
FileReader fileReader = new FileReader("D:\\aaaaaa.txt");
BufferedReader br = new BufferedReader(fileReader);
// 每次读取一行 读不到内容会返回null
String str;
// 注意:BufferedReader的readLine()方法,不会读取换行符
while ((str = br.readLine()) != null){
System.out.println(str);
}
// 关闭外层流,内部的流也会关闭
br.close();
// 创建BufferedWriter
// BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\nba.txt"));
// bw.write("我爱你中国");
// bw.newLine();
// bw.write("亲爱的母亲");
// bw.close();
// bw.newLine();换行
// 装饰设计模式
// 模式:针对于某一类问题的统一的处理方法
// 设计模式:在软件开发中针对遇到的问题所提供的统一个解决方法
// 装饰设计模式:利用同类对象来构建本类对象,然后对所构建的对象进行功能的改善或者增强
练习 拷贝文件
// 创建BufferedReader和BufferedWriter
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\cba.txt"));
BufferedReader br = new BufferedReader(new FileReader("D:\\aaaaaa.txt"));
String str = null;
// 一边读取一边写入
while ((str = br.readLine()) != null){
bw.write(str);
// 记得一定要换行
bw.newLine();
}
// 关闭流
br.close();
bw.close();
字节流
字符流只能操作字符类的文件。如果要操作视频音频图片等文件,需要使用字节流。字节流可以操作任何文件。
字节流中没有缓冲区,不关流也可以写入到文件中。
// 字节输入流和字节输出流
// 字符流:只能处理和字符相关的文件(txt java)
// 字节流: 处理任何的文件
// 字节输出流 创建字节输出流
// FileOutputStream fos = new FileOutputStream("D:\\asdf.txt");
fos.write();// 输出一个字节
// fos.write("abc".getBytes());// 输出一个字节数组
// // 关流
// fos.close();
// 字节输入流
// 创建字节输入流
FileInputStream fis = new FileInputStream("D:\\asdf.txt");
// 创建一个数组作为缓冲区
byte[] bs = new byte[10];
// 每次实际读取到的字节个数
int len;
// 读取数据
while ((len = fis.read(bs)) != -1){
System.out.println(new String(bs,0,len));
}
// 关闭流
fis.close();