Как разделить файл в Java на несколько частей одинакового размера, используя bytestream - PullRequest
0 голосов
/ 28 ноября 2018

Ниже приведен код, который я пробовал.Я могу прочитать 100KB файлов song.mp3 (общий размер 2,4 МБ), но не могу прочитать последующие фрагменты (100KB) в цикле.Цикл создает только файл song_0.mp3, и он пуст.Мне нужно создать файлы как song_0.mp3, song_1.mp3, ...

public class fileIOwrite2multiplefiles {
        public static void main(String[] args) throws IOException{
        // TODO code application logic here

        File file = new File("song.mp3");

        FileInputStream fIn = new FileInputStream("song.mp3");
        FileOutputStream fOut = new FileOutputStream("song_0.mp3");
        int chunk_size = 1024*100;
        byte[] buff = new byte[chunk_size]; // 100KB file 

        while(fIn.read()!=-1){

          fIn.read(buff);
          String file_name =file.getName();
          int i=1;
          int total_read=0;
          total_read +=chunk_size;
          long read_next_chunk= total_read;
          String file_name_new = file_name+"_"+ i +".mp3";
          File file_new = new File(file_name);
          i++;
          fOut = new FileOutputStream(file_name_new);
          fOut.write(buff);
          buff = null;
          fIn.skip(total_read);// skip the total read part


       }//end of while loop      

        fIn.close();
        fOut.close();          
    }
}

1 Ответ

0 голосов
/ 28 ноября 2018

Вы можете переписать ваш метод main следующим образом:

public static void main(String[] args) throws IOException {

    File file = new File("song.mp3");

    FileInputStream fIn = new FileInputStream("song.mp3");
    FileOutputStream fOut = new FileOutputStream("song_0.mp3");
    int chunk_size = 1024 * 100;
    byte[] buff = new byte[chunk_size]; // 100KB file
    int i = 0;
    String file_name = file.getName();
    String file_name_base = file_name.substring(0, file_name.lastIndexOf("."));
    while (fIn.read() != -1) {

        fIn.read(buff);
        int total_read = 0;
        total_read += chunk_size;
        long read_next_chunk = total_read;
        String file_name_new = file_name_base + "_" + i + ".mp3";
        File file_new = new File(file_name_base);
        i++;
        fOut = new FileOutputStream(file_name_new);
        fOut.write(buff);

        fIn.skip(total_read);// skip the total read part

    } // end of while loop

    fIn.close();
    fOut.close();

}
  1. Объявление добавочной переменной ( int i = 0 ) было необходимо для создания вне цикла while.
  2. Не обнуляйте переменную buff , так как при следующей итерации она выдаст нулевой указатель.
  3. Необходимо извлечь базовое имя файла, чтобы создать части файла с именамиты хочешь.Например, song_0.mp3, song_1.mp3, ...
...