java中使用相对路径读取文件的写法总结

java中使用相对路径读取文件的写法总结 ,以及getResourceAsStream() (转)

读取文件的写法,相对路径

在当前的目录结构中读取test.txt的有四种写法

  • 简单粗暴的 File file = new File(“src/test.txt”)
  • 使用类的相对路径
  • 使用当前线程的类加载器
  • 读取web工程下的文件 使用getRealPath()读取

File file = new File("src/test.txt");
File file = new File(TestRelativePath.class.getResource("/test.txt").getFile());
File file = new File(Thread.currentThread().getContextClassLoader().getResource("test.txt").getFile());
File file = new File(getServletContext().getRealPath("/WEB-INF/classes/test.txt"));

下面我来一一介绍:

简单粗暴的 File file = new File(“src/test.txt”);

复制代码

  @Test
    /**
     * 这种方法 “” 空代表的是 这个Java项目 TestSomeTechnology  由于实际项目在打包后没有src目录 所以这种方法不常用
     */
    public  void  testMethod1() throws IOException{
        File file = new File("src/test.txt");
        BufferedReader br = new BufferedReader(new FileReader(file));
        String len = null;
        while ((len=br.readLine())!=null){
            System.out.println(len);
        }
    }

复制代码

使用类的相对路径

TestRelativePath.class.getResource(“/test.txt”).getFile()

复制代码

 @Test
    /**
     * 使用类的相对路径
     * 这种方法 “/” 代表的是bin。  src文件夹和resources 文件夹下的的东西都会被加载到bin下面 因为这两个文件被配置为了source
     */
    public  void  testMethod2() throws IOException{

        File file = new File(TestRelativePath.class.getResource("/test.txt").getFile());
        BufferedReader br = new BufferedReader(new FileReader(file));
        String len = null;
        while ((len=br.readLine())!=null){
            System.out.println(len);
        }
    }

复制代码

使用当前线程的类加载器

Thread.currentThread().getContextClassLoader().getResource(“test.txt”).getFile()

复制代码

@Test
    /**
     * 这种是通过当前线程的类加载器
     * 这种方法 “ ” 空代表的是bin 。 于是就直接填写test,文件夹下的的东西都会被加载到bin下面,因为这两个文件被配置为了source
     */
    public  void  testMethod3() throws IOException{

        File file = new File(Thread.currentThread().getContextClassLoader().getResource("test.txt").getFile());
        BufferedReader br = new BufferedReader(new FileReader(file));
        String len = null;
        if ((len=br.readLine())!=null){
            System.out.println(len);
        }
    }

复制代码

读取web工程下的文件 使用getRealPath()读取

目录如下 :

读取 index.jsp

复制代码

