Полностью понимать пути в Java сразу

задняя часть

Введение

Я всегда неоднозначно относился к пути в java. Вроде знаю об этой штуке, но не знаю. Каждый раз, когда я сталкиваюсь с FileNotFound, я иду в Google, чтобы проверить, как использовать этот метод, откуда относительный путь относится к пути и так далее! На самом деле, это просто попытка получить ответ.С точки зрения языка программирования, это программирование в стиле большой удачи.На этот раз я стремлюсь понять проблему пути в java в свое время, и стремлюсь иметь холм в мое сердце для программирования в будущем.

Два, относительный путь и абсолютный путь

"абсолютный путь:"Полное английское название абсолютного пути — Absolute Path, который является реальным путем. Это полный путь в компьютере. Он должен быть точным, иначе его невозможно будет найти. Отправной точкой является корневой каталог системы, который есть каждая буква диска.

"Относительный путь:"Так называемый относительный путь относится к своему собственному целевому местоположению файла. Но самое главное в относительном пути — это относительная концепция: относится ли он к корневому каталогу проекта или к каталогу пути к классам? Это может показаться не очень хорошим, поэтому давайте приведем конкретный пример, чтобы проиллюстрировать, что такое абсолютный путь и что такое относительный путь.

Затем файл a.txt в каталоге ресурсов под модулем javaIO, его абсолютный путь и относительный путь выглядят следующим образом:

"абсолютный путь:" D:\code\River\JavaSE\javaIO\src\main\resources\a.txt

"относительный путь:"Корневой путь относительно проекта: classpath (то есть,"target/classes" )

В-третьих, путь в классе File

В проекте корневой каталог относительного пути является корневой папкой проекта, а способ создания файла:

"относительный путь:"D:\code\River\JavaSE (то есть относительный путь проекта), обратите внимание, что путь не может начинаться с "/"

private static void filePath() {
        File file = new File("javaIO/src/main/java/org/huanghe/stream/Java中字符流与字节流的区别.md");
        System.out.println(file.exists());
        System.out.println(System.getProperty("user.dir"));
    }

"абсолютный путь:"

private static void filePath() {
        File file = new File("D:\code\River\JavaSE\javaIO\src\main\java\org\huanghe\stream\Java中字符流与字节流的区别.md");
        System.out.println(file.exists());
        System.out.println(System.getProperty("user.dir"));
    }

В-четвертых, получить путь к файлу class.getResource и class.getClassLoader

В нашей Java-разработке нам часто нужно получить содержимое файла. Как правило, для его получения мы будем использовать форму файла, например: Я хочу получить "c:\file.txt". В настоящее время мы необходимо создать объект File File file=new FIle("c:\file txt");

Затем используйте класс файла для создания входного потока файла файла: FileInputStream in =new FileInputStream(file), а затем используйте входной поток для выполнения необходимых операций, но у этого есть недостаток, заключающийся в том, что наш путь к файлу является жестким. кодирование, мы настоятельно не рекомендуем этот тип записи в процессе кодирования Java

Конечно, в рамках веб-проекта мы можем получить абсолютный путь к файлу через getRealPath("имя файла") объекта приложения, но это не очень рекомендуется, поэтому мы можем использовать class.getResource(path) и class .getClassLoader(path ) для получения файловых ресурсов, затем давайте изучим разницу между ними:

4.1 class.getResource(path)

Путь параметра имеет две формы: одна начинается с «/», а другая не начинается с «/»;

  • "Представление, начинающееся с '/'": Спуститесь по пути из корневого каталога проекта, получите файл classPath
  • **Не начинается с «/»: **Используйте местоположение объекта этого класса в качестве корневого пути для поиска
 /**
     * 测试class.getResource获取文件路径
     */
    public static void testClassGetResource() {
        System.out.println(_01_JavaFilePath.class.getResource(""));
        System.out.println(_01_JavaFilePath.class.getResource("/"));
    }

Результат:

file:/D:/Code/JavaSE/io/target/classes/com/huanghe/chapter/  : 返回的是 testClassGetResource.class这个类所在的目录
file:/D:/Code/JavaSE/io/target/classes/ : 返回的是 项目的classpath目录的路径

Предполагая, что текущая структура проекта выглядит следующим образом, как получить ее для следующих трех ситуаций:

Способы получения трех файлов, показанных выше:

 /**
     * 测试class.getResource获取文件路径
     */
    public static void testClassGetResource2() {
        System.out.println(_01_JavaFilePath.class.getResource("file/test.properties"));
        System.out.println(_01_JavaFilePath.class.getResource("../txt/01-java-filepath.txt"));
        System.out.println(_01_JavaFilePath.class.getResource("/01-java-filepath.txt"));
    }

Результат:

file:/D:/Code/JavaSE/io/target/classes/com/huanghe/chapter/one/file/test.properties

file:/D:/Code/JavaSE/io/target/classes/com/huanghe/chapter/txt/01-java-filepath.txt

file:/D:/Code/JavaSE/io/target/classes//01-java-filepath.txt

📢: Использование class.getResource() и class.getResourceAsStream() согласовано на пути.

4.2 Class.getClassLoader().getResource(String path)

Путь параметра в этом методе не может начинаться с «/», путь указывает, что ресурс получен из пути к классам

package testpackage;
public class TestMain {
    public static void main(String[] args) {
        TestMain t = new TestMain();
        System.out.println(t.getClass());
        System.out.println(t.getClass().getClassLoader());
        System.out.println(t.getClass().getClassLoader().getResource(""));
        System.out.println(t.getClass().getClassLoader().getResource("/"));//null
    }
}

Выходной результат:

1. class testpackage.TestMain
2. sun.misc.Launcher$AppClassLoader@1fb8ee3
3. file:/D:/Code/JavaSE/io/target/classes
4. null

V. Резюме

  1. Использование путей относительно проекта ненадежно.
  2. Использование пути CLASSPATH надежно.
  3. Чтобы файлы были прочитаны программой, поместите их в CLASSPATH как можно больше, чтобы обеспечить нормальное чтение во время разработки и выпуска.

В этой статье используетсяmdniceнабор текста