Чтение строки длиной n из InputStream или Reader - PullRequest
0 голосов
/ 28 июня 2018

Я знаю, что могу это сделать. Но я также хочу знать, есть ли короткий способ сделать это? Например: почему не существует метода, который имеет public String readString(int len); прототип в Reader иерархии классов, чтобы делать то, что я хочу, только с одним кодом в этом вопросе?

InputStream in = new FileInputStream("abc.txt");
InputStreamReader inReader = new InputStreamReader(in);
char[] foo = new char[5];
inReader.read(foo);
System.out.println(new String(foo));

// I think this way is too long
// for reading a string that has only 5 character
// from InputStream or Reader

В языке программирования Python 3 я могу сделать это очень легко для UTF-8 и других файлов. Рассмотрим следующий код.

fl = open("abc.txt", mode="r", encoding="utf-8")
fl.read(1) # returns string that has 1 character
fl.read(3) # returns string that has 3 character

Как мне поставить точку на Java?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Если вы хотите сделать все возможное, чтобы прочитать указанное количество символов, вы можете использовать

int len = 4;
String result;
try(Reader r = new FileReader("abc.txt")) {
    CharBuffer b = CharBuffer.allocate(len);
    do {} while(b.hasRemaining() && r.read(b) > 0);
    result = b.flip().toString();
}
System.out.println(result);

Хотя Reader может читать меньше, чем указанные символы (в зависимости от базового потока), перед возвратом или возвращением -1 он будет читать по крайней мере один символ, чтобы сигнализировать об окончании потока. Таким образом, приведенный выше код будет зацикливаться до тех пор, пока либо не прочитает запрошенное количество символов, либо не достигнет конца потока.

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

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

Как я могу сделать это на Java?

То, как вы уже это делаете.

Я бы порекомендовал сделать это с помощью метода многократного использования, например,

final class IOUtil {
    public static String read(Reader in, int len) throws IOException {
        char[] buf = new char[len];
        int charsRead = in.read(buf);
        return (charsRead == -1 ? null : new String(buf, 0, charsRead));
    }
}

Тогда используйте это так:

try (Reader in = Files.newBufferedReader(Paths.get("abc.txt"), StandardCharsets.UTF_8)) {
    System.out.println(IOUtil.read(in, 5));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...