Почему цикл fileChannel.read никогда не заканчивается? - PullRequest
0 голосов
/ 09 сентября 2018

Я пытаюсь использовать nio для чтения небольшого текста, который содержит всего 5 символов, однако цикл fileChannel.read никогда не заканчивается.

public static void main(String[] args) throws IOException {
        FileChannel fileChannel = FileChannel.open(Paths.get("input.txt"), StandardOpenOption.READ, StandardOpenOption.WRITE);
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        while (fileChannel.read(byteBuffer) != -1) {
            byteBuffer.flip();
            while (byteBuffer.hasRemaining()) {
                char c = (char)byteBuffer.get();
                System.out.println(c);
            }
        }
    }

1 Ответ

0 голосов
/ 09 сентября 2018

Проблема в том, что вы забыли сбросить лимит и позицию буфера после внутреннего цикла while.После того, как вы прочитаете первые 1024 символа, буфер будет заполнен, и каждая попытка чтения в буфер будет пытаться прочитать до remaining = limit - position байтов, то есть 0 байтов после заполнения буфера.

Кроме того, вы всегда должны захватывать возвращаемое значение из fileChannel.read().В вашем случае вам будет сказано, что он непрерывно возвращает 0.

Вызов byteBuffer.clear() после того, как внутренний цикл решит проблему:

public static void main(String[] args) throws IOException {
  FileChannel fileChannel = FileChannel.open(Paths.get("JPPFConfiguration.txt"), StandardOpenOption.READ, StandardOpenOption.WRITE);
  ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
  int n;
  long sum = 0L;
  while ((n = fileChannel.read(byteBuffer)) != -1) {
    sum += n;
    byteBuffer.flip();
    while (byteBuffer.hasRemaining()) {
      char c = (char) byteBuffer.get();
      System.out.print(c);
    }
    System.out.println("\n read " + n  + " bytes");
    byteBuffer.clear();
  }
  System.out.println("read " + sum + " bytes total");
}
...