我想知道如何逐字节读取文件,然后每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);
我还没有为写过程做任何事情。
答案 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();
}
}