Java中的十六进制查看器

问题描述:

我是java编程的初学者,我试图在java中创建十六进制查看器,我的IDE是Netbeans。以下是代码。Java中的十六进制查看器

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import static java.lang.System.out; 
import javax.swing.JFileChooser; 

public class hope { 

     public static void main(String[] args) throws IOException { 

     JFileChooser open = new JFileChooser(); 
     open.showOpenDialog(null); 
     File f = open.getSelectedFile(); 
     InputStream is = new FileInputStream(f); 

     int bytesCounter = 0; 
     int value = 0; 
     StringBuilder sbHex = new StringBuilder(); 
     StringBuilder sbResult = new StringBuilder(); 

     while ((value = is.read()) != -1) { 
      //convert to hex value with "X" formatter 
      sbHex.append(String.format("%02X ", value)); 

      //if 16 bytes are read, reset the counter, 
      //clear the StringBuilder for formatting purpose only. 
      if (bytesCounter == 15) { 
       sbResult.append(sbHex).append("\n"); 
       sbHex.setLength(0); 
       bytesCounter = 0; 
      } else { 
       bytesCounter++; 
      } 
     } 

     //if still got content 
     if (bytesCounter != 0) { 
      //add spaces more formatting purpose only 
      for (; bytesCounter < 16; bytesCounter++) { 
       //1 character 3 spaces 
       sbHex.append(" "); 
      } 
      sbResult.append(sbHex).append("\n"); 
     } 

     out.print(sbResult); 
     is.close(); 
    } 
} 

的问题是: 1.它不读取速度不够快的文件,“这需要一分钟阅读200KB的文件” 2.它提供了“内存不足”时,我尝试了错误大文件例如80mb

我想要它做什么: 1.以秒为单位显示所有的十六进制代码“读取并显示任意大小的文件的十六进制” 2.读取任何大小的文件,没有错误代码。

问题:

什么我需要改变或在我的代码添加到实现上述“我想要它做”?

+0

看看这个[示例](http://www.gubatron.com/blog/2009/04/20/how-to-让-A-快速脏hexviewer更新的/)。 – DevilsHnd

+0

谢谢@DevilsHnd,我检查了一下,但代码是自2009年以来创建的,我认为有很多改进要做,并且出于什么原因我无法实现它,请记住我是新手。没有评论的Java代码使我很难理解和编辑。 –

+0

为什么不使用'out.print()',而不是'sbHex.append()'和'sbResult.append()'?也许使用StringBuilder是不必要的? – gregn3

对于这个简单的例子,关键是使用“缓冲”输入流。 更改此行的代码:

InputStream is = new FileInputStream(f); 

到:

InputStream is = new BufferedInputStream(new FileInputStream(f)); 

你会得到一个更好的结果。 (但为了解决内存不足的错误,你必须考虑一种不同的方法,因为目前你正在将所有数据“缓存”到一个字符串中,这将会占用你所有的内存。也许每个字符串打印/清除字符串生成器时间计数器达到15或更高?您可以尝试让我们知道。:)

+0

谢谢@YK S,我按照你的建议做了,但仍然没有任何改进。记得我是新手。 –

+0

所以我做了一个使用你的代码和一个文件(约12M)的快速测试,得到了在while循环之前/之后打印的时间戳,这里是结果: 之前(使用InputStream):59sec之后(使用BufferedInputStream):13秒。 (对不起,我只是要问:你做了改变后是否重新编译了你的源代码?有时IDE不会为你做) –

+0

谢谢@YKS,我重新启动了IDE并得到了与你一样的结果。请检查这个链接,十六进制编辑器是在Java中创建的,并读取一个文件高达9艾字节(http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.github。javadev%22%20AND%20a%3A%22hexeditor%22)我只是想能够查看它,我不想编辑十六进制。那么,开发人员如何在没有内存泄漏的情况下打开这种大小的文件,并且它如何快速打开?你可以指给我一些他用来实现它的代码,以便我可以自己使用它。我知道我在问很多,请帮助我。再次感谢你。 –