编辑:我改写我原来的问题(我将其保留在底部)
看一下这段代码:
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”