Пропуск Java OutputStream (смещение) - PullRequest
8 голосов
/ 05 марта 2012

Я пытаюсь написать функцию, которая принимает параметры объекта File, offset и байтового массива и записывает этот байтовый массив в объект File в Java.

Таким образом, функция будет выглядеть как

public void write(File file, long offset, byte[] data)

Но проблема в том, что параметр смещения имеет тип long, поэтому я не могу использовать функцию write () для OutputStream, которая принимает целое число в качестве смещения.

В отличие от InputStream, в котором есть skip (long)Похоже, у OutputStream нет способа пропустить первые байты файла.

Есть ли хороший способ решить эту проблему?

Спасибо.

Ответы [ 3 ]

13 голосов
/ 05 марта 2012
try {
   FileOutputStream out = new FileOutputStream(file);
   try {
       FileChannel ch = out.getChannel();
       ch.position(offset);
       ch.write(ByteBuffer.wrap(data));
   } finally {
       out.close();
   } 
} catch (IOException ex) {
    // handle error
}
4 голосов
/ 05 марта 2012

Это связано с семантикой потоков. При входном потоке вы просто говорите, что отбрасываете первые n байтов данных. Однако с OutputStream что-то должно быть записано в поток. Вы не можете просто спросить, что поток делает вид, что было записано n байтов данных, но не записать их. Причина этого в том, что не все потоки будут доступны для поиска. Данные, поступающие по сети, недоступны для поиска - вы получаете данные один раз и только один раз. Однако с файлами это не так, потому что они хранятся на жестком диске, и легко найти любую позицию на жестком диске.

Решение: используйте FileChannels или RandomAccessFile insteead.

1 голос
/ 08 февраля 2016

Если вы хотите записать в конец файла, используйте режим добавления (FileOutputStream (имя строки, логическое добавление)).По моему скромному мнению, в FileOutputStream должен быть метод пропуска, но на данный момент, если вы хотите переместиться в определенное место в файле для записи, вам придется использовать FileChannel с возможностью поиска или RandomAccessFile (как это было раньше).упомянутые другими). ​​

...