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等)所有文件的绝对路径。
当然,如果文件位于classpath(也就是classes目录)下,我们还可以通过另两种方式来读取。
1、通过字节码对象来读
这种方式与上边Java Project中通过字节码对象读取类路径下文件的方式相同,可参照上边的4.2。
2、通过类加载器来读
这种方式与上边Java Project中通过classloader读取类路径下文件的方式基本相同,可参照上边的4.3。 唯一不同的是:上边的路径只能是相对路径,也就是说不能以“/”开头。而在JavaWeb Project中,可以是相对路径,也可以是绝对路径,也就说你加不加“/”开头效果是一样的。
转载于:https://blog.51cto.com/yuke198907/1340760
Java开发中文件读取方式总结相关推荐
- java中文件读取方式的顺序_java中读取文件的方式
java中读取文件的方式 经常遇到java中读取文件的方式,有时候需要指定编码,有时候不需要指定编码,被搞的挺晕的,抽时间整理了一下java读取文件的方式,主要是对字符型的处理,二进制的暂时不考虑. ...
- java对文件读取_java开发中文件读取的方法总结
1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件 ...
- python的文件读取方式_python中文件读取方式
指\u201CPython编程:从入口到实践\u201D和\u201CPython编程快速启动\u201D1.文件路径获取文件路径包括绝对路径和相对路径.绝对路径是指\u201CE: \\ \\\u2 ...
- java property xml,Java开发中读取XML与properties配置文件的方法
相关阅读: 1. XML文件: 什么是XML?XML一般是指可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言. 2.XML文件的优点: 1)XML文档内容和结构完 ...
- day01--java基础编程:计算机基础知识 ,java语言概述,java开发环境搭建,eclipse概述,创建简单java项目,JDK JRE JVM的关系,java开发中的命名规范,编程风格
1 Day01–Java开发环境+HelloWorld 1.1 计算机基础知识 资料下载网址:刘沛霞 18600949004 code.tarena.com.cn tarenacode code_20 ...
- 编写高质量代码:改善Java程序的151个建议 (第1章 Java开发中通用的方法和准则)
第1章 Java开发中通用的方法和准则 The reasonable man adapts himself to the world;the unreasonable one persists in ...
- Java开发中Netty线程模型原理解析!
Java开发中Netty线程模型原理解析,Netty是Java领域有名的开源网络库具有高性能和高扩展性的特点,很多流行的框架都是基于它来构建.Netty 线程模型不是一成不变的,取决于用户的启动参数配 ...
- Java开发中更多常见的危险信号
在< Java开发中的常见危险信号>一文中,我研究了一些不一定本身就是错误或不正确的做法,但它们可能表明存在更大的问题. 这些"红色标记"类似于"代码气味&q ...
- Java开发中的常见危险信号
在开发,阅读,复审和维护成千上万行Java代码的几年中,我已经习惯于看到Java代码中的某些" 危险信号 ",这些信号通常(但可能并非总是)暗示着代码问题. 我不是在谈论总是错误的 ...
最新文章
- CenOS7中使用Docker安装配置Redis(数据持久化与数据卷映射)
- 思想开放-学数学之人必备的特质(转载)
- java小应用_java小应用
- 大屏数据可视化综合设计
- 优秀logo设计解析_日本的logo设计为什么那么优秀?
- vue 两个日期比较大小
- 第三章 SQL知识点总结
- 使用Ubuntu的Crontab定时任务需要注意的地方
- 使用WEPE一键安装系统
- AutoCAD Civil 3D-装配(标准横断面)
- STM32硬件剖析(STM32F407 定时器功能引脚分配)
- cpan mysql dbd_安装PERL cpan DBD::mysql错误笔记
- Bandizip便携版右键菜单注册
- 全网最详细中英文ChatGPT-GPT-4示例文档-从0到1快速入门AI智能问答应用场景——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)
- BUUCTF-刷题记录-8
- python身体指数BMI
- phpcms默认模板目录解析
- 总包 50W,4 轮拿下阿里 Offer !(真题分享)
- 运用计算机技术创设英语课堂问题场,如何运用信息化技术手段优化英语课堂.docx...
- 1Whatsup-gold14.2安装及激活
热门文章
- 北斗导航 | NB-IoT——了解什么是NB-IoT,与短报文有什么关系
- 新手小白零基础搭建个人博客(二)Hexo搭建
- shtml与php的区别,htm,html.shtml区别
- php正则重复匹配,php – 用于匹配任何长度的所有重复子串的正则表达式
- 【转】程序debug正常release错误
- css 文字重叠_学习过CSS,那你知道BFC是什么吗?
- c语言循环8,C语言8 循环语句 | CN-SEC 中文网
- visual basic.net 2019-当前内存状态、字符串内插、操作系统系统信息
- 【深度学习】翻译:60分钟入门PyTorch(三)——神经网络
- 盘点2020国内本科开设人工智能专业高校