我正在读取一个文件以供稍后解析。该文件的大小不太可能超过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
变量上应用replaceAll()
操作时更好吗,因为我将它追加到fileData
?使用更多的处理,但避免传递多余的空白。
我想这对于一个像我正在工作的小文件几乎没有影响,但如果它是一个200MB的日志文件呢?
这是完全取决于个案还是我有更好的一致意见?
感谢您输入的每个人。我相信你已经帮助我将自己的思维定向为编写Java的正确方向。
我已更新我的代码,以考虑所提出的要点。包括唐罗比的建议,在某些时候,我可能想保留空间。希望事情现在读得更好!
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;
}
测量它并找出!这样你就知道哪个更快,而不是别人认为应该更快。 – 2012-07-28 17:19:43
好点!作为一名Java新手 - 目前没有任何专门的java教科书 - 我意识到从坏习惯开始。虽然我相信在一天结束的时候我会有很多。 – 2012-07-28 17:32:41