java读取jar包关闭流后删除不了文件

java读取jar包关闭流后删除不了文件
我将断点打在Inputstrem的close后删除文件删不了

img

img


jvm退出后才可以删除
有没有知道是怎么回事呢?

你这个是有相应服务还在后台运行,在任务管理器中关掉就可以删了

流是最后关的

猜测:是因为线程在使用这个文件,线程结束才能删

Jar被JVM加载使用了,读文件就没有这种现象了。

InputStream.read(bytes)这里读取一个字节后,自动到下一个。这里应该通过while循环判断是否读取到文件末尾,读取完后再关闭流

是不是文件正在被使用

有其他程序正在操作该文件,一般处理方式就是关闭再打开就可以了

public static void file() throws Exception{
    //FileInputStream in = new FileInputStream("E:/Download/test/test.txt");
    //FileOutputStream out = new FileOutputStream("E:/Download/test/data/aaa.txt");
    URL filerUrl = new URL("file:///E:/Download/test/test.txt");
    InputStream in = filerUrl.openStream();
    byte[] bytearray = new byte[1024];
    do {
        in.read(bytearray, 0, 1024);
        //out.write(bytearray);
        System.out.println(new String(bytearray));
    } while (in.available() > 0);

// in.read(bytearray);
in.close();
//out.close();
System.out.println("test");
}

public static void main(String[] args) {
    System.out.println("start--------------");
    try{
        file();
    }catch (Exception e){
        System.out.println("异常:" + e);
    }
    System.out.println("end--------------");
}

如下代码,在你当前代码中抛出IOException异常,将读取流放入try catch中 在 finally中关闭流


public void readFile() throws IOException {
    InputStream input = null;
    try {
        input = new FileInputStream("src/readme.txt");
        int n;
        while ((n = input.read()) != -1) { // 利用while同时读取并判断
            System.out.println(n);
        }
    } finally {
        if (input != null) { input.close(); }
    }
}

尝试先调用finalize方法

img

这是url 这个类的问题,他最后调用close 的时候是调用urlconnention里面的close ,然后他底层默认有个jarfile缓存,所以不能用这个获取流,要用urlconnection 关闭缓存在用这个类获取流