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%正确。声音文件不是那么幸运。
基本上,我不能让声音正确写入,它们的文件大小正确但它们只包含瞬间音频而不是它们的全长音频。我在这里错过了什么吗?我似乎已经做好了一切,但如果这是真的,我不会在这里发布。
我在谷歌搜索这个问题时尽力而为,但它让我失望了。
任何猜测为什么这不起作用将是惊人的! :)
答案 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();
}
}