2015-11-25 3 views
2

Мне нужно получить последние 22 байта как конец центрального каталога в самораспаковывающемся файле .exe в java (нет командной строки, никаких терминальных решений, пожалуйста). Я попытался прочитать содержимое .exe файла с помощью bufferInputStream и получил успешно, но при попытке получить последние 22 байта с помощьюКак получить последние 'n' байты .exe-файла в java?

BufferInputStream.read(byteArray, 8170, 22); 

Java поднимает исключение говорят, что это закрытая stream.Any помощь в связи с этим была бы оценена. Благодарю.

+0

Пожалуйста, пост код и StackTrace – Rehman

ответ

5

Я не пробовал это, но я полагаю, вы могли бы использовать MappedByteBuffer прочитать только последние 22 байта.

File file = new File("/path/to/my/file.bin"); 

long size = file.length(); 
FileChannel channel = FileChannel.open(file.toPath(), StandardOpenOption.READ); 
MappedByteBuffer buffer = channel.map(MapMode.READ_ONLY, size-22, 22); 

Затем просто очистите буфер от массива и все.

byte[] payload = new byte[22]; 
buffer.get(payload); 
+1

Спасибо человеку. Вы сделали мой день легким. – user2771151

0

Сначала вам нужно создать FileInputStream из файла.

File exeFile = new File("path/to/your/exe"); 
long size = exeFile.length(); 
int readSize = 22; 
try { 
    FileInputStream stream = new FileInputStream(exeFile); 
    stream.skip(size - readSize); 
    byte[] buffer = new byte[readSize]; 
    if(stream.read(buffer) > 0) { 
     // process your data 
    } 
    else { 
     // Some errors 
    } 
    stream.close(); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
+0

'stream.read (буферную)> 0 ' является неправильным тестом в этом контексте. –

0

пример кода, который дает java.io.IOException: поток Closed Вы должны проверить InputStream перед тем

InputStream fis = new FileInputStream("c:/myfile.exe"); 
    fis.close(); // only for demonstrating 

    // correct but useless 
    BufferedInputStream bis = new BufferedInputStream(fis);   

    byte x[]=new byte[100]; 

    // EXCEPTION: HERE: if fis closed 
    bis.read(x,10,10); 

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

  • Нет связанных вопросов^_^