我是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.读取任何大小的文件,没有错误代码。
问题:
我需要更改或添加我的代码以实现上述“我想要它做什么”?
答案 0 :(得分:1)
对于这个简单的例子,关键是使用“缓冲”输入流。 更改此行代码:
InputStream is = new FileInputStream(f);
为:
InputStream is = new BufferedInputStream( new FileInputStream(f));
你会得到更好的结果。
(但是为了解决Out of Memory错误,你必须考虑一种不同的方法,因为目前你正在将所有数据“缓存”到一个字符串中,这将占用你所有的内存。也许每次打印/清除字符串生成器柜台达到15或更高?您可以尝试告诉我们。:)