Введение
Я всегда неоднозначно относился к пути в 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. Резюме
- Использование путей относительно проекта ненадежно.
- Использование пути CLASSPATH надежно.
- Чтобы файлы были прочитаны программой, поместите их в CLASSPATH как можно больше, чтобы обеспечить нормальное чтение во время разработки и выпуска.
В этой статье используетсяmdniceнабор текста