用Java读取二进制文件的特定部分

时间:2015-01-26 14:27:15

标签: java c# binary-data fileinputstream datainputstream

我构建了一个简单的Java程序来从FRX属性文件中读取数据。然而,我遇到的问题是,我需要只能从文件中读取二进制文件的某个部分。更具体地说,我需要从对应于给定十六进制值的值开始读取文件,并结束读取ASCII字符停止给定文本字符串的位置。

我能够使用以下程序在C#中执行此操作:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

    public class GetFromFRX
    {
        public static void Main()
        {
            StringBuilder buffer = new StringBuilder();
            using (BinaryReader b = new BinaryReader(File.Open("frmResidency.frx", FileMode.Open)))
            {
                try
                {
                    b.BaseStream.Seek(641, SeekOrigin.Begin);
                    int length = b.ReadInt32();

                    for (int i = 0; i < length; i++)
                    {
                        buffer.Append(b.ReadChar());
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine( "Error obtaining resource\n" + e.Message);
                }

            }
            Console.WriteLine(buffer);
        }
    }

这是我的Java程序,我相信我可以使用DataInputStream来完成我需要的工作,但是我不确定如何使用它的方法来寻找一个十六进制位置来开始读取字节并设置长度合适。如果我运行当前代码,我的新文本文件中没有写入输出,我希望输出超过前10个字节,所以我想我不理解ReadInt()或{{ 1}}正确:

skipBytes

我的问题是,是否有一种简单的方法可以实现寻找某个十六进制位置并在我的代码中读取二进制长度,或者我应该使用 RandomAccessFile 完成这个......

2 个答案:

答案 0 :(得分:1)

我看到一个问题:您正在编写for循环的索引变量而不是文件中的下一个字节。你应该至少切换out.write(c)到out.write(din。)。你期望写下十个整数或接下来的10个字节吗?假设您要编写接下来的十个字节,以下内容适用于我:

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test {

    public static void main(String[] args) throws IOException {

        FileInputStream in = null;
        FileOutputStream out = null;
        try {
            in = new FileInputStream("c:\\tmp\\test.txt");
            DataInputStream din = new DataInputStream(in);
            out = new FileOutputStream("c:\\tmp\\test.out");
            DataOutputStream dout = new DataOutputStream(out);

            din.skipBytes(10);
            int length = din.readInt();
            System.out.println(length);
            int c;

            for (c = 0; c < length; c++) {
                // TODO: first read byte and check for EOF
                out.write(din.read());
            }
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
        }
    }
}

如果可以使用Java 7,那么使用try-with-resources循环的代码要少得多。此代码适用于Java 6.我只关闭文件输入/输出流,因为它们应该是维护文件句柄的那些。当然,您可以将其他流关闭以保证安全。

答案 1 :(得分:0)

使用din.skipBytes(pos)移动到输入中所需的偏移量。