在javaweb中通过servlet类和普通类读取资源文件
javaweb有两种方式读取资源文件
在Servlet中读取,可以使用servletContext,servletContext可以拿到web所有的资源文件,然后随便读,但是这种方法不常用,尽量少在Servlet中读取资源文件
在普通Java类中(DAO中),使用类加载器来读 和 绝对路径来读取
类装载器可以访问的范围是classes文件夹下的文件
src文件夹下面的文件在发布之后都会在classes文件夹下,也就是整个类加载器,都可以通过类加载器来操作
1. 使用servletContext
软件开发中,用作资源文件(配置文件)的文件类型有两种:xml文件和properties文件
比如新建一个properties文件,用作数据库的配置
url=jdbc\:mysql\://localhost\:3006/test username=test password=123
然后在Servlet中读取文件
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {InputStream instream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.propertites"); Properties pro = new Properties(); //map pro.load(instream);String url = pro.getProperty("url");String username = pro.getProperty("username");System.out.println(url);System.out.println(username);}
其中路径不能写成"/src/db.propertites", / 表示当前web程序
因为最终读取的是发布在服务器中的文件。都是在classes文件夹下面
对于properties文件的操作都可以使用properties这个类
这个类是把文件中的数据以map形式存储,
有几行就会有几个元素
注意:
我们在写Java的时候常用下面这种方式读取文件,但是在javaweb中是不行的
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {FileInputStream instream = new FileInputStream("/WEB-INF/classes/db.propertites"); Properties pro = new Properties(); //map pro.load(instream);String url = pro.getProperty("url");String username = pro.getProperty("username");System.out.println(url);System.out.println(username);}
FileInputStream instream = new FileInputStream("/WEB-INF/classes/db.propertites");
考虑清楚这个相对路径是相对谁的。
这句话是由服务器来调用,服务器由Java虚拟机来运行,所以这个是相对Java虚拟机的启动目录
Java虚拟机的目录是?
我们启动服务器都是在C:\tomcat\bin目录下的startup.bat,启动的时候同时启动虚拟机
所以是相对的是这个目录。。
所以,在javaweb中读取文件,用Servlet不能使用这种方式,这种方式必须把文件放在Java虚拟机目录下
传统方式也不是不可行,必须要知道文件的绝对路径
使用servletContext先得到文件在磁盘的绝对路径。
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String path = this.getServletContext().getRealPath("/WEB-INF/classes/db.propertites")FileInputStream instream = new FileInputStream(path); Properties pro = new Properties(); //map pro.load(instream);String url = pro.getProperty("url");String username = pro.getProperty("username");System.out.println(url);System.out.println(username);}
这中方式可以得到该文件的名称。
因为有时间文件名称是客户机传过来的,开发者需要知道
就需要截取path字符串了。
path.substring(path.lastIndexOf("\\") +1)
2. 使用类装载器
对数据库配置文件的读取,一般是不放在servlet中的,一般是放在DAO类中
这样才能把web层和数据层分开来
类装载器:
Java虚拟机使用每一个类的第一件事情就是将该类的字节码装载近来,装载类字节码的功能是由类装载器完成的,类装载器负责根据一个类的名称来定位和生成类的字节码数据后返回给Java虚拟机。最常见的类装载器是将要加载的类名转换成一个.class文件名,然后从文件系统中找到该文件并读取其中的内容,这种类装载器也不是直接将.class文件中的内容原封不动地返回给Java虚拟机,它需要将.class文件中的内容转换成Java虚拟机使用的类字节码。不管类装载器采用什么方式,只要能够在内存中制造出给Java虚拟机调用类字节码即可,所以把类装载器描述为类字节码的制造器更容易让人理解。
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {userDAO dao= new userDAO();dao.update();}
public class userDAO {public void update() throws IOException {InputStream instream =userDAO.class.getClassLoader().getResourceAsStream("db.propertites"); Properties pro = new Properties(); //map pro.load(instream);String url = pro.getProperty("url");String username = pro.getProperty("username");System.out.println(url);System.out.println(username);}}
其中userDAO.class.getClassLoader
得到类装载器
因为他们都是在Classes文件夹下面,所以可以访问到该文件
由于对数据库的操作方法有很多,不能每个方法里面都写这种,所以可以使用静态代码块的方式。
public class userDAO {private static Properties dbconfig =new Properties();static{try {InputStream instream =userDAO.class.getClassLoader().getResourceAsStream("db.propertites");dbconfig.load(instream);} catch (Exception e) {throw new ExceptionInInitializerError(e);}}public void update() throws IOException { System.out.println(dbconfig.getProperty("url")); }public void find() throws IOException { }public void delete() throws IOException { }}
使用类装载器读取文件的弊端:
1.文件不能太大,因为它是以装载类的方式一次性加入内存中
2.类装载器只会加载一次,就是说不能显示文件的更新操作
3.使用绝对路径读取
如果需要读到实时数据,就不能通过类装载器来读文件,需要通过普通的文件路径的方式
还是要通过类装载的方式来得到文件的位置
public class DAO {public void update() throws IOException{String path = DAO.class.getClassLoader().getResource("db.properties").getPath();FileInputStream in= new FileInputStream(path);Properties pros = new Properties();pros.load(in);String url = pros.getProperty("url"); }}
转载于:https://www.cnblogs.com/tech-bird/p/3843832.html
在javaweb中通过servlet类和普通类读取资源文件相关推荐
- javaWeb项目之Servlet学习笔记----ServletContext的读取方法
https://www.cnblogs.com/fjdingsd/p/4846727.html ServletContext类中有这么四个方法: getRealPath(String path) ge ...
- 从jar包中读取资源文件
:[解惑]深入jar包:从jar包中读取资源文件 精华帖 (3) :: 良好帖 (15) :: 新手帖 (9) :: 隐藏帖 (0) 作者 正文 Heart.X.Raid 等级: 性别: 文章: 72 ...
- [Java基础] 深入jar包:从jar包中读取资源文件
转载: http://hxraid.iteye.com/blog/483115?page=3#comments 我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的 ...
- 深入jar包:从jar包中读取资源文件
我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了.看看 ...
- java+读取source资源_如何从JavaJAR文件中读取资源文件?
如何从JavaJAR文件中读取资源文件? 我试图从一个单独的JAR文件中访问一个XML文件,这个JAR是作为桌面应用程序运行的.我可以获得我需要的文件的URL,但是当我将它传递给FileReader( ...
- java jar包资源文件_深入jar包:从jar包中读取资源文件
我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了.看看 ...
- java 如何读取jar包内资源文件_【解惑】深入jar包:从jar包中读取资源文件
我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等).在单独运行的时候这些简单的处理当然不会有问题.但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了.看看 ...
- 在WinRT中读取资源文件
在.Net Framework程序中,我们经常以如下方式读取程序集中的资源文件: Assembly readAssembly = Assembly.GetExecutingAssembly(); ...
- Delphi中,如何读取资源文件?
Delphi中,如何读取资源文件? Delphi / Windows SDK/API http://www.delphi2007.net/DelphiMultimedia/html/delphi_20 ...
最新文章
- 【转】android中如何查看某个线程的logcat--不错
- 【sparse coding】【转】sparse coding稀疏表达论文列表
- Android JNI 编程
- Apsara Clouder专项技能认证:实现调用API接口
- Pycharm 项目运行的多种技巧
- 斐波那契回调线怎么画_外汇MT4平台上的斐波那契回调线怎么使用
- Lync 2013企业实战(三)
- 关于C# .net JavaScript跨域
- Storm-源码分析-Streaming Grouping (backtype.storm.daemon.executor)
- socket.io实现简单多人聊天室
- ubuntu串口调试工具RS485
- 网络空间安全态势感知技术
- 计算机用户删除了怎么恢复出厂设置,四种电脑快速恢复出厂设置方法
- 数据分析——KMeans聚类算法
- python根据词性进行词频统计_如何根据词性来确定语篇中的词频?
- 面试案例-String Interpolation的实现(Java实现)
- 一款集成微信小助手的mac微信最新版!支持发朋友圈!
- oa系统客户端服务器ip端口,致远oa客户端服务器ip
- 淘宝H5端 商品数据详情解析接口,sign算法
- 用AS实现微信界面设计
热门文章
- servlet容器_SpringBoot是否内置了Servlet容器?
- C/C 代码规范注释有哪些讲究?
- 在线画 有穷状态自动机 的软件_怎么画思维导图?不用下载软件,在线就能操作...
- bfc是什么_全面分析总结BFC原理及实践
- python用pip安装numpy mac_小白入门Python,mac下如何安装pip、ipython
- 国内外知名工业交换机品牌有哪些?
- 工业交换机的日常维护保养该怎么做?
- 【渝粤教育】21秋期末考试成本会计10168k2
- 【渝粤教育】国家开放大学2018年春季 8617-21T燃气仪表与自动化 参考试题
- 【渝粤题库】广东开放大学 岭南文化概论专科 形成性考核