使用Java向后读取二进制文件

时间:2011-01-30 04:28:16

标签: java binary reverse

我正在阅读二进制文件,通常使用:

//What I use to read in the file normally
int hexIn;
for(int i = 0; (hexIn = in.read()) != -1; i++){
}

我需要做的是向后阅读文件我尝试了一些......但它不起作用!我看了很多帮助页面,但找不到任何东西,希望你能帮助我。

//How im trying to read in the file backwards
for(long i = 0, j = length - 1;  i < length; i++, j--){
int hexIn = 0;
hexIn = in.read();
}

只是抱怨我正在读取二进制文件并使用

将其转换为十六进制
//This makes sure it does not miss and 0 on the end
String s = Integer.toHexString(hexIn);
if(s.length() < 2){
s = "0" + Integer.toHexString(hexIn);
}

假设正常读取的十六进制是

10 11 12 13 14 15 

如果正在向后阅读,则会在

中读取
51 41 31 21 11 01

我需要在

中阅读
15 14 13 12 11 10

有没有人有想法?因为我全都不在他们之中,甚至连我可靠的Java书都知道了!

5 个答案:

答案 0 :(得分:3)

您根本不想“读取”该文件。你想要做的是使用文件顶部覆盖的FileChannel和MappedByteBuffer,然后反过来简单地访问字节缓冲区。

这使得主机操作系统可以为您管理磁盘上实际的块读取,而您只需在循环中向后扫描缓冲区。

查看此page了解一些细节。

答案 1 :(得分:2)

您可以使用RandomAccessFile类:

RandomAccessFile file = new RandomAccessFile(new File(fileName), "r");
long index, length;
length = file.length() - 1; 
for (index = length; index >= 0; index--) {
    file.seek(index);
    int s = file.read();
    //..
}
file.close();

这应该有效,但会比InputStream慢得多,因为你不能从块阅读中受益。

答案 2 :(得分:1)

您需要使用RandomAccesFile。然后,您可以指定要读取的确切字节。

它不会非常高效,但它允许您读取任何大小的文件。

取决于您使用哪种解决方案的确切要求。

答案 3 :(得分:0)

如何尝试以下内容..注意:这绝对不是那么有效,但我相信会有效。

  1. 首先将整个输入流读入ByteArray http://www.java-tips.org/java-se-tips/java.io/reading-a-file-into-a-byte-array.html

  2. 使用以下代码。

  3. code-example.java

    byte[] theBytesFromTheFile = <bytes_read_in_from_file>
    Array<Byte> bytes = new Array<Byte>();
    for(Byte b : theBytesFromTheFile) {
        bytes.push(b);
    }
    

    现在你可以弹出数组,你将从文件向后按正确的顺序排列每个字节。 (注意:您仍然必须将字节拆分为字节中的各个十六进制字符)

    1. 如果您不想这样做,您也可以查看此网站。此代码将向后读取文件数据。 http://mattfleming.com/node/11

答案 4 :(得分:0)

如果是小二进制文件,请考虑将其读入字节数组。然后,您可以向后或以任何其他顺序执行必要的操作。以下是使用java 7的代码:

pivate byte[] readEntireBinaryFile(String filename) throws IOException {
  Path path = Paths.get(filename);
  return Files.readAllBytes(path);
}