我正在尝试制作文件十六进制转换器(输入文件->输出文件的十六进制字符串)
我想出的代码是
static String open2(String path) throws FileNotFoundException, IOException,OutOfMemoryError {
System.out.println("BEGIN LOADING FILE");
StringBuilder sb = new StringBuilder();
//sb.ensureCapacity(2147483648);
int size = 262144;
FileInputStream f = new FileInputStream(path);
FileChannel ch = f.getChannel( );
byte[] barray = new byte[size];
ByteBuffer bb = ByteBuffer.wrap( barray );
while (ch.read(bb) != -1)
{
//System.out.println(sb.capacity());
sb.append(bytesToHex(barray));
bb.clear();
}
System.out.println("FILE LOADED; BRING IT BACK");
return sb.toString();
}
我确信“路径”是一个有效的文件名。问题在于大文件 (>= 500mb),编译器在 StringBuilder.append 上输出 OutOfMemoryError: Java Heap Space。
为了创建此代码,我遵循了http://nadeausoftware.com/articles/2008/02/java_tip_how_read_files_quickly中的一些提示中的一些提示,但是当我尝试为 StringBuilder sb 强制分配空间时我有疑问:“2147483648 对于 int 来说太大了”。
如果我想在非常大的文件中使用此代码(如果我真的不得不停在某个地方,假设最多 2gb)在速度方面输出文件的十六进制字符串转换的更好方法是什么?
我现在正在将转换后的字符串复制到文件中。无论如何,在原始文件的 eof 之后,我遇到了“在文件上写入空缓冲区”的问题。
static String open3(String path) throws FileNotFoundException, IOException {
System.out.println("BEGIN LOADING FILE (Hope this is the last change)");
FileWriter fos = new FileWriter("HEXTMP");
int size = 262144;
FileInputStream f = new FileInputStream(path);
FileChannel ch = f.getChannel( );
byte[] barray = new byte[size];
ByteBuffer bb = ByteBuffer.wrap( barray );
while (ch.read(bb) != -1)
{
fos.write(bytesToHex(barray));
bb.clear();
}
System.out.println("FILE LOADED; BRING IT BACK");
return "HEXTMP";
}
显然,创建的文件 HEXTMP 的大小倍数为 256k,但如果文件为 257k,它将是一个 512 文件,最后 LOT 为“000000”。我知道我只需要创建一个切割长度的最后一个字节数组。
(我使用了文件写入器,因为我想写入十六进制字符串;否则它只会按原样复制文件)