Имя каталога из файловой системы jar отличается от обычной файловой системы

1

EDIT: Я перефразирую свой оригинальный вопрос (я держу его внизу)

Взгляните на этот код:

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

Затем я открываю FileSystem из файла jar, который содержит одну и ту же папку и выполняет то же самое, что и раньше. Это соответствующий результат:

webapp/

Есть ли причина для получения конечного "/" в имени папки 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

Затем я открываю FileSystem из файла jar, который содержит одну и ту же папку и выполняет то же самое, что и раньше. Это соответствующий результат:

/webapp/afile.txt
/webapp/afolder/

Теперь, это действительно сводит меня с ума... почему на выходе будет отличаться?

Я могу понять префикс '/' в выводе jar, так как файлы находятся в корне относительно файловой системы jar (хотя я не думаю, что я все еще принимаю его), но суффикс '/' после того, как каталог возмутительно !

Это отстой, что я должен написать другой код для обработки двух случаев... Конечно, здесь я преувеличиваю проблему, и я знаю, что это легко исправлено... но все же... почему?

Спасибо, ребята!

  • 0
    Есть ли на самом деле функциональная разница в том, как вы взаимодействуете с Path кроме вывода toString ?
  • 0
    @BrettOkken до сих пор я не нашел функциональных отличий ...
Показать ещё 5 комментариев
Теги:
jar
nio
java-7

1 ответ

0

Резюме всех комментариев:

  • Не полагайтесь на строковую версию Path. Используйте пути напрямую.
  • Чтобы различать файлы формы dirs, используйте File.isDirectory на пути
  • относительные дети имеют относительные дети

т.е. вы должны иметь возможность писать код для обработки обоих случаев. Это то, что для nio.

Ответ на измененный вопрос:

Имя файла пути p: p.getFileName().

Строковое представление имени файла p: p.getFileName(). ToString().

Эта строка не имеет косой черты. например, fs.getPath("abc", "def").getFileName(). toString() → "def"

  • 0
    Конечно, я бы не стал полагаться на toString для функциональных целей ... Я не понимаю, что ваши "относительные каталоги имеют относительных дочерних элементов" ... и "webapp / afolder", и "webapp / afolder /" являются относительными, не так ли? т они?
  • 0
    @ jamp да, но / webapp / afolder абсолютно. Поток каталога с абсолютным путем создает абсолютный дочерний путь. Поток относительного пути создает относительные пути.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню