Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何一次读取文件x字节?在爪哇_Java_File - Fatal编程技术网

Java 如何一次读取文件x字节?在爪哇

Java 如何一次读取文件x字节?在爪哇,java,file,Java,File,我想用Java将一个文件读入一个字符串,每次x个字符。然后我将用字符串做一些事情,并希望从我停止的地方继续。我该怎么做呢 编辑: 目标文件是一个简单的文本文件 首先,您需要区分字节和字符。您可以一次从输入流中读取一定数量的字节作为最大数量;无法保证您将获得所需的所有字节,并且您可以一次最多从读卡器读取多个字符 听起来您可能想在InputStream周围使用InputStreamReader,指定适当的字符编码,然后从InputStreamReader读取。如果必须有精确的字符数,则需要循环使用-

我想用Java将一个文件读入一个字符串,每次x个字符。然后我将用字符串做一些事情,并希望从我停止的地方继续。我该怎么做呢

编辑:


目标文件是一个简单的文本文件

首先,您需要区分字节和字符。您可以一次从输入流中读取一定数量的字节作为最大数量;无法保证您将获得所需的所有字节,并且您可以一次最多从读卡器读取多个字符

听起来您可能想在InputStream周围使用InputStreamReader,指定适当的字符编码,然后从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);
}
你试过使用吗?它定义了readchar[],int,int,这几乎完全符合您的需要。也就是说,它递归调用read以尝试填充缓冲区

用法示例:

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

公共int readchar[]cbuf, int off, 内透镜 抛出IOException

该方法实现了Reader类的相应read方法的一般约定。作为额外的便利,它尝试通过反复调用底层流的read方法来读取尽可能多的字符。此迭代读取将继续,直到以下条件之一变为真:

已读取指定数量的字符, 底层流的read方法返回-1,表示文件结束,或 底层流的ready方法返回false,表示进一步的输入请求将被阻塞。 如果底层流上的第一次读取返回-1以指示文件结束,则此方法返回-1。否则,此方法返回实际读取的字符数


最后一点很重要,因为这意味着可能阻塞的流返回的字符数可能比预期的少。虽然从本地文件读取时,读卡器或流应该始终具有可读取的字节。

这正是我想要的。。。为了满足我的需要,我做了一些小改动,我终于找到了正确的答案!使用InputStream/InputStreamReader实现循环读取非常简单,它不“递归调用读取”,而是迭代调用。