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. php中include文件夹分析

    include是包含很多php文件的一种汇总:一般放在文件夹最外层. <?php header("content-type:text/html;charset=utf-8") ...

  2. angular 实例笔记之嵌套指令间的传参

    最近在项目中遇到了需要嵌套指令的情况,指令在嵌套后子指令必须获得父指令中的数据来进行判断,但是在写传参的时候遇到了坑,因此记录下来,防止以后遗忘,个人的肤浅理解,欢迎大家留言讨论 首先,关于direc ...

  3. 如何用OS X的Xcode写C语言程序

    声明:以下内容非本人原创,转载于别处.拿出来只是分享给FY们,不喜勿喷!原创地址http://blog.yorkxin.org/posts/2009/03/15/fundamental-c-with- ...

  4. 最常用的动态sql语句梳理——分享给使用Mybatis的小伙伴们!

    公司项目中一直使用Mybatis作为持久层框架,自然,动态sql写得也比较多了,最常见的莫过于在查询语句中使用if标签来动态地改变过滤条件了.Mybatis的强大特性之一便是它的动态sql,免除了拼接 ...

  5. android学习小例子——验证码倒计时按钮

    1.activity_main.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/andro ...

  6. jQuery的preventDefault()

    1. 含义: preventDefault() 方法阻止元素发生默认的行为(例如,当点击提交按钮时阻止对表单的提交). 2. 语法: event.preventDefault() 3. 例子: 防止链 ...

  7. JqueryUI 为什么TypeError: $(...).slides is not a function

    单独写一个html发现一切没有问题,但放在自己的网页中作为一部分却出现了问题,最后发现是那些js文件引入顺序出现了问题,

  8. eclipse设置字体大小

    eclipse是我们常用的开发工具.eclipse中的默认字体往往并不满足我们的需要,我经常要调节一下它的大小或者换一下风格.eclipse中的字体大小怎么改变呢? 工具/原料 eclipse 方法/ ...

  9. java中的信号量Semaphore

    Semaphore(信号量)充当了操作系统概念下的“信号量”.它提供了“临界区中可用资源信号量”的相同功能.以一个停车场运作为例.为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的.这时如果 ...

  10. Java接口修饰符详解

    接口就是提供一种统一的”协议”,而接口中的属性也属于“协议”中的成员.它们是公共的,静态的,最终的常量.相当于全局常量.抽象类是不“完全”的类,相当于是接口和具体类的一个中间层.即满足接口的抽象,也满 ...