java IO流总结
根据处理数据的数据类型的不同分为:字节流与字符流
其中 字节流对应的两个抽象类:InputStream和OutputStream
字符流对应的两个抽象类:Reader和Writer
1: InputStream对应的子类为FileInputStream可实现读文件操作
2: OutputStream对应的子类为FileOutputStream可实现写文件操作
3: Reader对应的子类为FileReader可实现读文件操作
4: Writer对应的子类为FileWriter可实现写文件操作
一般来说,对于图片,音乐,视频采取的是字节流读写;对于文本文件或带有字符的文件则更多地采用字符流读写
InputStream与OutputStream(字节流):
package Test2016.demo; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class Demo6 { public static void main(String[] args) { String src = "E:/demo6.txt"; String des = "E:/copy.txt"; FileInputStream fIn = null; FileOutputStream fOut = null; try { fIn = new FileInputStream(src); fOut = new FileOutputStream(des); byte[] buffer = new byte[1024]; int num = 0; //num的目的用于防止最后一次读取的字节小于buffer长度 while ((num = fIn.read(buffer)) != -1) { //参数1:写入的字符串;2:从开始写入字符的偏移量;3:要写入的字符数 System.out.println("共"+ num +"个字节"); fOut.write(buffer, 0, num); } } catch (IOException e) { System.out.println(e); } finally { try { if (null != fIn) fIn.close(); if (null != fOut) fOut.close(); } catch (IOException e) { e.printStackTrace(); } } } }
Reader与Writer(字符流):
package Test2016.demo; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class Demo7 { public static void main(String[] args) { String src = "E:/demo6.txt"; String des = "E:/copy.txt"; FileReader fr = null; FileWriter fw = null; try { fr = new FileReader(src); fw = new FileWriter(des); char[] buffer = new char[1024]; int num = 0; while ((num = fr.read(buffer)) != -1) { System.out.println("共"+ num +"个字符"); fw.write(buffer, 0, num); } } catch (IOException e) { System.out.println(e); } finally { try { if (null != fr) fr.close(); if (null != fw) fw.close(); } catch (IOException e) { System.out.println(e); } } } }
对于大文件,需用缓冲区来读写文件,这样对不会给硬盘造成太大的负担
采用缓冲区可以有效的读写提高效率
理由:读取完放入缓存,然后一次性写入目的文件,不会因为边读边写不停地对目的文件进行写操作
Reader与Writer采用缓存区(一次读取一行):
package Test2016.demo; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class Demo7 { public static void main(String[] args) { String src = "E:/demo6.txt"; String des = "E:/copy.txt"; BufferedReader br = null; //创建缓冲区读对象引用 BufferedWriter bw = null; //创建缓冲区写对象引用 try { br = new BufferedReader(new FileReader(src)); bw = new BufferedWriter(new FileWriter(des)); String line = null; while ((line = br.readLine()) != null) { System.out.println(line); bw.write(line); bw.newLine(); } bw.flush(); //将缓冲区的数据写到目的地,用缓存区必须执行此方法 } catch (IOException e) { System.out.println("读写时异常:" + e); } finally { try { if (null != br) br.close(); if (null != bw) bw.close(); } catch (IOException e) { System.out.println("关闭流时异常:" + e); } } } }
Reader与Writer采用缓存区(一次读取指定长度字符):
package Test2016.demo; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.Reader; public class Demo7 { public static void main(String[] args) { String src = "E:/demo6.txt"; String des = "E:/copy.txt"; FileReader fr = null; FileWriter fw = null; BufferedReader br = null; BufferedWriter bw = null; try { fr = new FileReader(src); fw = new FileWriter(des); br = new BufferedReader(fr); bw = new BufferedWriter(fw); char[] buffer = new char[512]; int num = 0; while ((num = br.read(buffer)) != -1) { bw.write(buffer, 0, num); } bw.flush(); } catch (IOException e) { System.out.println("读写时异常:" + e); } finally { try { if (null != br) fr.close(); if (null != bw) fw.close(); } catch (IOException e) { System.out.println("关闭流时异常:" + e); } } } }
InputStream与OutputStream采用缓冲区:
package Test2016.demo; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class Demo6 { public static void main(String[] args) { String src = "E:/demo6.txt"; String des = "E:/copy.txt"; // FileInputStream fIn = null; // FileOutputStream fOut = null; BufferedInputStream bIs = null; BufferedOutputStream bOs = null; try { /** fIn = new FileInputStream(src); fOut = new FileOutputStream(des); bIs = new BufferedInputStream(fIn); bOs = new BufferedOutputStream(fOut); */ bIs = new BufferedInputStream(new FileInputStream(src)); bOs = new BufferedOutputStream(new FileOutputStream(des)); byte[] buffer = new byte[1024]; int num = 0; while ((num = bIs.read(buffer)) != -1) { //用到num不用buffer.length的主要原因: //是由于最后一次循环如果不够buffer数组定义的长度的话,不够的部分会被默认填充0,而用num就不会 bOs.write(buffer, 0, num); } bOs.flush(); //将缓存区的内容写进目的文件 } catch (IOException e) { System.out.println("读写文件时异常:" + e); } finally { try { if (null != bIs) bIs.close(); if (null != bOs) bOs.close(); } catch (IOException e) { System.out.println("读写文件时异常:" + e); } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?