将文件拆分为四个部分

时间:2012-07-06 15:05:49

标签: java

我想将一个文件(假设一个mp3)分成四个部分。我试过这段代码。但只有File1.mp3正常工作。我无法玩别人。我在这里做错了什么?

try     {

        FileInputStream in=new FileInputStream(f);
        long i=f.length();
        long j=i/4;

        FileOutputStream f0=new FileOutputStream("File1.mp3");
        FileOutputStream f1=new FileOutputStream("File2.mp3");
        FileOutputStream f2=new FileOutputStream("File3.mp3");
        FileOutputStream f3=new FileOutputStream("File4.mp3");

        for(long k=0;k<j;k++){
            f0.write(in.read());
        }
        f0.close();
        for(long l=0;l<j;l++){
            f1.write(in.read());
        }
        f1.close();
        for(long m=0;m<j;m++){
            f2.write(in.read());  
        }
        f2.close();
        for(long n=0;n<j;n++){
            f3.write(in.read());
        }
        f3.close();

        in.close();
    }
    catch (IOException e)
    {

    }

4 个答案:

答案 0 :(得分:8)

你不能像这样分割结构化文件:MP3 file has a header at the beginning of the file描述文件其余部分的内容。拆分文件时,只在第一部分中获得标题。

就削减非结构化文件(例如文本)而言,只要你不介意将句子分成一个单词,你的代码应该会好得多。

答案 1 :(得分:4)

MP3文件在开头或结尾都有标题,这意味着你不能只根据文件的大小来分块。您需要一个能够读取这些标题的库,并在拆分主文件时将它们复制到每个部分中。

答案 2 :(得分:0)

看起来mp3帧彼此依赖,不能只是被剪切。请参阅this格式说明。具体做法是:

  

由于没有文件头,您可以剪切MPEG文件的任何部分并播放   它是正确的(这应该在框架边界,但大多数   应用程序将处理错误的标头)。但是,对于第三层,   这不是100%正确。由于MPEG中的内部数据组织   第三层文件,帧通常彼此依赖并且它们相互依赖   不能像那样被切断。

我的猜测是你已经设法拆分了依赖于早期帧的地方。

答案 3 :(得分:0)

查看http://mpgedit.org/mpgedit/mpeg_format/MP3Format.html MP3文件的单个帧是32位长,这意味着您需要以字节组的形式进行读/写。目前你正在写1个字节的组,这意味着你正在分割帧(例如,帧的一个字节在File1中,其他3个字节在file2中,弄乱了正在读取你的mp3文件的任何程序,它正在期待byte1 )。

但是,我建议不要编写自己的mp3文件流,而是使用内置的

javax.sound.sampled.AudioInputStreamjavax.sound.sampled.AudioOutputStream