java - mp3 上的 ZipOutputStream 会损坏文件 - 创建数据文件而不是音频文件

标签 java android zip zipoutputstream

我正在 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;
}

最佳答案

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

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

要修复,只需更改此行:

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

对此:

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

关于java - mp3 上的 ZipOutputStream 会损坏文件 - 创建数据文件而不是音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34456761/

相关文章:

java.lang.ClassCastException : com. google.gson.internal.LinkedTreeMap 无法转换为 com.example

java - Android 聊天在 DataSnapshot.getValue() 上崩溃

java - 使用掩码读取 int 的未知方式

python - 几个列表 - 列表理解来计算方程

c# - Java ZIP 文件从一个 zip 复制并粘贴到另一个 zip

java - 在xml中使用hibernate调用Oracle存储过程

java - 打印数组列表

android - GCM 通知的自定义 UI

android - 处理可扩展 ListView 中包含多个 View 的 subview 上的单击事件

java - 仅在内存中流式传输压缩文件