zoukankan      html  css  js  c++  java
  • java读取文件的路径问题

    JAVA开发中,免不了要读文件操作,那么JAVA开发读取文件的方法有哪些呢?读取文件首先就需要获取文件的路径。而路径分为绝对路径和相对路径。
    在文件系统中,绝对路径都是以盘符开始的,例如C:abc1.txt。

    什么是相对路径呢?相对路径就是相对与其他文件的路径。比如说有这么一个文件,它的绝对路径是C:abcdef2.txt,那么它相对与 C:abc1.txt的路径就是def2.txt(也可以写成这种形式:.def2.txt)。”.”的意思是当前目录,也就是它所相对的文件所在的目录,在这里就是:C:abc。

    在Java开发中,我们通常会创建两种工程:Java Project和JavaWeb Project。

    一、在Java 
    Project中,我们用的是相对路径。比如我们这里有一个Java工程:test,在test下边会自动创建两个目录:src和bin。

    1、这时候我们如果在test下新建一个文件:1.txt ,那么我们在代码当中就可以这样读取它:File f = new 
    File(“1.txt”),或者写成这样:File f = new File(“./1.txt”);

    2、如果test下新建目录abc ,在abc 下新建文件2.txt,代码读取就是这样:File f = new 
    File(“abc/2.txt”),或者写成这样:File f = new File(“./abc/2.txt”);

    3、如果在src下新建文件3.txt,代码读取就是这样:File f = new File(“src/3.txt”),或者写成这样:File f = 
    new File(“./src/3.txt”);由于src下的所有文件最终会被编译到bin目录下,所以直接读取src下的文件没有多大意义。

    4、如果在src下有一个文件4.txt,我们知道它最终被编译到bin目录下,那么怎么去读取这个编译后的文件呢?有3种方式来读取。

    4.1、直接读取

    File f = new File(“bin/4.txt”),或者写成这样:File f = new File(“./bin/4.txt”);

    由于bin目录(包括web应用中WEB-INF下的classes目录)统称为classpath(类路径),对于类路径下的文件,我们还可以采用下边两种方式来读取。

    4.2、通过字节码对象读取

    假如当前类为:Hello.java,它所在的包是:com.mac.util

    在Hello.java中:String f = 
    Hello.class.getResource(“/4.txt”).getPath();这种以“/”开头的是以绝对路径方式读取,意思是从bin目录下开始读取4.txt,/=D:eclipseworkspacetestbin。

    如果写成这样:String f = 
    Hello.class.getResource(“4.txt”).getPath();这种不以“/”开头的是以相对路径方式读取,意思是从当前类所在的目录下开始读取4.txt,显然是读不到的,改成这样就可以了:String 
    f = 
    Hello.class.getResource(“../../../4.txt”).getPath();“..”代表当前目录的上一级目录,由于当前类所在的包是三层,所以这里使用了三次“..”。

    同理:如果4.txt位于com.mac.util包下,与Hello.class处于同一目录。用绝对路径读就是这样:String f = 
    Hello.class.getResource(“/com/mac/util/4.txt”).getPath();用相对路径读就是这样:String f = 
    Hello.class.getResource(“4.txt”).getPath();注意:相对路径这种读取方式仅限于在 
    和被读取文件位于同一包下的类中可以这么读,其他包中的类是不能这样读取的。

    综上所述:采用相对路径读取文件还要考虑当前类所在的位置,非常麻烦,所以对于classpath下的文件,我们统一采用绝对路径方式来读取。

    4.3、通过类加载器读取

    String f = 当前类名.class.getClassLoader().getResource(“4.txt”).getPath();

    注意:通过类加载器读取只能使用相对路径,如果使用绝对路径就读取不到了,比如改成这样:String f = 
    当前类名.class.getClassLoader().getResource(“/4.txt”).getPath();就不行。

    如果把4.txt放到com.mac.util包下,读取代码:String f = 
    当前类名.class.getClassLoader().getResource(“com/mac/util/4.txt”).getPath();

    可以看出,通过classloader读的话,它只会从classpath下开始读取,并且不能以“/”开头。

    特别的是:1、当前类名.class.getResource()的返回值类型是URL;同时还有一个方法:当前类名.class.getResourceAsStream(),它的返回值类型是InputStream,是一个字节读取流。在开发中可以根据需要选择相应的方法。

    2、要读取文件,文件首先必须真实存在,要不然返回的URL就等于Null。

    二、在JavaWeb Project中,使用相对路径是读不到文件的,因为JavaWeb Project与Java 
    Project不同,项目最终要部署在web服务器中,文件只能使用绝对路径来读取。

    比如我使用的IDE是eclipse,建立一个web 
    project:day01,在WebContent(工程根目录)下有一个文件1.txt,那么就可以通过ServletContext对象来读取了。

    比如在servlet中,可以这样:getServletConfig().getServletContext().getRealPath(“/1.txt”);这种方式只是获取文件的路径字符串,并不会检查是否真的存在这样一个文件。

    比如我把1.txt删除,执行上边代码仍然可以打出路径:...../apache-tomcat-7.0.42/webapps/day01 
    /1.txt。并且这里的路径可以是绝对路径也可以是相对路径,取得的效果是一样的。比如写成这样也是可以的:getServletConfig().getServletContext().getRealPath(“1.txt”);

    如果在WEB-INF下有一个文件2.txt,读取:getServletConfig().getServletContext().getRealPath(“/WEB-INF/2.txt”);也就是说通过ServletContext对象可以获取web工程根目录及其子目录(包括WEB-INF、classes等)所有文件的绝对路径。

    当然这样是在启动web容器才可以读取的,那么我们怎么在不启动web容器的情况下又可以读取文件呢,那么还是可以通过我们前面的两种方式来读取,其实说白了web工程本质上也就是一个java工程。

    1、通过字节码对象来读取

    通过字节码读取的类路径是在classpath目录读取的,也就是web项目跟目录的WEB-INF下class目录,即path=XXX.class.getResource("/").getPath()得到就是class目录的绝对路径了的字符串了,稍微修改一下去掉class,path=path.subString(1,path.indexof("class"));就可以去掉末尾的class了,注意如果路径是带有空格的话,可以看到打印输出的路径的空格会变成“%20”,那么我还要将他换回来,path=path.replace("$20","这里有个空格");这样就可以得到我们想要的路径了。

    2、通过类加载器来读

    这种方式与上边Java Project中通过classloader读取类路径下文件的方式基本相同,可参照上边的4.3。 
    唯一不同的是:上边的路径只能是相对路径,也就是说不能以“/”开头。而在JavaWeb 
    Project中,可以是相对路径,也可以是绝对路径,也就说你加不加“/”开头效果是一样的。

  • 相关阅读:
    day15---作业
    day14---函数的参数
    day14作业
    day--13函数的基本使用
    day13--函数练习(作业)
    day12--文件处理
    day12--作业
    Python函数对象、函数嵌套和闭包函数
    每日作业以及周末作业
    Python名称空间与作用域
  • 原文地址:https://www.cnblogs.com/vegetate/p/9997335.html
Copyright © 2011-2022 走看看