Я создал простую программу 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 для достижения этой цели ...
Должен ли я удалять 'try', поскольку он не использует' catch' или 'finally'? Кроме того, я думаю, что у вас есть несколько ошибок в коде. Однако я пытаюсь реализовать свою логику. – HavelTheGreat
Нет, ошибок нет. Скобки являются частью try-with-resources. Дайте мне знать, если вы используете Java 6, и я перепишу пример. –
Да, да, извините, я использую Java 6, не обратил на это внимания. – HavelTheGreat