Установить ограничение на символы, читаемые из Reader - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь реализовать многопоточное средство чтения файлов, где в каждом потоке читается кусок байта из одного и того же файла.Я инициализирую Reader в каждом потоке и skip соответственно, но мой Reader используется другой библиотекой (CsvMapReader), и я хотел бы, чтобы поток читал только chunk байтов.Как сделать так, чтобы объект Reader, который я передаю CsvMapReader, мог читать только chunk байтов, а не до EOF.

Пример:

Thread reader = new Thread(() -> {
  BufferedReader br = new BufferedReader("large_file");
  br.skip(chunkSize);
  CsvMapReader leftFileReader = new CsvMapReader(br, filePreference);
  while (csvMapReader.read() != null) { /* This loop should only iterate until chunksize bytes are processed, and no more */
    // do something
  }
})
reader.start();

Предположим,У меня есть несколько потоков, каждый из которых пропускает несколько кратных chunkSize.По сути, я хотел бы выполнять цикл только до тех пор, пока не будет обработано chunkSize байт.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Был в состоянии решить эту проблему путем создания новых InputStream для каждого потока, поскольку создание только BufferedReader влияло на все потоки, поскольку они совместно используют один и тот же указатель файла.

Thread reader = new Thread(() -> {
  InputStream is = new InputStream("large_file")
  BufferedReader br = new BufferedReader(is);
  is.skip(chunkSize);
  CsvMapReader leftFileReader = new CsvMapReader(br, filePreference);
  while (csvMapReader.read() != null) { /* This loop should only iterate until chunksize bytes are processed, and no more */
    // do something
  }
})
reader.start();
0 голосов
/ 17 октября 2018

Вы можете попробовать что-то вроде кода ниже.У вас может быть переменная-счетчик, чтобы считать символы только для чтения и чтения до достижения chunkSize.Кроме того, я предполагаю, что ваш chunkSize имеет размер символа, так как вы используете Reader, а не inputStream.

    Thread reader = new Thread(() -> {
       BufferedReader br = new BufferedReader("large_file");
         br.skip(chunkSize);
          CsvMapReader leftFileReader =
                 new CsvMapReader(br, filePreference);
            int chunkSizeCounter=0;
            while (csvMapReader.read() != null && 
                        chunkSizeCounter< chunkSize ) {
                         // do something
                      chunkSizeCounter++;
             }
          })
         reader.start();

Вы также можете читать определенные строки в потоке вместо чтения определенных байтов или символов в потоке.Когда вы читаете строки, вы делаете меньшие проверки размера, и это может быть немного быстрее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...