java - 使用 OutputStreamWriter 写入 : line by line vs all at once

标签 java android performance stringbuilder outputstream

哪个运行得更快:对每个要写入的字符串使用 OutputStreamWriter.write(),或者使用 StringBuilder 创建一个大字符串,然后使用 write() 一次?请解释原因。

这里多次使用 write():

writer.write("Registered Players:\n");
while (it.hasNext()) {
    int playerID = (Integer) it.next();
    Player player = playerRegistry.get(playerID);

    writer.write(playerID+": "+player.getPlayerName()+"\n");
}

这里是 StringBuilder:

builder.append("Registered Players:\n");
while (it.hasNext()) {
    int playerID = (Integer) it.next();
    Player player = playerRegistry.get(playerID);

    builder.append(playerID+": "+player.getPlayerName()+"\n");
}
writer.write(builder.toString());

最佳答案

这完全取决于您要写入的 OutputStream 类型。

如果它正在写入内存 (ByteArrayOutputStream),则不会有任何区别。

如果您正在写入 BufferedOutputStream,该流将在内存中缓冲您的行,并在缓冲区已满时将其写入底层流,因此它也不会产生任何影响。

如果您正在写入 FileOutputStreamSocketOutputStream,缓冲将带来更好的性能。但是,如果要写入的数据太大,将所有内容缓冲到内存中可能不是一个好主意:它可能需要太多内存。

最好的办法是使用缓冲写入器或流,它将透明地为您处理缓冲,从而避免过多的低级写入,而不必显式缓冲到 StringBuilder.

关于java - 使用 OutputStreamWriter 写入 : line by line vs all at once,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11568627/

相关文章:

java.lang.ClassCastException : android. os.BinderProxy 无法转换为 com.leonard.sg.okcoin.service.SyncAndTradeService$SyncAndTradeBinder

Android 转换为序数格式

android - Android上GC的日志

python - 将离散列映射到其唯一值的索引

Java 比较枚举器(奇怪的行为)

java - Glassfish V4 管理员密码

c# - 声明一个一次性对象 : inside or outside a loop?

java - 这段代码的时间复杂度是O(N^2)

Java 并发规范 ? : Is an update to a field inside a synchronized block visible to all threads?

java - 致命异常 : AsyncTask #1 how fix?