【问题标题】:Hex Viewer in JavaJava中的十六进制查看器
【发布时间】: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()方法在文件中设置读取位置...

标签: java binary hex readfile


【解决方案1】:

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

InputStream is = new FileInputStream(f);

到:

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

你会得到更好的结果。

(但是要修复内存不足错误,您必须考虑一种不同的方法,因为目前您正在将所有数据“缓存”到一个字符串中,这将占用您所有的内存。也许每次都打印/清除字符串生成器计数器达到 15 或更高?您可以尝试告诉我们。:)

【讨论】:

  • 谢谢@YK S,我按照你的建议做了,但仍然没有任何改善。记住我是新手。
  • 所以我使用您的代码和一个文件(大约 12M)进行了快速测试,在 while 循环之前/之后打印了时间戳,结果如下:之前(使用 InputStream):59 秒之后(使用 BufferedInputStream):13 秒。 (对不起,我只想问一下:您在进行更改后是否重新编译了源代码?有时 IDE 不会为您执行此操作)
  • 感谢@YKS,我重新启动了 IDE 并得到了和你一样的结果。请查看此链接,十六进制编辑器是在 java 中创建的,并且可以读取高达 9 艾字节的文件。(search.maven.org/…) 我只想能够查看它,我不想编辑十六进制。那么,开发人员如何在不发生内存泄漏的情况下打开该大小的文件,以及如何快速打开呢?你能指出他在实现它时使用的部分代码,以便我可以自己使用它。我知道我问了很多,请帮帮我。再次感谢您。
  • 如果你在一个循环中逐字节读取整个文件,你无法避免内存问题。请尝试gregn3提到的方法,我认为这是一个很好的方法。
猜你喜欢
  • 2010-10-17
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 2020-02-09
  • 2013-01-15
  • 1970-01-01
相关资源
最近更新 更多