Как получить последние 'n' байтов файла.exe в java?

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

BufferInputStream.read(byteArray, 8170, 22);

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

3 ответа

Решение

Я не пробовал это, но я полагаю, вы могли бы использовать 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);

Сначала вам нужно создать 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();
}

Пример кода, который дает исключение java.io.IOException: Поток закрыт

    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);
Другие вопросы по тегам