jar文件系统中的目录名称与常规文件系统不同

时间:2014-08-02 12:08:31

标签: java jar java-7 nio

编辑:我正在重述我原来的问题(我把它放在底部)

看看这段代码:

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和没有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/

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

我能理解&#39; /&#39;在jar的输出中有前缀,因为文件在根目录中相对于jar文件系统(即使我不认为我仍然接受它),但是&#39; /&#39;目录之后的后缀是令人发指的!

我很难写出不同的代码来处理这两种情况......当然,我在这里夸大了这个问题,我知道它很容易修复......但仍然......为什么??

谢谢大家!

1 个答案:

答案 0 :(得分:0)

所有评论的摘要:

  • 不要依赖于字符串版本的路径。直接使用路径。
  • 要区分dirs表单文件,请使用路径上的Files.isDirectory
  • 亲戚有亲戚

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

回答修改后的问题:

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

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

此字符串没有斜杠。 例如 fs.getPath(&#34; abc&#34;,&#34; def&#34;)。getFileName()。toString() - &gt; &#34; DEF&#34;