【发布时间】:2012-07-29 05:00:45
【问题描述】:
我正在读取一个文件以供稍后解析。该文件的大小不可能超过 MB,因此在现阶段这对我来说可能不是一个关键问题。但出于最佳实践的原因,我想知道何时是执行手术的最佳时间。
例子:
使用我从http://www.dzone.com/snippets/java-read-file-string 粘贴的方法,我正在将缓冲区读入字符串。我现在想删除所有空格。我的方法目前是这样的:
private String listRaw;
public boolean readList(String filePath) throws java.io.IOException {
StringBuffer fileData = new StringBuffer(1024);
BufferedReader reader = new BufferedReader(
new FileReader(filePath));
char[] buf = new char[1024];
int numRead=0;
while((numRead=reader.read(buf)) != -1){
String readData = String.valueOf(buf, 0, numRead);
fileData.append(readData);
buf = new char[1024];
}
reader.close();
listRaw = fileData.toString().replaceAll("\\s","");
return true;
}
因此,我将字符串中的所有空格(完整地存储到类变量)中删除。
对我来说,这意味着更少的处理,但更多的内存使用。出于最佳实践原因,我将readData 变量附加到fileData 上时应用replaceAll() 操作会更好吗?使用更多处理,但避免传递多余的空白。
我想这对于像我正在处理的文件这样的小文件影响不大,但如果它是一个 200MB 的日志文件呢?
这完全取决于具体情况,还是有一个我最好遵循的共识?
感谢大家的意见。我相信您帮助我将思维定在了编写 Java 的正确方向。
我已更新我的代码以考虑提出的要点。包括 Don Roby 的建议,即在某些时候,我可能想保留空格。希望现在情况变得更好!
private String listRaw;
public boolean readList(String filePath) throws java.io.IOException {
StringBuilder fileData = new StringBuilder(51200);
BufferedReader reader = new BufferedReader(new FileReader(filePath));
char[] buf = new char[51200];
boolean spaced = false;
while(reader.read(buf) != -1){
for(int i=0;i<buf.length;i++) {
char c = buf[i];
if (c != '\t' && c != '\r' && c != '\n') {
if (c == ' ') {
if (spaced) {
continue;
}
spaced = true;
} else {
spaced = false;
}
fileData.append(c);
}
}
}
reader.close();
listRaw = fileData.toString().trim();
return true;
}
【问题讨论】:
-
测量并找出答案!这样您就知道哪个实际上更快,而不是某人认为应该更快。
-
好点!作为一个 Java 新手——目前还没有任何专门的 Java 教科书——我意识到从坏习惯开始。虽然我确信到一天结束时我会有很多。
标签: java performance optimization