编辑:我改写我原来的问题(我将其保留在底部)

看一下这段代码:

public static void main(String[] args) {
    try {

        // file in file system

        Path dir = Paths.get("webapp/");
        System.out.println(dir.getFileName().toString());

        // file in jar

        FileSystem fs =  FileSystems.newFileSystem(Paths.get("ajar.jar"), null);
        Path jarDir = fs.getPath("webapp/");
        System.out.println(jarDir.getFileName().toString());

    } catch (IOException e) {
        e.printStackTrace();
    }
}


首先,我从文件系统中的目录获取Path,然后打印其名称。输出为:

webapp


然后,从包含相同文件夹的jar文件中打开FileSystem,并执行与以前相同的操作。这是相应的输出:

webapp/


是否有必要在jar的文件夹名称中获取结尾的“ /”?

如何仅获得文件夹名称而不加斜杠,而不必区分这两种情况(jar和no jar)?

谢谢!

-原始问题-

我正在尝试使用Java SE 7的nio库。

看一下这段代码:

public static void main(String[] args) {
    try {

        // List files in file system

        Path dir = Paths.get("webapp/");

        try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
            for (Path file : stream) {
                System.out.println(file.toString());
            }
        }

        // List files in jar

        FileSystem fs =  FileSystems.newFileSystem(Paths.get("ajar.jar"), null);
        Path jarDir = fs.getPath("webapp/");

        try (DirectoryStream<Path> stream = Files.newDirectoryStream(jarDir)) {
            for (Path file : stream) {
                System.out.println(file.toString());
            }
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
}


基本上,首先我要从文件系统中的文件夹创建一个DirectoryStream并对其内容进行迭代,输出如下所示:

webapp/afile.txt
webapp/afolder


然后,从包含相同文件夹的jar文件中打开FileSystem,并执行与以前相同的操作。这是相应的输出:

/webapp/afile.txt
/webapp/afolder/


现在,这真的让我发疯了……为什么输出会有所不同?

我可以理解jar输出中的'/'前缀,因为文件位于相对于jar文件系统的根目录中(即使我不认为我仍然接受它),但是目录后的'/'后缀令人发指!

很遗憾,我必须编写不同的代码来处理这两种情况……当然,我在这里夸大了这个问题,并且知道它很容易解决……但还是……为什么?

谢谢大家!

最佳答案

所有评论摘要:


不要依赖字符串版本a路径。直接使用路径。
要区分目录文件,请在路径上使用Files.isDirectory
有相对亲戚的孩子


即您应该能够编写代码来处理这两种情况。这是nio的目的。

回答修改后的问题:

路径p的文件名:p.getFileName()。

p的文件名的字符串表示形式:p.getFileName()。toString()。

该字符串没有斜杠。
例如
fs.getPath(“ abc”,“ def”).getFileName()。toString()->“ def”

07-24 09:47
查看更多