我正在编写下面的代码,这段代码基本上是通过缓冲编写器写入文件,我使用的是JDK 1.5,现在我的查询基本上这段代码工作正常并写入文件,文件很大就说了文件的最终大小约为1GB,现在请允许我在JDK 1.5中提供Java提供的任何其他替代方案,这可以使文件编写过程更快,并提高性能吗?
File file = new File(FilePath + getFileName());
try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) {
for (Posuser posuser : totalusers) {
for (potook bk : books) {
if ((posuser.getUpdatedBy() == null)
&& (posuser.getUpdateddateformat() == null)) {
bw.write("aaa"+"\r\n");
} else if (posuser.getUpdatedBy() == null
&& posuser.getUpdateddateformat() != null) {
bw.write("bbb+"\r\n");
} else if (posuser.getUpdatedBy() != null
&& posuser.getUpdateddateformat() == null) {
bw.write("ccc"+"\r\n");
} else {
bw.write("ddd"+\r\n");
}
}
}
} catch (IOException, AnotherException e) {
logger.error(e.getMessage());
}
答案 0 :(得分:1)
我会查看java.nio
包。 This SO question/answer详细了解更多信息。性能提升。
我对较大文件大小的体验是java.nio更快 比java.io.坚固得快。比如在> 250%范围内。
答案 1 :(得分:1)
这应该至少是内存效率。 Blog: String intern字符串+
操作费用很高,您应该使用StringBuilder
代替。
final String aaaString = "aaa".intern();
final String bbbString = "bbb".intern();
final String cccString = "ccc".intern();
final String dddString = "ddd".intern();
final String EOL = "\r\n".intern();
File file = new File(FilePath + getFileName());
try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) {
for (Posuser posuser : totalusers) {
for (potook bk : books) {
if ((posuser.getUpdatedBy() == null)
&& (posuser.getUpdateddateformat() == null)) {
bw.write(aaaString);
bw.write(EOL);
} else if (posuser.getUpdatedBy() == null
&& posuser.getUpdateddateformat() != null) {
bw.write(bbbString);
bw.write(EOL);
} else if (posuser.getUpdatedBy() != null
&& posuser.getUpdateddateformat() == null) {
bw.write(cccString);
bw.write(EOL);
} else {
bw.write(dddString);
bw.write(EOL);
}
}
}
} catch (IOException, AnotherException e) {
logger.error(e.getMessage());
}
答案 2 :(得分:0)
仅使用BufferedWriter是不够的,您需要调整缓冲区大小(第二个构造函数参数)。缓冲区越大,性能就越高。但请记住,如果将缓冲区大小设置为1MB,则需要确保为此代码的每个并发调用保留1MB RAM不是问题。另外,Brian的回答(java.nio包)非常好。将两者结合起来:更改为java.nio并调整缓冲区大小,直到找到用例的幻数。