Java IO 合并多个二进制文件为一个二进制文件
背景
- 我最近在调用讯飞语音的
API
来把我的博客中的文字转成音频,
- 讯飞语音合成有数字限制,如果超过字数限制,会合成失败.
- 为了不超过字数限制,我把文章分割成好几部分,分别合成,
- 然后再把这些部分合并为一个文件.
- 讯飞合成的音频文件是
.pcm
文件,这是个二进制文件,
好了,废话就说到这,下面介绍如何把多个二进制文件合并为一个二进制文件.
算法描述
复制文件的算法如下:
- 从源文件中读入一些字节到内存(字节数组)中
- 把内存中的这些字节写到目标文件中.
多个源文件合并成一个目标文件,算法跟复制文件差不多,算法描述如下:
- 读取第一个源文件中的内容,输出到目标文件中.
- 然后读取第二个源文件中的内容,然后输出到目标文件中.
- 然后读取第三个源文件中的内容,然后输出到目标文件中.
- 依次类推,直到处理所有的源文件完成。
关键代码
1 2 3 4 5 6 7 8 9 10 11 12
| byte[] buffer = new byte[2048];
int inSize = -1;
while ((inSize = in.read(buffer)) != -1) { out.write(buffer, 0, inSize); }
|
合并多个源文件到目标文件并删除源文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
public static void merge2TargetFileDeleteSourceFile(String targetFilePath, ArrayList<String> sourceFilePathList) { if (sourceFilePathList.size() > 0) { BufferedInputStream in; try (BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream(new File(targetFilePath)));) { System.out.println("源文件列表:"); for (Iterator<String> iterator = sourceFilePathList .iterator(); iterator.hasNext();) { String sourceFilePath = iterator.next(); System.out.println(" " + sourceFilePath); File sourceFile = new File(sourceFilePath); in = new BufferedInputStream( new FileInputStream(sourceFile)); byte[] buffer = new byte[2048]; int inSize = -1; while ((inSize = in.read(buffer)) != -1) { out.write(buffer, 0, inSize); } in.close(); sourceFile.delete(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
|