JavaIO流拷贝MP4文件不能播放

Java,IO流,拷贝mp4文件,

两种方法,就一行代码不一样,为什么不能播放

第一段代码:

package com.IO.TestIO流1;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class IO_FileInputStreamDemo5 {
    public static void main(String[] args) throws IOException {
        //需求:文件拷贝

        FileInputStream fis = new FileInputStream("D:\\aaa\\dance.mp4");
        FileOutputStream fos = new FileOutputStream("TestCode\\copy.mp4");

        byte[] bt = new byte[1024*1024];
        int len;
        while (( len = fis.read(bt)) != -1){
            fos.write(bt,0,len);
        }

        fos.close();
        fis.close();
    }
}

第二段代码:


```java
package com.IO.TestIO流1;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class test2 {
    public static void main(String[] args) throws IOException {
        //需求:文件拷贝

        FileInputStream fis = new FileInputStream("D:\\aaa\\dance.mp4");
        FileOutputStream fos = new FileOutputStream("TestCode\\copy1.mp4");

        byte[] bt = new byte[1024*1024];
        int len;
        while (( len = fis.read(bt)) != -1){
            fos.write(new String(bt).getBytes(),0,len);
        }

        fos.close();
        fis.close();
    }
}

为什么使用 fos.write(bt,0,len);方法拷贝的copy.mp4能正常播放,
而使用 fos.write(new String(bt).getBytes(),0,len);方法拷贝的copy1.mp4就不能播放

拷贝的文件大小都是一样的

img

img

img

根据你的代码,我觉得是因为方法实现不一样导致的。读取源文件的数据到 buffer 中,然后通过 fos.write(buffer, 0, len) 方法将数据写入目标文件中。其中,len 表示实际读取到的字节数量,0 表示写入目标文件的起始偏移量。

对于第一个拷贝方式 fos.write(bt, 0, len),使用 bt 数组保存读取的数据,然后直接将 bt 数组中的数据写入目标文件中。这种方式拷贝文件时,每次读取的数据都会按照原本的二进制格式直接写入目标文件,因此拷贝后的文件能够正常播放。

而对于第二个拷贝方式 fos.write(new String(bt).getBytes(), 0, len),使用 new String(bt) 将读取的数据转换为字符串,然后再通过 getBytes() 方法将字符串转换为字节数组,最后将字节数组写入目标文件中。这种方式拷贝文件时,由于将二进制数据转换为了字符串,再将字符串转换回字节数组,因此可能会导致一些二进制数据的丢失或变形,导致拷贝后的文件无法正常播放。

因此,建议在拷贝文件时使用第一个方式,即直接使用 fos.write(bt, 0, len) 方法将读取的二进制数据写入目标文件中,以保证拷贝后的文件能够正常播放。。如果还有问题可以私信我

new String(bt)编码 改变了