使用JarEntry写入声音文件无法正常工作

时间:2011-09-06 03:28:19

标签: java fileinputstream fileoutputstream

public static void writeFile(String theFileName, String theFilePath)
{
    try {
        File currentFile = new File("plugins/mcMMO/Resources/"+theFilePath+theFileName);
        //System.out.println(theFileName);
        @SuppressWarnings("static-access")
        JarFile jar = new JarFile(plugin.mcmmo);
        JarEntry entry = jar.getJarEntry("resources/"+theFileName);
        InputStream is = jar.getInputStream(entry);
        byte[] buf = new byte[(int)entry.getSize()];
        is.read(buf, 0, buf.length);
        FileOutputStream os = new FileOutputStream(currentFile);
        os.write(buf);
        os.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

好吧,所以在我的程序中,我将各种资源保存在程序的Jar中,当程序运行时,它具有传递给该函数的特定文件,这些文件被写入用户计算机的HDD。一切都写完了,但只有图像100%正确。声音文件不是那么幸运。

基本上,我不能让声音正确写入,它们的文件大小正确但它们只包含瞬间音频而不是它们的全长音频。我在这里错过了什么吗?我似乎已经做好了一切,但如果这是真的,我不会在这里发布。

我在谷歌搜索这个问题时尽力而为,但它让我失望了。

任何猜测为什么这不起作用将是惊人的! :)

1 个答案:

答案 0 :(得分:0)

JarEntry扩展ZipEntry时,我建议不要依赖ZipEntry.getSize()方法,因为它返回-1。请参阅doc

此外,在阅读流时利用缓冲通常更为常见。在你的例子中,你把所有内容放在你的字节数组中,所以我想对于大文件你最终可能会在OutOfMemoryError

这是我要测试的代码:

public static void writeFile(String theFileName, String theFilePath)
{
    try {
        File currentFile = new File("plugins/mcMMO/Resources/"+theFilePath+theFileName);
        @SuppressWarnings("static-access")
        JarFile jar = new JarFile(plugin.mcmmo);
        JarEntry entry = jar.getJarEntry("resources/"+theFileName);
        InputStream is = jar.getInputStream(entry);
        byte[] buf = new byte[2048];
        int nbRead;
        OutputStream os = new BufferedOutputStream(new FileOutputStream(currentFile));
        while((nbRead = is.read(buf)) != -1) {
            os.write(buf, 0, nbRead);
        }
        os.flush();
        os.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}