2

現在実行中のjarから2つのjarファイルを抽出しようとしていますが、サイズが104kbと1.7mであっても、常に2kbになります。

public static boolean extractFromJar(String fileName, String dest) {
    if (Configuration.getRunningJarPath() == null) {
        return false;
    }
    File file = new File(dest + fileName);
    if (file.exists()) {
        return false;
    }

    if (file.isDirectory()) {
        file.mkdir();
        return false;
    }
    try {
        JarFile jar = new JarFile(Configuration.getRunningJarPath());
        Enumeration<JarEntry> e = jar.entries();
        while (e.hasMoreElements()) {
            JarEntry je = e.nextElement();
            InputStream in = new BufferedInputStream(jar.getInputStream(je));
            OutputStream out = new BufferedOutputStream(
                    new FileOutputStream(file));
            copyInputStream(in, out);
        }
        return true;
    } catch (Exception e) {
        Methods.debug(e);
        return false;
    }
}

private final static void copyInputStream(InputStream in, OutputStream out)
        throws IOException {
    while (in.available() > 0) {
        out.write(in.read());
    }
    out.flush();
    out.close();
    in.close();
}
4

3 に答える 3

2

これは、InputStream.available()メソッドに依存するよりもうまく機能するはずです。

private final static void copyInputStream(InputStream in, OutputStream out)
        throws IOException {
    byte[] buff = new byte[4096];
    int n;
    while ((n = in.read(buff)) > 0) {
        out.write(buff, 0, n);
    }
    out.flush();
    out.close();
    in.close();
}
于 2012-05-07T19:36:25.560 に答える
1

available()ドキュメントによると、メソッドは単なる見積もりであるため、データの読み取りは信頼できません。非veを読み取るまで、メソッド
に依存する必要があります。read()

byte[] contentBytes = new byte[ 4096 ];  
int bytesRead = -1;
while ( ( bytesRead = inputStream.read( contentBytes ) ) > 0 )   
{   
    out.write( contentBytes, 0, bytesRead );  
} // while available

ここavailable()で問題が何であるかについての議論を通過することができます。

于 2012-05-07T20:05:34.803 に答える
0

jarの抽出についてはよくわかりませんが、すべてのjarは実際にはzipファイルであるため、解凍してみてください。

ここでJavaでの解凍について知ることができます:Javaで ファイルを再帰的に解凍する方法は?

于 2012-05-07T19:33:29.807 に答える