Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建文件后,Java.exe会将文件锁定一段时间_Java_File - Fatal编程技术网

创建文件后,Java.exe会将文件锁定一段时间

创建文件后,Java.exe会将文件锁定一段时间,java,file,Java,File,我编写了一个小程序,它压缩一个tiff文件,并将压缩的文件放在一个单独的文件夹“compressed”中,当我尝试对其执行操作时,生成的新文件被java.exe锁定 当我手动运行该方法时,java.exe不会锁定它,但当我通过web服务调用调用该方法时,它会被锁定,知道为什么会发生这种情况吗,但锁定只会持续一段时间,之后我可以删除它您需要关闭用于写入文件的资源 例如,使用文件写入程序和缓冲写入程序: FileWriter fw = null; BufferedWriter bw = null;

我编写了一个小程序,它压缩一个tiff文件,并将压缩的文件放在一个单独的文件夹“compressed”中,当我尝试对其执行操作时,生成的新文件被java.exe锁定


当我手动运行该方法时,java.exe不会锁定它,但当我通过web服务调用调用该方法时,它会被锁定,知道为什么会发生这种情况吗,但锁定只会持续一段时间,之后我可以删除它

您需要关闭用于写入文件的资源

例如,使用
文件写入程序
缓冲写入程序

FileWriter fw = null;
BufferedWriter bw = null;
try {
    fw = new FileWriter(new File(outputFile));
    bw = new BufferedWriter(fw);
    bw.write(content);
} catch (Exception e) {
    // do something with e
} finally {
    if(bw != null) {
        bw.close();  // release the resource
    }
}
使用try with resources,它会自动关闭
try
块:

try(FileWriter fw = new FileWriter(new File(outputFile));
    BufferedWriter bw = new BufferedWriter(fw)) {
    bw.write(content);
}

问题是因为垃圾收集器,在从netbeans运行时,我猜netbeans在每次程序执行后都会调用垃圾收集器,但Webservice调用不是这样,问题是在从我的代码显式调用GC后解决的。

因为BufferedWriter在关闭时关闭其封闭流,因为FileWriter有一个接受字符串的构造函数,所以也可以简单地执行
try(BufferedWriter bw=new BufferedWriter(new FileWriter(outputFile)){bw.write(content);}
。我正在关闭流,glassfish服务器正在锁定文件一段时间time@ChristianHujer,但是如果
BufferedWriter
构造函数抛出异常,
FileWriter
将不会关闭。(这对于
BufferedWriter
来说可能不是什么大风险,但对于其他类来说可能是一个重大问题,因此必须仔细考虑是否可以这样做。)不确定这是GC问题。@cherouvim是GC问题。因为在这里创建压缩映像时,我并没有创建BufferedWriter或其他什么,我正在使用javax.media.jai.jai.create()方法来创建映像。如何“手动运行该方法”?通过IDE或控制台使用
公共静态void main
?如果是,则在程序退出时自动释放资源。这就是文件未被锁定的原因。@cherouvim通过IDE,文件未被锁定,但我将其作为web服务,因此当web服务调用完成时,文件将被锁定一段时间