以下两种缓冲方法之间有什么区别(如果有)?
Reader r1 = new BufferedReader(new InputStreamReader(in, "UTF-8"), bufferSize); Reader r2 = new InputStreamReader(new BufferedInputStream(in, bufferSize), "UTF-8");
r1更有效率。在InputStreamReader本身不具备大的缓冲。所述BufferedReader可以被设置为具有比较大的缓冲区InputStreamReader。将InputStreamReader在r2将作为一个瓶颈。
r1
InputStreamReader
BufferedReader
r2
简而言之:您应该通过漏斗而不是瓶子来读取数据。
更新 :这是一个小基准程序,只需复制“粘贴”即可运行它。您不需要准备文件。
package com.stackoverflow.q3459127; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; public class Test { public static void main(String... args) throws Exception { // Init. int bufferSize = 10240; // 10KB. int fileSize = 100 * 1024 * 1024; // 100MB. File file = new File("/temp.txt"); // Create file (it's also a good JVM warmup). System.out.print("Creating file .. "); BufferedWriter writer = null; try { writer = new BufferedWriter(new FileWriter(file)); for (int i = 0; i < fileSize; i++) { writer.write("0"); } System.out.printf("finished, file size: %d MB.%n", file.length() / 1024 / 1024); } finally { if (writer != null) try { writer.close(); } catch (IOException ignore) {} } // Read through funnel. System.out.print("Reading through funnel .. "); Reader r1 = null; try { r1 = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"), bufferSize); long st = System.nanoTime(); for (int data; (data = r1.read()) > -1;); long et = System.nanoTime(); System.out.printf("finished in %d ms.%n", (et - st) / 1000000); } finally { if (r1 != null) try { r1.close(); } catch (IOException ignore) {} } // Read through bottle. System.out.print("Reading through bottle .. "); Reader r2 = null; try { r2 = new InputStreamReader(new BufferedInputStream(new FileInputStream(file), bufferSize), "UTF-8"); long st = System.nanoTime(); for (int data; (data = r2.read()) > -1;); long et = System.nanoTime(); System.out.printf("finished in %d ms.%n", (et - st) / 1000000); } finally { if (r2 != null) try { r2.close(); } catch (IOException ignore) {} } // Cleanup. if (!file.delete()) System.err.printf("Oops, failed to delete %s. Cleanup yourself.%n", file.getAbsolutePath()); } }
使用Seagate Momentus 7200.3硬盘在Latitude E5500上的结果:
创建文件..完成,文件大小:99 MB。 在1593毫秒内完成了通过渠道的读取操作。 读完瓶子..完成了7760毫秒。