【发布时间】:2011-02-22 11:09:27
【问题描述】:
我想将文件读入 Java 中的字符串,一次 x 个字符。然后我会用字符串做一些事情,并想从我离开的地方继续。我该怎么做?
编辑:
目标文件是一个简单的文本文件。
【问题讨论】:
我想将文件读入 Java 中的字符串,一次 x 个字符。然后我会用字符串做一些事情,并想从我离开的地方继续。我该怎么做?
编辑:
目标文件是一个简单的文本文件。
【问题讨论】:
嗯,首先你需要区分 bytes 和 characters。您可以一次从InputStream 读取一定数量的字节(作为最大数量;不能保证您将获得您要求的所有字节)并且您可以从Reader 读取一个数字一次字符数(同样,最多)。
听起来您可能想在InputStream 周围使用InputStreamReader,指定适当的字符编码,然后从InputStreamReader 中读取。如果你必须有一个 exact 个字符,你需要循环 - 例如:
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);
}
【讨论】:
您是否尝试过使用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, 关闭, 国际化) 抛出 IOException
该方法实现了Reader类对应的read方法的通用约定。作为额外的便利,它尝试通过重复调用底层流的读取方法来读取尽可能多的字符。 此迭代读取将继续进行,直到满足以下条件之一:
- 已读取指定数量的字符,
- 底层流的read方法返回-1,表示文件结束,或者
- 底层流的ready方法返回false,表示进一步的输入请求会阻塞。
如果对底层流的第一次读取返回 -1 以指示文件结束,则此方法返回 -1。否则,此方法返回实际读取的字符数。
最后一点很重要,因为这意味着可以阻塞的流返回的字符可能比预期的要少。虽然从本地文件读取时,读取器或流应该始终有可供读取的字节。
【讨论】: