Java中使用二进制I/O拆分和连接回文件的机制
我在连接回.dat文件时遇到了问题,该文件是通过使用二进制I/O拆分某些文件生成的 某些类型的文件会出现问题,例如.avi文件(不超过2GB)。重新连接时,输出文件似乎与拆分的文件完全相同,但对于.avi文件,会出现“无法呈现文件”错误。(如果使用二进制I/O复制文件,也会发生同样的情况)。 但是,例如,.mp4文件已正确连接回 我的问题是为什么会这样?因为正如我所学到的,任何文件都只是0和1的序列。因此,如果您只是重写文件的二进制序列并设置相同的文件格式,那么一切都会正常工作 以防万一,下面是我用于拆分和连接回文件的代码(工作正常): ---分离器---Java中使用二进制I/O拆分和连接回文件的机制,java,io,binary,Java,Io,Binary,我在连接回.dat文件时遇到了问题,该文件是通过使用二进制I/O拆分某些文件生成的 某些类型的文件会出现问题,例如.avi文件(不超过2GB)。重新连接时,输出文件似乎与拆分的文件完全相同,但对于.avi文件,会出现“无法呈现文件”错误。(如果使用二进制I/O复制文件,也会发生同样的情况)。 但是,例如,.mp4文件已正确连接回 我的问题是为什么会这样?因为正如我所学到的,任何文件都只是0和1的序列。因此,如果您只是重写文件的二进制序列并设置相同的文件格式,那么一切都会正常工作 以防万一,下面是
publicstaticvoidmain(字符串[]args)引发IOException{
字符串sourceFile=“Movie2.mp4”;
整数部分=5;
BufferedInputStream in=新BufferedInputStream(新文件输入流(源文件));
缓冲输出流输出;
int partSize=in.available()/parts;
字节[]b;
对于(int i=0;i
---连接器---
publicstaticvoidmain(字符串[]args)引发IOException{
字符串源文件;
缓冲输入流;
字节[]b;
BufferedOutputStream out=新的BufferedOutputStream(新文件输出流(“Movie2RESTORED.mp4”,true));
对于(int i=0;i<5;i++){
sourceFile=“Movie2.mp4”+i+“.dat”;
in=新的BufferedInputStream(新的FileInputStream(sourceFile));
b=新字节[in.available()];
in.改为(b);
写出(b);
in.close();
}
out.close();
}
提前谢谢 您需要在.read(b)中循环
即使假定available
返回可以在不阻塞的情况下读取的字节数,您也可能需要多次调用read
,以获取所有字节数。使用固定大小的缓冲区会更容易,但如果您坚持读取available提供的字节数:
int toBeRead = in.available();
byte[] b = new byte[toBeRead];
int totalRead = 0;
int read;
while ((read = in.read(b, totalRead, toBeRead-totalRead)) != -1) {
totalRead += read;
}
此外,正如aetheria所提到的,您应该调用close
来关闭各种输出流。否则,保存在JVM和OS缓冲区中的数据可能不会进入文件,尽管它们目前看起来是这样的。连接的文件是否与原始文件大小相同,或者是否丢失或添加了一些字节?它完全相同,字节数完全相同。您在哪里out.close()代码>所有文件?
public static void main(String[] args) throws IOException {
String sourceFile;
BufferedInputStream in;
byte[] b;
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("Movie2RESTORED.mp4", true));
for (int i = 0; i < 5; i++) {
sourceFile = "Movie2.mp4_" + i + ".dat";
in = new BufferedInputStream(new FileInputStream(sourceFile));
b = new byte[in.available()];
in.read(b);
out.write(b);
in.close();
}
out.close();
}
int toBeRead = in.available();
byte[] b = new byte[toBeRead];
int totalRead = 0;
int read;
while ((read = in.read(b, totalRead, toBeRead-totalRead)) != -1) {
totalRead += read;
}