我需要读取ascii中的文件并在应用某些函数之前将其转换为十六进制(搜索特定的字符)
为此,我读取一个文件,将其转换为十六进制并写入一个新文件。然后我打开我的新hex文件并应用我的函数。
我的问题是它花了太多时间来阅读和转换它(对于9Mb文件大约需要8秒)
我的阅读方法是:
public static void convertToHex2(PrintStream out, File file) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
int value = 0;
StringBuilder sbHex = new StringBuilder();
StringBuilder sbResult = new StringBuilder();
while ((value = bis.read()) != -1) {
sbHex.append(String.format("%02X ", value));
}
sbResult.append(sbHex);
out.print(sbResult);
bis.close();
}
你有什么建议让它更快吗?
答案 0 :(得分:0)
您是否衡量了实际的瓶颈?因为您似乎每次都在循环中读取非常少量的数据并进行处理。您也可以阅读更大的数据块并处理这些数据,例如:使用DataInputStream或其他什么。这样,您可以从对操作系统,文件系统,缓存等的优化读取中获益更多。
此外,你填写sbHex并将其附加到sbResult,以便在某处打印。对我来说看起来像是一个不必要的副本,因为在你的情况下sbResult总是空的,而对于你的PrintStream你已经有了一个StringBuilder的sbHex。
答案 1 :(得分:0)
试试这个:
static String[] xx = new String[256];
static {
for( int i = 0; i < 256; ++i ){
xx[i] = String.format("%02X ", i);
}
}
并使用它:
sbHex.append(xx[value]);
格式化是一项繁重的操作:它不仅仅是转换 - 它还必须查看格式字符串。