gpt4 book ai didi

java - 我应该缓冲 InputStream 还是 InputStreamReader?

转载 作者:IT老高 更新时间:2023-10-28 21:18:55 24 4
gpt4 key购买 nike

以下两种缓冲方法有什么区别(如果有的话)?

Reader r1 = new BufferedReader(new InputStreamReader(in, "UTF-8"), bufferSize);
Reader r2 = new InputStreamReader(new BufferedInputStream(in, bufferSize), "UTF-8");

最佳答案

r1 更有效。 InputStreamReader 本身没有大缓冲区。 BufferedReader 可以设置为具有比 InputStreamReader 更大的缓冲区。 r2 中的 InputStreamReader 将成为瓶颈。

简而言之:您应该通过漏斗而不是瓶子来读取数据。


更新:这是一个小基准程序,只需复制“粘贴”并运行即可。您无需准备文件。

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());
}

}

在我的 Latitude E5500 上的结果为 Seagate Momentus 7200.3硬盘:

Creating file .. finished, file size: 99 MB.Reading through funnel .. finished in 1593 ms.Reading through bottle .. finished in 7760 ms.

关于java - 我应该缓冲 InputStream 还是 InputStreamReader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3459127/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com