Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中使用二进制I/O拆分和连接回文件的机制_Java_Io_Binary - Fatal编程技术网

Java中使用二进制I/O拆分和连接回文件的机制

Java中使用二进制I/O拆分和连接回文件的机制,java,io,binary,Java,Io,Binary,我在连接回.dat文件时遇到了问题,该文件是通过使用二进制I/O拆分某些文件生成的 某些类型的文件会出现问题,例如.avi文件(不超过2GB)。重新连接时,输出文件似乎与拆分的文件完全相同,但对于.avi文件,会出现“无法呈现文件”错误。(如果使用二进制I/O复制文件,也会发生同样的情况)。 但是,例如,.mp4文件已正确连接回 我的问题是为什么会这样?因为正如我所学到的,任何文件都只是0和1的序列。因此,如果您只是重写文件的二进制序列并设置相同的文件格式,那么一切都会正常工作 以防万一,下面是

我在连接回.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;
}