0

私のスレッドはjarファイルからクラスデータを読み取り、別のスレッドはjarファイルを変更または削除します。注文は最初に読み取られてから削除されますが、機能しませんでした。読み取り後にリソースを解放できないようです。どうすれば連絡できますか?

InputStream is = null;
BufferedInputStream bis = null;
ByteArrayOutputStream baos = null;
try {
URL res = new URL(**file**);
is = res.openStream();
bis = new BufferedInputStream(is);
baos = new ByteArrayOutputStream();

byte[] bytes = new byte[1024 * 10];
int readBytes;

while ((readBytes = bis.read(bytes)) != -1) {
    baos.write(bytes, 0, readBytes);
}
byte[] b = baos.toByteArray();
baos.close();
     bis.close();
     is.close();

return b;
} catch (Exception ex) {
throw ex;
}

パラメータ「ファイル」は、「jar:file:///C:/Users/HJ16748/Desktop/test.jar!/com/services/plugin/test/Test.class」のような文字列です。

4

2 に答える 2

0
ZipFile zf = new ZipFile(entry);
file = file.replaceAll("\\\\", "/");
ZipEntry zipEntry = zf.getEntry(file);

BufferedInputStream bis = new BufferedInputStream(zf.getInputStream(zipEntry));
ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte[] bytes = new byte[1024 * 10];
int readBytes;

while ((readBytes = bis.read(bytes)) != -1) {
    baos.write(bytes, 0, readBytes);
}
b = baos.toByteArray();

baos.close();
bis.close();
zf.close();
于 2013-11-08T02:31:50.950 に答える
0

try catch ブロックに finally を追加し、そこでリソースを閉じます。2 つのスレッド名を Read と Modify とします。

jar を削除または変更する前に、Modify thread 内に次のような行を追加します。

try{
System.out.println("Waiting for read to finish");
read.thread.join();
}catch(InterruptedException e){
System.out.println("not able to join");//oops catch
}
//codes to delete or modify jar

read で呼び出されるスレッドは Thread オブジェクトです

于 2013-11-06T10:19:34.247 に答える