我试图从进程仍在使用该文件进行写入的文件中创建字节数组块。实际上我将视频存储到文件中,我想在录制时从同一个文件创建块。
以下方法应该从文件中读取字节块:
private byte[] getBytesFromFile(File file) throws IOException{
InputStream is = new FileInputStream(file);
long length = file.length();
int numRead = 0;
byte[] bytes = new byte[(int)length - mReadOffset];
numRead = is.read(bytes, mReadOffset, bytes.length - mReadOffset);
if(numRead != (bytes.length - mReadOffset)){
throw new IOException("Could not completely read file " + file.getName());
}
mReadOffset += numRead;
is.close();
return bytes;
}
但问题是所有数组元素都设置为0,我想这是因为写入过程会锁定文件。
如果你们中的任何人在写入文件时能够以任何其他方式创建文件块,我将非常感激。
答案 0 :(得分:7)
解决了问题:
private void getBytesFromFile(File file) throws IOException {
FileInputStream is = new FileInputStream(file); //videorecorder stores video to file
java.nio.channels.FileChannel fc = is.getChannel();
java.nio.ByteBuffer bb = java.nio.ByteBuffer.allocate(10000);
int chunkCount = 0;
byte[] bytes;
while(fc.read(bb) >= 0){
bb.flip();
//save the part of the file into a chunk
bytes = bb.array();
storeByteArrayToFile(bytes, mRecordingFile + "." + chunkCount);//mRecordingFile is the (String)path to file
chunkCount++;
bb.clear();
}
}
private void storeByteArrayToFile(byte[] bytesToSave, String path) throws IOException {
FileOutputStream fOut = new FileOutputStream(path);
try {
fOut.write(bytesToSave);
}
catch (Exception ex) {
Log.e("ERROR", ex.getMessage());
}
finally {
fOut.close();
}
}
答案 1 :(得分:0)
如果是我,我会通过写入文件的进程/线程将其分块。无论如何,Log4j似乎就是这样做的。应该可以使OutputStream
每N个字节自动开始写入一个新文件。