当前位置: 首页 > 面试题库 >

File.createNewFile()随机失败

潘刚洁
2023-03-14
问题内容

我建立了一个简单的测试,它可以无限循环地创建和删除文件(名称不变)。该测试确实运行了几秒钟(有时超过77,000次迭代!),然后由于以下异常而失败:

Exception in thread "main" java.io.IOException: Access is denied
        at java.io.WinNTFileSystem.createFileExclusively(Native Method)
        at java.io.File.createNewFile(Unknown Source)
        at DeleteTest.main(DeleteTest.java:11)

这是测试逻辑

final File f = new File(pathname);
while (true) {
    final boolean create = f.createNewFile();
    if (!create) {
        System.out.println("crate failed");
    } else {
        final boolean delete = f.delete();
        if (!delete) {
            System.out.println("delete failed");
        }
    }
}

这怎么可能?删除呼叫不会失败。它会说明一切。因此删除总是成功但createNewFile失败。这就是MSDN关于Win32
API函数的说法DeleteFile

DeleteFile函数在关闭时将文件标记为要删除。因此,在关闭文件的最后一个句柄之前,不会发生文件删除。随后调用CreateFile打开文件失败,并显示ERROR_ACCESS_DENIED。

所以createNewFile不关闭文件?openjdk源告诉我们文件 关闭:

JNIEXPORT jboolean JNICALL
Java_java_io_Win32FileSystem_createFileExclusively(JNIEnv *env, jclass cls,
                                                   jstring pathname)
{
    jboolean rv = JNI_FALSE;
    DWORD a;

    WITH_PLATFORM_STRING(env, pathname, path) {
        int orv;
        int error;
        JVM_NativePath((char *)path);
        orv = JVM_Open(path, JVM_O_RDWR | JVM_O_CREAT | JVM_O_EXCL, 0666);
        if (orv < 0) {
            if (orv != JVM_EEXIST) {
                error = GetLastError();

                // If a directory by the named path already exists,
                // return false (behavior of solaris and linux) instead of
                // throwing an exception
                a = GetFileAttributes(path);

                if ((a == INVALID_FILE_ATTRIBUTES) ||
                        !(a & FILE_ATTRIBUTE_DIRECTORY)) {
                    SetLastError(error);
                    JNU_ThrowIOExceptionWithLastError(env, path);
                }
            }
        } else {
            JVM_Close(orv);
            rv = JNI_TRUE;
        }
    } END_PLATFORM_STRING(env, path);
    return rv;
}

谁能解释这种行为?


问题答案:

我在写问题时找到了解释。我仍然发布问题,因为我想分享我学到的东西。

我的应用程序不是系统访问文件的唯一过程。例如,Windows搜索索引服务可能会打开此文件,因为它想将其添加到索引中。或Windows资源管理器(如果要更新视图)。



 类似资料:
  • 我从两个方面建议了一些方法,一个是使用spring AOP支持,另一个是()建议所有带有注释的方法。在我的单元测试中,我试图通过破坏方法契约来强制抛出错误,但有时验证是到位的(上面提到的后处理器强加的建议),有时不起作用。有人经历过类似的事情吗。 下面是我正在尝试做的事情的一个小片段: 注释(可记录代码) 使用@Validated注释注释的接口(这里有相关信息的链接)。 实现此接口的基类:公共抽象

  • 将word2vec模型写入S3,如下所示: 我通常没有问题,所以没有AWS凭据问题,但我随机得到以下错误。 30年1月17日20:35:21警告配置实用程序:无法使用正确的权限创建临时目录:/mnt2/s3 java。nio。文件AccessDeniedException:/mnt2在sun。nio。fs。UnixexException。sun上的translateToIOException(Un

  • 我正在kubernetes中运行一个Flink作业。我的设置如下 1个作业管理器吊舱 我的flink作业从kafka源获取时间序列数据(时间、值),进行聚合和其他转换,并将其发布到kafka接收器。 有时,我的作业因检查点异常(10分钟后超时)而失败,主要是由一名操作员完成的。我不理解异步持续时间(在图中)的含义,为什么它花费的时间最长。在这个异常之前,Kafka的吞吐量非常高,有500-800万

  • 问题内容: 我在Python-Django网站上工作。我使用GIT作为我的VCS。对于持续集成,我使用Jenkins CI。我已经使用Python设置了两个虚拟环境,一个用于开发,另一个用于预生产。 我的问题:我为网站编写了许多单元测试,回归测试和冒烟测试。我的开发和预生产虚拟环境都连接到Jenkins CI。 最近,每当将代码更改推送到Jenkins CI中的两种环境时,测试都会随机失败。有时,

  • 我使用的是Android Studio 3.3,我对Robolectric 3.3.2进行了一些测试。 我有多个可能有联系的问题。 > 我启动Android studio并运行我的测试类。没关系。如果修改/添加测试,则在重新运行测试时不会看到它(右键单击该类,然后运行测试)。我试图使缓存无效并重新启动、生成/重建项目。它不起作用。我必须重新启动Android Studio。 此外,我碰巧遇到一个错