2015-05-29 113 views
-1

我需要阅读的文件是ASCII并将其应用于某些功能之前,转换为十六进制(搜索特定卡拉科特)读取较快文件及将其转换为十六进制

要做到这一点,我读文件,将其转换为十六进制并写入一个新文件。然后我打开我的新的十六进制文件,并应用我的功能。

我的问题是,它使太多的时间来阅读和转换它(大约为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

为什么你必须将转换后的数据写入文件?即使您的搜索功能坚持使用十六进制(如果您在搜索十六进制89ABCD序列中的BC时必然会导致问题),也不一定需要在文件中使用它。 I/O时间是惩罚。 – laune

+0

如果发生I/O异常,您的代码将泄漏资源。 – Raedwald

回答

0

您是否测量过实际的瓶颈?因为您似乎在循环中读取的数据量非常少,并且每次都要处理这些数据。您可能会读取更大的数据块并对其进行处理,例如使用DataInputStream或其他。这样,您将从操作系统,文件系统,缓存等的优化读取中受益更多。

此外,您还可以填充sbHex并将其附加到sbResult,以便在某处进行打印。看起来像是一个不必要的副本给我,因为在你的情况下sbResult将一直是空的,而对于sbHex,你已经有了一个用于PrintStream的StringBuilder。

+0

事实上,我在我的文件中有一个模式,如果我将它转换为十六进制: - 长度为4个字节 - 4个字节的代码(如HELO,GOOD ..) - n个字节的数据(取决于长度) - 4个字节的校验和。例如,我有0042的长度。我的数据将是66个字节。 在这种模式下,例如,如果4字节代码是“HELO”(因此48 45 4c 4f十六进制),我只想获取数据。 – tmylamoule

+0

这不能回答我的任何问题......只是因为您当前只想读取4个字节或可比较的少量字节,所以您不应该向操作系统请求这么少的数据。你应该总是读大块的数据并在内存中处理它们,唯一的问题是如果这些块是例如4 kB,MB或GB ...至少4 kB通常是一个不错的选择,因为对于大多数文件系统来说这是一个常见的扇区大小。没有文件系统只读取正好4个字节或类似的内容。 –

+0

你告诉我我需要一个更大的缓冲区?我会发现如何用bufferedreader来做到这一点。 我的文件与.png相似 – tmylamoule

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]); 

格式是一项繁重的操作:它不只是丁文 - 它也有看格式字符串。