【问题标题】:How do I read file x bytes at a time ? in java如何一次读取文件 x 个字节?在java中
【发布时间】:2011-02-22 11:09:27
【问题描述】:

我想将文件读入 Java 中的字符串,一次 x 个字符。然后我会用字符串做一些事情,并想从我离开的地方继续。我该怎么做?

编辑:

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

【问题讨论】:

    标签: java file


    【解决方案1】:

    嗯,首先你需要区分 bytescharacters。您可以一次从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);
    }
    

    【讨论】:

    • 这几乎就是我一直在寻找的东西......根据我的需要进行了一些小的改动,我已经完成了 :)
    【解决方案2】:

    您是否尝试过使用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。否则,此方法返回实际读取的字符数。

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

    【讨论】:

    • 终于找到正确答案了!使用 InputStream/InputStreamReader 实现循环读取是愚蠢的
    • '递归调用读取'。它调用它迭代。
    猜你喜欢
    • 2015-12-11
    • 2021-03-07
    • 2014-12-12
    • 2016-03-09
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多