0

我想知道如何逐字节读取文件,然后每 n 个字节执行一些操作。

例如:

假设我有一个文件size = 50 bytes,我想将它分成每个块n bytes。然后将每个块发送到一个函数,以便对这些字节进行一些操作。这些块将在读取过程中创建,并在块达到 n 字节时发送到函数,这样我就不会使用太多内存来存储所有块。

我希望将函数的输出写入/附加到新文件中。

这是我读到的,但我不知道它是否正确:

fc = new JFileChooser();
File f = fc.getSelectedFile();
FileInputStream in = new FileInputStream(f);
byte[] b = new byte[16];
in.read(b);

我还没有为写入过程做任何事情。

4

5 回答 5

5

你在正确的路线上。考虑FileInputStream用 a包装你BufferedInputStream的文件,通过分块读取文件来提高 I/O 效率。

下一步是检查读取的字节数(由您的 read 调用返回)并将数组移交给处理函数。显然,如果数组仅部分填充,您也需要将读取的字节数传递给此方法。

于 2010-05-28T11:32:55.070 回答
3

到目前为止,您的代码看起来还不错。对于读取二进制文件(而不是文本文件),您确实应该使用FileInputStream(对于读取文本文件,您应该使用Reader,例如FileReader)。

请注意,您应该检查 from 的返回值in.read(b);,因为如果文件末尾剩余的字节数少于 16 个字节,则它可能读取的字节数少于 16 个字节。

当然,您应该在程序中添加一个循环,该循环一直读取字节块,直到到达文件末尾。

要将数据写入二进制文件,请使用FileOutputStream. 该类有一个构造函数,您可以传递一个标志来指示您要附加到现有文件:

FileOutputStream out = new FileOutputStream("output.bin", true);

另外,完成后不要忘记close()调用FileInputStreamand FileOutputStream

请参阅Java API 文档,尤其是java.io包中的类。

于 2010-05-28T11:30:51.503 回答
2

我相信这会奏效:

final int blockSize = // some calculation
byte[] block = new byte[blockSize];
InputStream is = new FileInputStream(f);
try {
    int ret = -1;
    do {
        int bytesRead = 0;
        while (bytesRead < blockSize) {
            ret = is.read(block, bytesRead, blockSize - bytesRead);
            if (ret < 0)
                break; // no more data
            bytesRead += ret;
        }

        myFunction(block, bytesRead);
    } while (0 <= ret);
}
finally {
    is.close();
}

此代码将调用所有字节,但可能是最后一次调用myFunctionblockSize

于 2010-05-28T13:21:29.400 回答
1

这是一个开始。

您应该检查 read() 返回的内容。它可以读取比数组大小更少的字节,并且还指示已到达文件末尾。

显然,您需要循环读取()...

重用数组可能是个好主意,但这要求读取数组的部分复制它需要的内容,而不是仅仅保留对数组的引用。

于 2010-05-28T11:31:41.173 回答
0

我认为这是您可能需要的

void readFile(String path, int n) {
    try {
        File f = new File(path);
        FileInputStream fis = new FileInputStream(f);
        int ret = 0;
        byte[] array = new byte[n];
        while(ret > -1) {
            ret = fis.read(array);
            doSomething(array, ret);
        }
                    fis.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
于 2010-05-28T11:43:21.863 回答