【问题标题】:ZipOutputStream on mp3 corrupts files - Creates data files not audio files [closed]mp3 上的 ZipOutputStream 损坏文件 - 创建数据文件而不是音频文件 [关闭]
【发布时间】:2015-12-24 18:44:55
【问题描述】:

我在 Android 应用中使用 ZipOutputStream 来打包和导出 mp3 文件。打包和导出似乎工作正常,提取文件后,它们无法播放。在输出上运行file 命令将文件类型显示为data。在压缩之前,文件类型被列为Audio。 这是我用来压缩文件的代码:

 protected File compressFiles(File outputFile, File... inputFiles) {

    int bufferSize = 1024 * 4; // 4KB
    ZipOutputStream zipOutputStream = null;
    try {
        OutputStream fileOutputStream = new FileOutputStream(outputFile);
        zipOutputStream = new ZipOutputStream(new BufferedOutputStream(fileOutputStream));
        int count = inputFiles.length;
        File file = null;
        for (int i = 0; i < inputFiles.length; i++) {
            file = inputFiles[i];

            String fileName = file.getName();
            ZipEntry entry = new ZipEntry(fileName);
            entry.setTime(file.lastModified());
            FileInputStream inputStream = new FileInputStream(file);
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);

            zipOutputStream.putNextEntry(entry);
            byte[] buffer = new byte[bufferSize];
            int bytesRead;
            while ((bytesRead = bufferedInputStream.read()) != -1) {
                zipOutputStream.write(buffer, 0, bytesRead);
            }

            zipOutputStream.closeEntry();
            inputStream.close();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (zipOutputStream != null) {
            try {
                zipOutputStream.finish();
               // zipOutputStream.flush();
                zipOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return outputFile;
}

【问题讨论】:

    标签: java android zip zipoutputstream


    【解决方案1】:

    您使用了错误的 BufferedInputStream.read() 方法重载。

    您可能打算将byte[] buffer 作为参数传递,但实际上您没有传递任何参数。因此,您只是从 buffer 变量中写出零。事实上,即使是 bytesRead 变量也有错误的值,因为它返回的是实际读取的字节而不是字节数。

    要修复,只需更改此行:

    while ((bytesRead = bufferedInputStream.read()) != -1) {
    

    到这里:

    while ((bytesRead = bufferedInputStream.read(buffer)) != -1) {
    

    【讨论】:

      猜你喜欢
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多