逐字节读取文件,然后每n个字节执行一些操作

时间:2010-05-28 11:21:24

标签: java java-io

我想知道如何逐字节读取文件,然后每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);

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

5 个答案:

答案 0 :(得分:4)

你说的是正确的。考虑使用FileInputStream包裹BufferedInputStream,通过以块的形式读取文件来提高I / O效率。

下一步是检查读取的字节数(通过调用读取返回)并将数组切换到处理函数。显然,如果数组只是部分填充,你也需要将读取的字节数传递给这个方法。

答案 1 :(得分:2)

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

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

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

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

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

另外,完成后请不要忘记在close()FileInputStream上致电FileOutputStream

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

答案 2 :(得分: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();
}

此代码将为myFunction字节调用blockSize,但可能是最后一次调用。

答案 3 :(得分:1)

这是一个开始。

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

显然,你需要在循环中读取()...

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

答案 4 :(得分: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();
    }
}