JAVA开发中,免不了要读文件操作,读取文件,首先就需要获取文件的路径。

路径分为绝对路径和相对路径。

在文件系统中,绝对路径都是以盘符开始的,例如C:\abc\1.txt。
什么是相对路径呢?相对路径就是相对与其他文件的路径。比如说有这么一个文件,它的绝对路径是C:\abc\def\2.txt,那么它相对与C:\abc\1.txt的路径就是def\2.txt(也可以写成这种形式:.\def\2.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:\eclipse\workspace\test\bin\。
如果写成这样: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等)所有文件的绝对路径。
当然,如果文件位于classpath(也就是classes目录)下,我们还可以通过另两种方式来读取。
一、通过字节码对象来读
这种方式与上边Java Project中通过字节码对象读取类路径下文件的方式相同,可参照上边的4.2。
二、通过类加载器来读
这种方式与上边Java Project中通过classloader读取类路径下文件的方式基本相同,可参照上边的4.3。 唯一不同的是:上边的路径只能是相对路径,也就是说不能以“/”开头。而在JavaWeb Project中,可以是相对路径,也可以是绝对路径,也就说你加不加“/”开头效果是一样的。 

Java开发中文件读取方式总结的更多相关文章

  1. Java开发系列-文件上传

    概述 Java开发中文件上传的方式有很多,常见的有servlet3.0.common-fileUpload.框架.不管哪种方式,对于文件上传的本质是不变的. 文件上传的准备 文件上传需要客户端跟服务都 ...

  2. 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)

    编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...

  3. Java开发中常用jar包整理及使用

    本文整理了我自己在Java开发中常用的jar包以及常用的API记录. <!-- https://mvnrepository.com/artifact/org.apache.commons/com ...

  4. JAVA开发中相对路径,绝对路径全面总结

    JAVA开发中相对路径,绝对路径全面总结 博客分类: Java综合 JavaJSP应用服务器Servlet网络应用 1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径, ...

  5. Java学习-019-Properties 文件读取实例源代码

    在这几天的学习过程中,有开发的朋友告知我,每个编程语言基本都有相应的配置文件支持类,像 Python 编程语言中支持的 ini 文件及其对应的配置文件读取类 ConfigParse,通过这个类,用户可 ...

  6. Java开发中代码规范有哪些?

    Java开发中所要遵守的编码规范大体上有如下7点.命名规范.注释规范.缩进排版规范.文件名规范.声明规范.语句规范以及编程规范. 1.命名规范 (1)所有的标示符都只能用ASCⅡ字母(A-Z或a-z) ...

  7. Java解决大文件读取的内存问题以及文件流的比较

    Java解决大文件读取的内存问题以及文件流的比较 传统方式 读取文件的方式一般是是从内存中读取,官方提供了几种方式,如BufferedReader, 以及InputStream 系列的,也有封装好的如 ...

  8. 轻松理解 Java开发中的依赖注入(DI)和控制反转(IOC)

    前言 关于这个话题, 网上有很多文章,这里, 我希望通过最简单的话语与大家分享. 依赖注入和控制反转两个概念让很多初学这迷惑, 觉得玄之又玄,高深莫测. 这里想先说明两点: 依赖注入和控制反转不是高级 ...

  9. paip.java 开发中web server的选择jboss resin tomcat比较..

    paip.java 开发中web server的选择jboss resin tomcat比较.. 作者Attilax  艾龙, EMAIL:1466519819@qq.com 来源:attilax的专 ...

随机推荐

  1. 关于MVC中使用dynamic

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA2kAAAB6CAIAAACqQIxZAAAgAElEQVR4nO2dT2wcx53v6zgXAgsYvA

  2. Android 中LinearLayout控件属性

    id             为控件指定相应的ID        text           指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符        g ...

  3. http与https差异

    HTTPS和HTTP的区别: https协议需要到ca申请证书,一般免费证书很少,需要交费. http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议 http的连接很 ...

  4. php函数声明的简单实例

    <?phpecho table(10,5,500);echo table(2,2,400); //函数调用 function table($row,$col,$width){ //通过函数标记t ...

  5. build tree

    有二叉树的前序遍历和后序遍历,构造二叉树 /** * Definition for binary tree * public class TreeNode { * int val; * TreeNod ...

  6. windows通过Composer安装yii2

    1. php.ini 中;extension=php_openssl.dll(取消注释,不然在安装composer过程中会报错) 集成环境最好去php目录中打开php.ini文件,确定;extensi ...

  7. css3 3D盒子效果

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. 这篇blog只是为了发一张图链到UOJ的博客去..

    UOJ卖萌表情,萌萌哒VFK如图.

  9. 【HTTP】Speed and Mobility: An Approach for HTTP 2.0 to Make Mobile Apps and the Web Faster

    This week begins face to face meetings at the IETF on how to approach HTTP 2.0 and improve the Inter ...

  10. Prefixes and Suffixes

    Codeforces Round #246 (Div. 2) D:http://codeforces.com/contest/432/problem/D 题意:给你一个长度不超过10^5的字符串.要你 ...