Java NIO2 AsynchronousFileChannel возвращает Future <Integer>без документирования фактических значений - PullRequest
0 голосов
/ 26 июня 2018

Итак, я разработал следующую функцию, основанную на документах и ​​примерах, которые я нашел в Интернете, для записи файлов асинхронным способом:

    public static Future<Integer> createAndWriteToFile(String fullFileName, String content) throws IOException {
        Path file = Utils.createFile(fullFileName);
        AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(file, StandardOpenOption.WRITE, StandardOpenOption.CREATE);

        ByteBuffer buffer = ByteBuffer.wrap(content.getBytes());
        Future<Integer> operation = fileChannel.write(buffer, 0);
        buffer.clear();

        return operation;
}

Однако нет абсолютно никакой документации о том, что ожидать от звонка operation.get().intValue()! В режиме отладки успешное создание / запись файла возвращает целочисленное значение 23. Каковы другие возможные значения? Docs: https://docs.oracle.com/javase/8/docs/api/java/nio/channels/AsynchronousFileChannel.html#write-java.nio.ByteBuffer-long-

И здесь: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html#get--

Возвращает: вычисленный результат

Полезно, его нет.

В качестве дополнительного вопроса - меня удивило, Java считается одним из наиболее хорошо документированных языков, почему эта функция не документирована?

1 Ответ

0 голосов
/ 26 июня 2018

Даже если это прямо не указано для типа return в документах . Если вы внимательно посмотрите на абзац, описанный там:

Этот метод работает так же, как метод AsynchronousByteChannel.write (ByteBuffer) , за исключением того, что байты записываются, начиная с заданной позиции файла. Если заданная позиция больше размера файла, то во время попытки записи файл будет увеличен для размещения новых байтов; значения любых байтов между предыдущим концом файла и вновь записанными байтами не определены.

Так что он говорит, что ведет себя так же, как AsynchronousByteChannel.write(ByteBuffer), который перенаправляет вас на Future<Integer> write(ByteBuffer src). Там указывается, что означает значение Integer, которое в основном равно количеству записанных байтов.

Этот метод инициирует асинхронную операцию записи для записи последовательности байтов в этот канал из заданного буфера. Метод ведет себя точно так же, как и метод write (ByteBuffer, Object, CompletionHandler), за исключением того, что вместо указания обработчика завершения этот метод возвращает Future, представляющий ожидающий результат. Метод get Future возвращает количество записанных байтов.

...