【发布时间】:2018-03-26 20:56:22
【问题描述】:
我是 Java 编程的初学者,我正在尝试在 Java 中创建一个十六进制查看器,我的 IDE 是 Netbeans。下面是代码。
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. 读取任意大小的文件,无错误码。
问题:
为了实现上述“我想要它做什么”,我需要更改或添加什么代码?
【问题讨论】:
-
看看这个example。
-
谢谢@DevilsHnd,我检查了一下,但代码是自 2009 年以来创建的,我认为还有很多改进要做,为什么我不能让它工作,记得我是新手。没有 cmets 的 Java 代码让我很难理解和编辑。
-
为什么不只使用
out.print ()而不是sbHex.append ()和sbResult.append ()?也许不需要使用 StringBuilder ? -
@gregn3 好吧,我编辑了代码,并删除了所有不必要的代码,但仍然没有。尝试加载大文件时出现相同的速度和内存问题。 查看此链接,Hex 编辑器是用 java 创建的,可读取最大 9 EB 的文件。 (search.maven.org/…)。我只想能够查看它,我不想编辑十六进制。那么,开发人员如何在不发生内存泄漏的情况下打开该大小的文件?如何快速打开?
-
@KingAmada 我在 5.5 MB 文件上尝试了您的原始示例。阅读内容大约需要 20 秒,打印内容大约需要 20 秒。我认为其他应用程序不会读取整个文件,一次只能读取一小部分。 (我猜它会显示在屏幕上)。您可以尝试RandomAccessFile 以小块读取/写入文件。使用
seek()方法在文件中设置读取位置...