Как я могу прочитать файл х байтов за раз?в Яве - PullRequest
0 голосов
/ 22 февраля 2011

Я хочу прочитать файл в строку в Java, x символов за раз.Тогда я сделаю что-нибудь со строкой и хочу продолжить с того места, где я остановился.Как мне это сделать?

edit:

Целевой файл - это простой текстовый файл.

Ответы [ 2 ]

7 голосов
/ 22 февраля 2011

Ну, во-первых, вам нужно различать байтов и символов .Вы можете читать с InputStream определенного количества байтов за раз (как максимальное число; нет гарантии, что вам дадут все запрашиваемые байты), и вы можете прочитать с Reader числасимволов за раз (опять же, как максимум).

Звучит так, как будто вы вероятно хотите использовать InputStreamReader вокруг InputStream, указав соответствующую кодировку символов, изатем прочитайте из InputStreamReader.Если вам нужно точное количество символов, вам нужно будет выполнить цикл - например:

public static String readExactly(Reader reader, int length) throws IOException {
    char[] chars = new char[length];
    int offset = 0;
    while (offset < length) {
        int charsRead = reader.read(chars, offset, length - offset);
        if (charsRead <= 0) {
            throw new IOException("Stream terminated early");
        }
        offset += charsRead;
    }
    return new String(chars);
}
0 голосов
/ 22 февраля 2011

Вы пытались использовать BufferedReader ? Он определяет read(char[], int, int), который делает в точности то, что вы хотите. То есть он рекурсивно вызывает read в попытке заполнить буфер.

Пример использования:

char[] chars = new char[length];
reader.read(chars,0,length);
String str = String.valueOf(chars);

Документация:

public int read (char [] cbuf, Int off, инт лен) выдает IOException

Этот метод реализует общий контракт соответствующего метода чтения класса Reader. В качестве дополнительного удобства он пытается прочитать как можно больше символов, многократно вызывая метод read базового потока. Это повторное чтение продолжается до тех пор, пока не выполнится одно из следующих условий:

  • Указанное количество символов было прочитано,
  • Метод чтения базового потока возвращает -1, указывая конец файла, или
  • Метод ready базового потока возвращает false, указывая, что дальнейшие входные запросы будут блокироваться.

Если первое чтение в основном потоке возвращает -1, чтобы указать конец файла, тогда этот метод возвращает -1. В противном случае этот метод возвращает количество фактически прочитанных символов.

Последний пункт важен, поскольку он означает, что потоки, которые могут блокировать, могут возвращать меньше символов, чем ожидалось. Хотя при чтении из локального файла у читателя или потока всегда должны быть доступны байты для чтения.

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