MENU

Java中文件读取路径学习记录

November 15, 2017 • Code

前言:对 Java 中文件路径的书写方式做一个简单总结。

相对路径与绝对路径

绝对路径:从硬盘的根开始的路径开始,如 /Users/kbrx93/IdeaProjects/algorithm

相对路径:不是从硬盘的根路径出发的路径,如./algorithm

实质上所有的相对路径都是 API 在底层帮你加上了前面省略的路径,最终还是拼成绝对路径在系统中查找。

Java 工程与 JavaWeb 工程

对比普通 Java 工程和 JavaWeb 工程在文件路径书写上的不同,每个方面又分为硬盘路径和 classpath 路径。

Java 工程

举个栗子,工程目录结构如下:

File 类查找

  • 相对路径(灵活):查找 1.txt,用 File f = new File("1.txt")File f = new File(“./1.txt”)

这种方法底层是用 System.dir 系统变量进行拼接,而 System.dir 指调用这个程序时所在的目录。如果在项目之外的文件夹调用程序,程序就会发生错误,十分不可靠,因此不推荐。

  • 绝对路径(可靠):直接写出完整的硬盘目录,在栗子中为 /Users/kbrx93/IdeaProjects/learnGit/1.txt

classpath 路径查找

classpath 路径是 JVM 虚拟机或 Java 编译器中定义用户本地包及 class 文件的参数。

相对路径

形式为 GetFile.class.getResource("2.txt"),在对应 class 文件目录下查找,因此路径的格式与 class 文件有直接关系。

classpath 根路径

形式为 GetFile.class.getResource("/test/2.txt")/就代表了classpath根路径,在栗子中为 src 目录。

通过类加载器获取(最佳实践)

形式为 GetFile.class.getClassLoader().getResource("test/2.txt"),从 classpath 的根路径出发查找,与 class 类路径无关

用类加载器加载时不能以 / 开始,会报错。可以用 .. 访问上一级目录,但无法跨 jar 包访问。

开发中常用:

// 返回 URL 对象
Thread.currentThread().getContextClassLoader().getResource("1.txt");

// 返回 InputStream 对象
Thread.currentThread().getContextClassLoader().getResourceAsStream("1.txt");

java文件读取的路径问题解惑和最佳实践

JavaWeb 工程

JavaWeb 工程与 Java 工程的文件路径基本一致,只在涉及 web 目录时稍有不同:

  • 在 JavaWeb 工程中,类加载器从 web 应用的 /WEB-INF/class 文件夹下开始查找,并且通过类加载器获取的开头的/可写可不写。

  • Servlet 中,可以用 ServletContext 对象来读取 web 目录,如

// 路径中的 「/」 可写可不写
getServletConfig().getServletContext().getRealPath(“/8888.txt”);

如果使用了相关的框架,框架可能会对其进行功能扩展或包装,参考框架文档关于读取文件部分。

路径跨平台

举个栗子:

// Windows 
File f = new File(“C:\\test\\demo.txt”);

// Linux
File f = new File(“/test/demo.txt”);

// 跨平台版
File f = new File("C:" + File.separator + "test" + File.separator + " demo.txt");

如果路径完全不同,建议使用配置文件。

参考

Last Modified: July 7, 2018
Archives QR Code
QR Code for this page
Tipping QR Code
Leave a Comment