Использование JarEntry для записи звуковых файлов не работает должным образом - PullRequest
0 голосов
/ 06 сентября 2011
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 программы, при запуске программы ей передаются определенные файлы, которые записываются на жесткий диск компьютера пользователя. Все пишется, но только изображения получаются на 100% правильными. Звуковые файлы не так удачливы.

По сути, я НЕ МОГУТ заставить записывать звуки правильно, их размеры файлов правильные, но они содержат только долю секунды звука вместо их полной длины звука. Я что-то здесь упускаю? Кажется, я все сделал правильно, но если бы это было правдой, я бы здесь не писал.

Я старался изо всех сил в поиске этой проблемы, но она подвела меня.

Любое предположение о том, почему это не работает, было бы ИЗУМИТЕЛЬНО !! :)

1 Ответ

0 голосов
/ 06 сентября 2011

Поскольку 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();
    }
}
...