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.读取任何大小的文件,没有错误代码。
问题:
什么我需要改变或在我的代码添加到实现上述“我想要它做”?
对于这个简单的例子,关键是使用“缓冲”输入流。 更改此行的代码:
InputStream is = new FileInputStream(f);
到:
InputStream is = new BufferedInputStream(new FileInputStream(f));
你会得到一个更好的结果。 (但为了解决内存不足的错误,你必须考虑一种不同的方法,因为目前你正在将所有数据“缓存”到一个字符串中,这将会占用你所有的内存。也许每个字符串打印/清除字符串生成器时间计数器达到15或更高?您可以尝试让我们知道。:)
谢谢@YK S,我按照你的建议做了,但仍然没有任何改进。记得我是新手。 –
所以我做了一个使用你的代码和一个文件(约12M)的快速测试,得到了在while循环之前/之后打印的时间戳,这里是结果: 之前(使用InputStream):59sec之后(使用BufferedInputStream):13秒。 (对不起,我只是要问:你做了改变后是否重新编译了你的源代码?有时IDE不会为你做) –
谢谢@YKS,我重新启动了IDE并得到了与你一样的结果。请检查这个链接,十六进制编辑器是在Java中创建的,并读取一个文件高达9艾字节(http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22com.github。javadev%22%20AND%20a%3A%22hexeditor%22)我只是想能够查看它,我不想编辑十六进制。那么,开发人员如何在没有内存泄漏的情况下打开这种大小的文件,并且它如何快速打开?你可以指给我一些他用来实现它的代码,以便我可以自己使用它。我知道我在问很多,请帮助我。再次感谢你。 –
看看这个[示例](http://www.gubatron.com/blog/2009/04/20/how-to-让-A-快速脏hexviewer更新的/)。 – DevilsHnd
谢谢@DevilsHnd,我检查了一下,但代码是自2009年以来创建的,我认为有很多改进要做,并且出于什么原因我无法实现它,请记住我是新手。没有评论的Java代码使我很难理解和编辑。 –
为什么不使用'out.print()',而不是'sbHex.append()'和'sbResult.append()'?也许使用StringBuilder是不必要的? – gregn3