首页 > 解决方案 > Java File.setReadable() 在 Windows 上不起作用

问题描述

我有这段代码,我想在参数传递不可读文件时测试一个函数。该函数在这里无关紧要,只是 File.setReadble(false) 似乎仅在 Windows 上不起作用。

该类File已过时,那么我如何保证文件是否可读或不独立于平台?

我在 Linux 和 Mac 上测试了相同的代码,测试工作正常。

    @Test
    public void testReadableFile2() {
        System.out.println("testReadableFile2");
        URL resource = TestClass.class.getResource("/xml/file.xml");
        assertNotNull(resource);
        Path file = null;
        try {
            file = Paths.get(resource.toURI());
        } catch (final URISyntaxException ex) {
            System.out.println("exception: " + ex);
        }

        assertNotNull(file);
        assertTrue(Files.exists(file));

        // Query file system
        FileStore fileStore = null;
        try {
            fileStore = Files.getFileStore(file);
        } catch (final IOException ex) {
            System.out.println("IOException for get file store: " + ex);
        }

        assertNotNull(fileStore);

        boolean isReadable = true;
        if (fileStore.supportsFileAttributeView(DosFileAttributeView.class)) {
            boolean hadException = false;
            try {
                // Set read-only
                DosFileAttributeView att = Files.getFileAttributeView(file, DosFileAttributeView.class);
                att.setReadOnly(true);
                isReadable = !att.readAttributes().isReadOnly();
            } catch (final IOException ex) {
                System.out.println("IOException for set attribute: " + ex);
                hadException = true;
            }
            assertFalse(hadException);

        } else if (fileStore.supportsFileAttributeView(PosixFileAttributeView.class)) {
            boolean hadException = false;
            try {
                // Change permissions
                PosixFileAttributes attrs = Files.readAttributes(file, PosixFileAttributes.class);
                Set<PosixFilePermission> newPermissions = attrs.permissions();
                newPermissions.remove(PosixFilePermission.OWNER_READ);
                newPermissions.remove(PosixFilePermission.OTHERS_READ);
                newPermissions.remove(PosixFilePermission.GROUP_READ);

                Files.setPosixFilePermissions(file, newPermissions);

                PosixFileAttributeView newAttr = Files.getFileAttributeView(file, PosixFileAttributeView.class);
                newAttr.setPermissions(newPermissions);

                boolean owner, others, group;

                owner = newAttr.readAttributes().permissions().contains(PosixFilePermission.OWNER_READ);
                others = newAttr.readAttributes().permissions().contains(PosixFilePermission.OTHERS_READ);
                group = newAttr.readAttributes().permissions().contains(PosixFilePermission.GROUP_READ);
                isReadable = !owner && !others && !group;
            } catch (final IOException ex) {
                System.out.println("io exception: " + ex);
                hadException = true;
            }
            assertFalse(hadException);
        }

        assertFalse(isReadable);

        assertFalse(Files.isReadable(file)); // assertion failure here
    }

我在最后一行得到一个断言失败。

有人可以帮我解决这个问题吗?

标签: javalinuxwindows

解决方案


推荐阅读