首页 >> 大全

Java基础-IO操作-缓冲流

2023-12-24 大全 26 作者:考证青年

目录 5. 案例-出师表排序-写入新的文件6. 原始流、缓冲流的性能分析【重点】

1. 什么是缓冲流

对原始数据进行包装,以提高原始流读写数据的性能

2. 缓冲流的分类 3. 缓冲流的原理

字节缓冲输入流自带了8KB的缓冲池;字节缓冲输出流也自带了8KB的缓冲池。

假设我们要将D盘16KB的数据复制到C盘当中。

创建一个字节数组,用于读取1KB的数据。

采用原始的文件输入输出流,要从D盘读取16次,写入C盘16次。

采用缓冲流,可以一次读取写入8KB的数据,也就是2次。

缓冲流将数据存储在内存中,所以比直接从硬盘中读取数据要快得多。

4. 缓冲流API 4.1 缓冲字节输入输出流 构造器说明

( )

把低级的字节输入流包装成一个高级的缓冲字节输入流,从而提高读取数据的效率

操作系统缓冲池_缓冲操作期间出现错误_

( )

把低级的字节输出流包装成一个高级的缓冲字节输出流,从而提高写数据的效率

public static void main(String[] args) throws IOException {// 目标:掌握缓冲字节输入流try (InputStream inputStream = new FileInputStream("D:\\repo\\javasepro\\helloworld-app\\src\\com\\ming\\File_\\abc.txt");// 自定义缓冲流的大小,默认是8192 -> 8K InputStream bufferedInputStream = new BufferedInputStream(inputStream, 8192 * 2);OutputStream outputStream = new FileOutputStream("D:\\repo\\javasepro\\helloworld-app\\src\\com\\ming\\File_\\abc123.txt");// 自定义缓冲流的大小,默认是8192 -> 8K OutputStream bufferedOutputStream = new BufferedOutputStream(outputStream, 8192 * 2);) {byte[] buffer = new byte[1024];int len;while ((len = bufferedInputStream.read(buffer)) != -1) {bufferedOutputStream.write(buffer, 0, len);}System.out.println("复制完成!");} catch (IOException e) {throw new RuntimeException(e);}}

4.1 缓冲字符输入输出流 构造器说明

( )

把低级的字符输入流包装成字符缓冲输入流管道,从而提升字符输入流读写字符数据的性能

方法说明

()

读取一行数据返回,如果没有数据可读了,会返回Null

public static void main(String[] args) throws IOException {// 目标:掌握字符缓冲输入流try (Reader reader = new FileReader("D:\\repo\\javasepro\\helloworld-app\\src\\com\\ming\\File_\\123.txt");// 1. public BufferedReader(Reader reader) 把低级的字符输入流包装成字符缓冲输入流管道,从而提升字符输入流读写字符数据的性能BufferedReader bufferedReader = new BufferedReader(reader);) {// 2. public String readLine()  读取一行数据返回,如果没有数据可读了,会返回NullString line;while ((line = bufferedReader.readLine()) != null) {System.out.println(line);}} catch (IOException e) {throw new RuntimeException(e);}}

构造器说明

( )

把低级的字符输出流包装成字符缓冲输出流管道,从而提升字符输出流读写字符数据的性能

方法说明

void ()

换行

public static void main(String[] args) throws IOException {// 目标:掌握字符缓冲输出流try (Writer fileWriter = new FileWriter("D:\\repo\\javasepro\\helloworld-app\\src\\com\\ming\\File_\\654.txt", true);// 1.public BufferedWriter(Writer writer)   把低级的字符输出流包装成字符缓冲输出流管道,从而提升字符输出流读写字符数据的性能BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);) {bufferedWriter.write('a');bufferedWriter.write(97);bufferedWriter.write('明');bufferedWriter.write("正大光明");// 2. public void newLine() 换行bufferedWriter.newLine();} catch (IOException e) {throw new RuntimeException(e);}}

5. 案例-出师表排序-写入新的文件

1.先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。
5.亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。
8.愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏。臣不胜受恩感激。今当远离,临表涕零,不知所言。
3.侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必能裨补阙漏,有所广益。
6.臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。
2.宫中府中,俱为一体;陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。
7.先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐托付不效,以伤先帝之明;故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。
4.将军向宠,性行淑均,晓畅军事,试用于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。

public static void main(String[] args) throws IOException {// 恢复出师表的顺序到新文件中try (Reader reader = new FileReader("D:\\repo\\javasepro\\helloworld-app\\src\\com\\ming\\File_\\csb.txt");BufferedReader bufferedReader = new BufferedReader(reader);Writer writer = new FileWriter("D:\\repo\\javasepro\\helloworld-app\\src\\com\\ming\\File_\\csb_bf.txt");BufferedWriter bufferedWriter = new BufferedWriter(writer)) {ArrayList<String> arrayList = new ArrayList<>();String line;while ((line = bufferedReader.readLine()) != null) {arrayList.add(line);}// 列表排序Collections.sort(arrayList);for (String list : arrayList) {bufferedWriter.write(list);bufferedWriter.newLine();}System.out.println("写入成功!");} catch (IOException e) {throw new RuntimeException(e);}}

6. 原始流、缓冲流的性能分析【重点】

字节数组越大越好,但是达到一定程度,对性能的影响微乎其微。

测试用例:

测试步骤:

使用低级的字节流按照一个一个字节的形式复制文件。使用低级的字节流按照字节数组的形式复制文件。使用高级的缓冲字节流按照一个一个字节的形式复制文件。使用高级的缓冲字节流按照字节数组的形式复制文件。

public class TimeTest {// 源路径private static final String SRC_FILE = "helloworld-app\\src\\com\\ming\\File_\\static\\mv.mp4";// 目标路径private static final String DEST_FILE = "helloworld-app\\src\\com\\ming\\File_\\static\\";public static void main(String[] args) {// 目标:原始流、缓冲流的性能分析
//        copy01();  // 低级字节流,一个一个字节的复制,慢的令人难以忍受,直接淘汰!copy02();  // 低级字节流,一个一个字节数组的形式复制copy03();  // 缓冲字节流,一个一个字节的复制copy04();  // 缓冲字节流,一个一个字节数组的形式复制,速度快,推荐使用!}private static void copy04() {// 开始时间long startTime = System.currentTimeMillis();try (InputStream inputStream = new FileInputStream(SRC_FILE);BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);OutputStream outputStream = new FileOutputStream(DEST_FILE + "4.mp4");BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);) {byte[] buffer = new byte[1024];int len;while ((len = bufferedInputStream.read(buffer)) != -1) {bufferedOutputStream.write(buffer, 0, len);}} catch (Exception e) {throw new RuntimeException(e);}// 截止时间long endTime = System.currentTimeMillis();System.out.println("4.使用高级的缓冲字节流按照字节数组的形式复制文件耗时:" + (endTime - startTime) / 1000.0 + "s");}private static void copy03() {// 开始时间long startTime = System.currentTimeMillis();try (InputStream inputStream = new FileInputStream(SRC_FILE);BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);OutputStream outputStream = new FileOutputStream(DEST_FILE + "3.mp4");BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);) {int c;while ((c = bufferedInputStream.read()) != -1) {bufferedOutputStream.write(c);}} catch (Exception e) {throw new RuntimeException(e);}// 截止时间long endTime = System.currentTimeMillis();System.out.println("3.使用高级的缓冲字节流按照一个一个字节的形式复制文件耗时:" + (endTime - startTime) / 1000.0 + "s");}private static void copy02() {// 开始时间long startTime = System.currentTimeMillis();try (InputStream inputStream = new FileInputStream(SRC_FILE);OutputStream outputStream = new FileOutputStream(DEST_FILE + "2.mp4");) {byte[] buffer = new byte[1024];int len;while ((len = inputStream.read(buffer)) != -1) {outputStream.write(buffer, 0, len);}} catch (Exception e) {throw new RuntimeException(e);}// 截止时间long endTime = System.currentTimeMillis();System.out.println("2.使用低级的字节流按照字节数组的形式复制文件耗时:" + (endTime - startTime) / 1000.0 + "s");}private static void copy01() {// 开始时间long startTime = System.currentTimeMillis();try (InputStream inputStream = new FileInputStream(SRC_FILE);OutputStream outputStream = new FileOutputStream(DEST_FILE + "1.mp4");) {int c;while ((c = inputStream.read()) != -1) {outputStream.write(c);}} catch (Exception e) {throw new RuntimeException(e);}// 截止时间long endTime = System.currentTimeMillis();System.out.println("1.使用低级的字节流按照一个一个字节的形式复制文件耗时:" + (endTime - startTime) / 1000.0 + "s");}
}

总结:要提高文件传输的性能,不一定要使用缓冲流,也可以使用低级流,控制的决定因素在于字节数组的大小。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了