@WebServlet(name = "TestServlet",urlPatterns = "/TestServlet")
public class TestServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
    }

    /**
     *  web工程的根目录是 webRoot, 使用 “/” 代表webroot webroot下面有index.jsp文件
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        File file = new File(getServletContext().getRealPath("/index.jsp"));
        BufferedReader br = new BufferedReader(new FileReader(file));
        String len = null;
        while ((len=br.readLine())!=null){
            System.out.println(len);
        }
    }
}

复制代码

读取 test.txt文件 
不过如果想读取test.txt 的话 我们可用用上面的方式

 File file = new File(Thread.currentThread().getContextClassLoader().getResource("test.txt").getFile());

也可以使用 getRealPath() 
不过由于是以 webroot为根目录 我们需要从classes里面读:idea的classes等价于esclipse的classpath 。classes说明:

代码:

File file = new File(getServletContext().getRealPath("/WEB-INF/classes/test.txt"));

getResourceAsStream()方法详解

getResourceAsStream()用法与getResouce()方法一样的,用getResource()取得File文件后,再new FileInputStream(file) 与 getResourceAsStream() 的效果一样。。

 两个代码效果一样

InputStream inputStream1 = new FileInputStream(new File(Thread.currentThread().getContextClassLoader().getResource("test.txt").getFile()));
InputStream inputStream2 = Thread.currentThread().getContextClassLoader().getResourceAsStream("test.txt");
<think>好的,我现在要帮用户理解绝对路径和相对路径的概念、用法、区别以及使用场景,还要给出示例。首先,我需要回忆一下自己学过的相关知识,确保准确。 绝对路径是从根目录开始的完整路径,无论在哪个目录下都能准确定位到文件。比如在Windows里可能是C:\Users\name\file.txt,而Linux是/home/name/file.txt。相对路径则是相对于当前工作目录的路径,比如./docs/file.txt或者../images/pic.jpg。这点我记得没错吧?得确认一下不同操作系统的路径表示,比如Windows用反斜杠,Linux用正斜杠,但在编程中有时需要转义或者统一用斜杠。 接下来,用户想知道如何使用它们。绝对路径直接写完整路径,适用于需要精准定位的情况,比如服务器配置文件相对路径则更适合项目内部的文件引用,方便迁移,因为路径不依赖当前环境。比如在Web开发中,图片或CSS文件经常用相对路径,这样整个项目移动位置时路径不会失效。 区别方面,绝对路径的精确度高,但缺乏灵活性;相对路径更灵活但依赖于当前目录。使用场景的话,绝对路径适合外部资源或固定位置的文件相对路径适合项目内部的结构。需要举例说明,比如代码中读取文件,用绝对路径的话,路径写死,换环境可能出错,而相对路径基于当前脚本位置,更可靠。 示例部分,用户给的引用里有Python和Java的例子。比如Python中使用os模块获取当前目录,然后拼接相对路径,这样更安全。Java里用绝对路径直接指定文件位置。这些例子可以整理一下,让用户更清楚不同语言中的实现方式。 还要注意用户可能遇到的常见问题,比如相对路径的起点是什么,如何确定当前工作目录,这在不同的执行环境下可能会有变化。比如在命令行运行脚本时,当前目录是执行命令的位置,而不是脚本所在位置,这时候可能需要用__file__来获取脚本路径,再拼接相对路径,避免错误。 使用场景方面,绝对路径适用于需要明确指定位置的情况,比如系统配置文件、日志文件存放的固定位置。相对路径在Web应用、项目内部模块间引用资源时更常用,方便整体迁移和团队协作。 最后要生成相关问题,覆盖概念、区别、使用示例、常见错误等,帮助用户深入理解。比如如何避免相对路径的错误,或者在不同操作系统中处理路径差异的方法。 总结一下,我需要分点解释概念,对比区别,给出具体示例,并说明适用场景,最后提出相关问题。确保用中文表达,行内公式正确,独立公式单独成段,引用正确的来源。检查是否有遗漏点,比如路径的写法在不同系统中的注意事项,或者编码时如何处理路径分隔符,这些可能也需要提及,但用户的问题主要集中在概念和使用上,所以可能不需要太深入系统细节。</think>### 文件的绝对路径与相对路径详解 #### 一、概念与核心区别 1. **绝对路径** - 从文件系统的根目录(如Windows的`C:\`或Linux的`/`)开始的完整路径,唯一标识文件位置。 - 示例:Windows中的`C:\Users\user\data.txt`,Linux中的`/home/user/docs/report.pdf`[^2][^5]。 2. **相对路径** - 相对于当前工作目录的路径,需结合当前目录才能定位文件。 - 示例:`./images/photo.jpg`(当前目录下的`images`文件夹)、`../config/settings.yml`(上级目录的`config`文件夹)[^3]。 #### 二、使用方式与示例 1. **绝对路径使用** - **直接指定完整路径**:适合需要精准定位的场景(如系统配置文件)。 - **代码示例**: ```python # 读取Windows绝对路径文件 with open('C:\\data\\input.txt', 'r') as file: content = file.read() ``` ```java // Java中通过绝对路径实例化File对象 File file = new File("/home/user/data.txt"); ``` 2. **相对路径使用** - **基于当前目录**:适合项目内部文件引用(如Web资源)。 - **代码示例**: ```python import os # 获取当前脚本所在目录,并拼接相对路径 current_dir = os.path.dirname(__file__) file_path = os.path.join(current_dir, 'data', 'input.txt') ``` ```html <!-- HTML中引用相对路径图片 --> <img src="images/logo.png" alt="Logo"> ```[^3] #### 三、对比与适用场景 | **特性** | **绝对路径** | **相对路径** | |----------------|---------------------------|---------------------------| | **精确度** | 高(固定根目录起点)[^4] | 依赖当前目录,可能变化 | | **灵活性** | 低(路径硬编码) | 高(便于迁移) | | **适用场景** | 系统级配置、固定位置文件 | 项目内部资源、跨环境协作 | #### 四、常见问题与注意事项 1. **路径分隔符差异** - Windows默认用`\`,Linux/macOS用`/`。编程时可统一使用`/`或在代码中动态处理(如Python的`os.path.join`)。 2. **相对路径起点** - 执行脚本时的“当前目录”可能与脚本所在目录不同,建议用`__file__`或`os.getcwd()`明确路径起点[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值