我正在尝试从当前正在运行的jar中提取2个jar文件但是它们总是以2kb结束,即使它们的大小是104kb和1.7m,还有我所拥有的
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();
}
答案 0 :(得分: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();
}
答案 1 :(得分:1)
available()
方法读取数据是不可靠的,因为它只是一个估算,根据其文档
您需要依赖read()
方法,直到读取非-ve。
byte[] contentBytes = new byte[ 4096 ];
int bytesRead = -1;
while ( ( bytesRead = inputStream.read( contentBytes ) ) > 0 )
{
out.write( contentBytes, 0, bytesRead );
} // while available
您可以在here处讨论available()
的问题。
答案 2 :(得分:0)
我不确定提取jar,但每个jar实际上都是一个zip文件,所以你可以尝试解压缩它。
你可以在这里找到关于unziping的信息: How to unzip files recursively in Java?