Перенос данных из ReadableByteChannel в файл - PullRequest
0 голосов
/ 13 мая 2018

Цель: Расшифровать данные из одного источника и записать расшифрованные данные в файл.

try (FileInputStream fis = new FileInputStream(targetPath.toFile());
        ReadableByteChannel channel = newDecryptedByteChannel(path, associatedData))
{
    FileChannel fc = fis.getChannel();
    long position = 0;
    while (position < ???)
    {
        position += fc.transferFrom(channel, position, CHUNK_SIZE);
    }
}

Реализация newDecryptedByteChannel(Path,byte[]) не должна представлять интереса, она просто возвращает ReadableByteChannel.

Проблема: Каково условие для завершения цикла while? Когда достигается «конец байтового канала»? transferFrom правильный выбор здесь?

Этот вопрос может быть связан (ответ - просто установить счетчик на Long.MAX_VALUE). К сожалению, это не помогает мне, потому что в документах сказано, что до количества байтов может быть передано в зависимости от природы и состояния каналов.

Другая мысль состояла в том, чтобы просто проверить, действительно ли количество переданных байтов равно 0 (возвращено из transferFrom), но это условие может быть истинным, если исходный канал не является блокирующим и имеет меньше, чем число байтов, непосредственно доступных в его входной буфер.

1 Ответ

0 голосов
/ 14 мая 2018

Это одна из странных особенностей FileChannel. transferFrom(), которая никогда не говорит вам о завершении потока.Вы должны знать длину ввода независимо.

Я бы просто использовал для этого потоки: в частности, CipherInputStream вокруг BufferedInputStream вокруг FileInputStream и FileOutputStream.

Но код, который вы разместили, в любом случае не имеет никакого смысла.Это не может работать.Вы переходите во входной файл и по каналу, который был получен из FileInputStream, поэтому он доступен только для чтения, поэтому transferFrom() вызовет исключение.

...