我如何一次读取文件x字节? 在java中
我希望一次将文件读入Java中的字符串,x chars。 然后我会用字符串做一些事情,并希望从我离开的地方继续。 我该怎么办?
编辑:
目标文件是一个简单的文本文件。
那么,首先你需要区分字节和字符 。 您可以一次从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); }
你尝试过使用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,int len)抛出IOException
此方法实现Reader类的相应读取方法的常规协定。 作为额外的便利,它试图通过重复调用底层流的读取方法来读取尽可能多的字符。 此迭代读取将继续,直到满足以下条件之一:
- 已读取指定的字符数,
- 底层流的read方法返回-1,表示文件结束,或
- 底层流的ready方法返回false,表示进一步的输入请求将被阻塞。
如果对基础流的第一次读取返回-1以指示文件结束,则此方法返回-1。 否则,此方法返回实际读取的字符数。
最后一点很重要,因为这意味着可以阻塞的流可能返回的字符数少于预期。 虽然从本地文件读取时,读取器或流应始终具有可读取的字节。