그래서 Java로 문자열을 추출해야하는 이진 FRX 파일이 있습니다.
나는 그렇게처럼 내 자바 프로그램에 쓴 : 이것은 완벽하게 작동특정 바이트를 이진 파일에서 가장 효율적으로 문자열로 변환하는 방법
FileInputStream ReadFRX = null ;
FileOutputStream TempCapt = null ;
try{
// refNum is hex number on end of VB form property converted to decimal, ex: $"frmResidency.frx":0134
int refNum = Integer.parseInt(line.substring(line.length() - 4, line.length()), 16);
// FRXtemp.txt is created, to temporarily write FRX captions onto to be read from.
PrintWriter writer = new PrintWriter("FRXtemp.txt", "UTF-8");
writer.close();
//opens corresponding FRX file to read into
ReadFRX = new FileInputStream("FRXFiles\\"+curFrmName + ".frx");
//aLittleEndian... must be used to match readInt() little-endianness
LittleEndianDataInputStream ActReadFRX = new LittleEndianDataInputStream(ReadFRX);
TempCapt = new FileOutputStream("FRXtemp.txt");
ActReadFRX.skipBytes(refNum);
int length = ActReadFRX.readInt();
int c;
for (c = 0; c < length; c++) {
// first read byte and check for EOF
TempCapt.write(ActReadFRX.read());
}
}
//If caption is not read properly (ie. possibly wrong bytes), EOF Exception will occur and designer will break
catch (EOFException e){
System.out.println("ERROR : FRX Caption property was mishandled");
break;
}
//Read data from FRXtemp.txt into string
String actCaption = "\"" + new Scanner(new File("FRXtemp.txt")).useDelimiter("\\A").next() + " \" ";
내가보기 엔 불필요한해야합니다 그것의 떨어져 읽을 수 있도록, 그러나 나는 임시 파일에 쓰는 생각합니다.
나는 더 효율적인 방법을 생각할 수없는 이유 : 그러나 나는 해야 만이, 내가 훨씬 더 실용적인 접근 느낌
는 Byte[] Array
사용하고 문자열로 그것을 변환하는 것 문자열이 저장된 바이트 연구에 의하면 이 필요했기 때문에 ReadInt
에서 오프셋을 설정하여 RandomAccessFile
이 little-endian 형식 인 반면 big-endian 형식을 사용한다고 가정했습니다. 나는 분명히 변환 할 수 있지만, 현재의 솔루션은 그 시점에서 실행 가능한 것으로 보인다.
내 질문이이며, 4 바이트 정수에 해당하는 바이트의 특정 부분을 변환 할 수있는 효율적인 방법은 자바에서 문자열로 (리틀 엔디안 형식의 이진 파일에서)이있다?
나는 훨씬 더 간단한 것을 간과해야하는 것처럼 느낍니다. 감사합니다 :)
팁 팁 : 다른 접근 방식의 속도를 비교하려면 [JMH] (http://openjdk.java.net/projects/code-tools/jmh/)를 사용하십시오. –
흥미 롭다. 고맙다. – HavelTheGreat