Java中的Hex Viewer

时间:2017-10-15 04:19:34

标签: java binary hex readfile

我是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.当我尝试一个大文件时出现“Out of Memory”错误,例如80MB

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

问题:

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

1 个答案:

答案 0 :(得分:1)

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

InputStream is = new FileInputStream(f);

为:

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

你会得到更好的结果。

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