2015-01-26 3 views
0

Я создал простую программу Java для чтения данных из файлов свойств FRX. Однако проблема, с которой я столкнулась, заключается в том, что мне нужно только прочитать определенную часть двоичного файла из файла. В частности, мне нужно начать чтение из файла со значением, соответствующим заданному шестнадцатеричному значению, и завершить чтение, где символы ASCII останавливаются для данной строки текста.Чтение определенных частей двоичного файла в Java

я был способен сделать это в 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 для достижения этой цели ...

ответ

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. Я только закрываю потоки ввода/вывода файлов, так как они должны быть теми, которые поддерживают файлы. Конечно, вы могли бы закрыть другие потоки, чтобы быть в безопасности.

+0

Должен ли я удалять 'try', поскольку он не использует' catch' или 'finally'? Кроме того, я думаю, что у вас есть несколько ошибок в коде. Однако я пытаюсь реализовать свою логику. – HavelTheGreat

+0

Нет, ошибок нет. Скобки являются частью try-with-resources. Дайте мне знать, если вы используете Java 6, и я перепишу пример. –

+0

Да, да, извините, я использую Java 6, не обратил на это внимания. – HavelTheGreat

0

Используйте din.skipBytes (pos), чтобы перейти к требуемому смещению на вашем входе.

+0

См. Мой вопрос. – HavelTheGreat

+0

Вы ничего не читаете в своем for-loop. Вы пропустили вызов функции din.readByte() или другой функции чтения. –

Смежные вопросы