无法使用Java

时间:2016-11-20 16:20:56

标签: java windows file io ultraesb

我一直在尝试使用Java IO file.delete() API删除Windows操作系统中的文件。但是它失败并返回false。相同的代码就像Ubuntu中的魅力一样。

我已经确认该文件的权限允许程序删除它。此外,该文件的所有输入和输出流都已尝试使用资源打开。

try (InputStream in = new FileInputStream(localFile); OutputStream out = new FileOutputStream(destinationFileName))

使用我已经测试的调试器,发现在我删除文件的代码行,它返回true以进行以下API调用。

file.exists()
file.canRead();
file.canWrite();
file.canExecute();

我甚至尝试在调用delete之前添加System.gc()以确保所有流都已关闭。

不确定这是否是有用的信息,但我甚至尝试使用Apache commons FileUtils.forceDelete(file)方法,但它也失败了。

那我在这里错过了什么?

更新

使用Files.delete(Paths.get(file.getAbsolutePath()))我收到以下错误。

java.nio.file.FileSystemException: C:\Users\thuvvareka\Desktop\temp\in\sd.xml: The process cannot access the file because it is being used by another process.
    at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
    at sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:269)
    at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103)
    at java.nio.file.Files.delete(Files.java:1126)
    at org.adroitlogic.x.transport.file.FileMessageInjector.finalizeProcessing(FileMessageInjector.java:161)
    at org.adroitlogic.x.transport.file.FileMessageInjector.afterProcess(FileMessageInjector.java:123)
    at org.adroitlogic.x.transport.file.FileMessageInjector.afterProcess(FileMessageInjector.java:37)
    at org.adroitlogic.x.base.trp.ScheduledMessageInjector.lambda$2(ScheduledMessageInjector.java:72)
    at org.adroitlogic.x.api.trp.MessageReceiver.lambda$receive$3(MessageReceiver.java:100)
    at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:760)
    at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:736)
    at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:474)
    at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:1962)
    at org.adroitlogic.x.core.MessageContext.lambda$createNewResponseFuture$2(MessageContext.java:459)
    at java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:760)
    at java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:736)
    at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:474)
    at java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:1962)
    at org.adroitlogic.x.core.MessageContext.completeMessageFlowSuccessfully(MessageContext.java:332)
    at org.adroitlogic.x.base.connector.EgressConnectorElement.sendMessage(EgressConnectorElement.java:185)
    at org.adroitlogic.x.base.connector.EgressConnectorElement.process(EgressConnectorElement.java:146)
    at org.adroitlogic.x.base.processor.AbstractProcessingElement.processMessage(AbstractProcessingElement.java:103)
    at org.adroitlogic.x.base.processor.TraceableProcessingElement.processMessage(TraceableProcessingElement.java:53)
    at org.adroitlogic.x.base.connector.IngressConnectorElement.receiveMessage(IngressConnectorElement.java:119)
    at org.adroitlogic.x.core.IntegrationPlatform.lambda$receive$0(IntegrationPlatform.java:81)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

5 个答案:

答案 0 :(得分:1)

使用Files.delete(filePath)代替file.delete()因为file.delete()在Windows上的权限方面存在一些问题。

答案 1 :(得分:1)

欢迎使用Windows。

java.nio.file.FileSystemException: C:\Users\thuvvareka\Desktop\temp\in\sd.xml: 
The process cannot access the file because it is being used by another process.

通常,当进程在Windows中打开文件时,操作系统会以无法删除文件的方式锁定文件。如果您尝试删除文件时打开文件的程序,请先关闭文件然后将其删除。如果它是另一个打开文件的程序,那么你需要找出谁打开它并从那里开始。

当进程在Linux中打开文件时,通常没有什么可以阻止您删除它,这就是您看到不同行为的原因。

答案 2 :(得分:0)

也许您可以使用System.Runtime.exec()运行终端/命令行命令来删除特定文件。这可能是某种程度上依赖于平台的,但是输入到exec()函数的命令可能在os属性中有所不同。

您可以检查此线程以确定正在运行的java程序的当前操作系统。

How do I programmatically determine operating system in Java?

在linux中,您的行如下:

System.Runtime.exec("rm <path to file>");

答案 3 :(得分:0)

我最近遇到了这个问题。我创建了一种变通方法,其中如果file.delete()返回false,请检查file.exists()是否返回true,如果是,我稍等一下,然后重试,并在尝试了几次后放弃。

我未经证实的怀疑是Windows上的病毒检查器锁定了文件以检查文件,并等待病毒检查器完成。

            // Remove the original file.
            if(!file.delete()) {
                // wait a bit then retry on Windows
                if (file.exists())
                {
                    for (int i = 0; i < 6; i++)
                    {
                        Thread.sleep(500);
                        System.gc();
                        if (file.delete())
                           break;
                    }

答案 4 :(得分:0)

我遇到了同样的问题。 请out.close();解决它。

System.gc() 不会删除指向 OutputStream 的链接,只要您没有关闭它。