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

哈维尔大帝

我建立了一个简单的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()或不skipBytes正确:

  import java.io.*;
  import java.util.*;

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

        FileInputStream in = null;
        FileOutputStream out = null;
        DataInputStream din = null;
        DataOutputStream dout = null;

        try {
            in = new FileInputStream("frmResidency.frx");
            din = new DataInputStream(in);
            out = new FileOutputStream("disisworkinlikeacharm.txt");
            dout = new DataOutputStream(out);
            din.skipBytes(10);
            int length = din.readInt();
            int c;

            for(c = 0 ; c < length; c++){
                out.write(c);
            }
        } finally {
            if (in != null) {
                in.close();
            }
            if (out != null) {
                out.close();
            }
            if (dout != null) {
                dout.close();
            }
            if (din != null) {
                din.close();
            }
        }
    }
}

我的问题是,是否有一种简单的方法可以实现在我的代码中查找特定的十六进制位置并读取二进制文件的长度,还是我应该使用类似RandomAccessFile的方法来实现此目的?

阿里安·托尼塔(Aaryn Tonita)

好吧,我看到一个问题:您正在编写for循环的索引变量,而不是文件中的下一个字节。您至少应该将out.write(c)切换到out.write(din。)。您是否希望写入接下来的10个整数或接下来的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的。我仅关闭文件输入/输出流,因为它们应该是维护文件句柄的流。当然,您可以关闭其他流以确保安全。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章