JavaWeb中读取文件资源的路径问题

  在做javaweb开发的时候,我们可能会需要从本地硬盘上读取某一个文件资源,或者修改某一个文件,这个时候就需要先找到这个文件,然后用FileInputStrem等文件字节。字符流来将这个文件读取到内存中,再对其进行修改等的操作。那么在找这个文件的过程中就涉及到一个路径的问题--->怎么正确的找到这个文件呢?

有两种可行的方法:一、绝对硬盘路径;二、相对路径。。来来来,我们掰扯一下这两种方法的不同-------

一、硬盘绝对路径

  如图,我的E盘下面有个path文件夹,里面有一个1.txt的文件,,现在在Servlet中用绝对路径读取。

public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
    String path = "E:\\path\\1.txt";
    File file = new File(path);
    System.out.println(file.getAbsolutePath());//输出读取到的文件路径
}

 访问这个servlet,结果读取正常

但是呢,这样写真的好吗???我们知道,一个web应用可能会存在一个更换服务器的情况,,,如果是一个上线的项目,一旦服务器换了,那么新换的服务器会存在E:\path\1.txt这个文件路径吗???答案:NO,所以---绝对路径虽然可以解决问题,但是很不利于维护及项目搬迁。

那么,,相对路径呢??

二、相对路径

  所谓行对路径,,指的是相对于整个web应用在硬盘上的路径来说的,,来来来,我们演示一下。。。

首先,在我的web应用下的WenRoot下面有一个1.txt文件,,怎么读它呢?(注意啊,web应用都是发布到tomcat的webapps下面执行的)

可能我们会在servlet中这样写路径来读取:

哎哎哎,,等一下,,我要读的是web应用下得文件啊,,你丫怎么跑到tomcat/bin下面找了!!!!(我的tomcat/bin下面可没这个文件,,所以肯定读取不到)

那么,为什么会去tomcat/bin下面读呢?这就得说说Java文件读取的机制了:如果你直接这样写路径new File("a.***");那么tomcat就会从程序启动的地方去找这个文件(Java项目中也是如此),那么web应用是从有tomcat来执行的,,tomcat这个程序是从哪里启动的呢??答对了,就是tomcat/bin/startuo.bat启动的。

so。。这样写肯定找不到的,,,那么怎么找??

方法1、servlet中用ServlertContext域的getRealPath()这个方法找

简单代码如下:

哎,这才对嘛,,我的项目是发布到tomcat的webapps文件夹下的,,这样才对嘛。。。所以是怎么一个原理呢?

对于ServletContext().getRealPath("路径名A");这个方法,无论你的路径名A是什么,ServletContext().getRealPath()方法底层都会在路径名A前拼上当前web应用的硬盘路径,,这样加上你传进去的路径就可以找成功找到了

小结一下:其实通过ServletContext().getRealPath来拼接路径只是绝对硬盘路径的升级版,,,但是它好久好在计时你的web应用换了服务器环境,只要你的文件在web应用的中的相对路径不变,那么不论你的web应用如何更换服务器环境,都能动态的获取当前服务器环境的绝对文件路径。

当然,上面的getRealPath()方法只能在servlet中使用(因为只有servlet才有ServletContext域对象),在MVC模式中,很多时候servlet并不是来做处理请求的,跟多的是进行一个转发操作,那么,如果是在servlet中调用普通的Java类来读取文件呢???怎么读文件?

如果只是普通的java类,那么你也可以直接使用绝对硬盘路径,,但同样,服务器环境换了之后就可能会挂掉。可以通过类加载器ClassLoader类的getResource()方法来加载文件。。原理是:

类加载器是从你的web应用的WEB-INF\class文件夹下找.class文件来加载的。所以呢,你要找的web应用中的文件只要相对于你的class文件夹找就可以了。

来,我们try一try。。。新建一个普通的Java类PathofJava.java,

在servlet中调用这个类的method()方法,访问一下这个servlet---

所以正确的方法是用类加载器去找:

为什么要用../../1.txt呢?因为1.txt做i中发布到tomcat中web应用下去了,跟index.jsp平级,所以用../(表示上级目录)来找

小结一下:其实类加载器也是搞出来一个绝对硬盘路径来找文件的,只是这个绝对路径是随着web应用的路径变化而变化的,就不存在web应用换了服务器环境找不到资源的问题了

附上整个test项目的结构

时间: 2024-10-25 19:14:54

JavaWeb中读取文件资源的路径问题的相关文章

JavaWeb中读取文件资源的路径问题 -- 转自新浪博客

在做javaweb开发的时候,我们可能会需要从本地硬盘上读取某一个文件资源,或者修改某一个文件,这个时候就需要先找到这个文件,然后用FileInputStrem等文件字节.字符流来将这个文件读取到内存中,再对其进行修改等的操作.那么在找这个文件的过程中就涉及到一个路径的问题--->怎么正确的找到这个文件呢? 有两种可行的方法:一.绝对硬盘路径:二.相对路径..来来来,我们掰扯一下这两种方法的不同------- 一.硬盘绝对路径 如图,我的E盘下面有个path文件夹,里面有一个1.txt的文件,,

文件_ _android从资源文件中读取文件流并显示的方法

======== 1   android从资源文件中读取文件流并显示的方法. 在android中,假如有的文本文件,比如TXT放在raw下,要直接读取出来,放到屏幕中显示,可以这样: private void doRaw(){ InputStream is = this.getResources().openRawResource(R.raw.ziliao); try{ doRead(is); }catch(IOException e){ e.printStackTrace(); } } pri

R中读取文件,找不到路径问题 No such file or directory

  R中读取文件,找不到路径问题 No such file or directory 近日,读取文件时.出现例如以下问题 > passenger = read.csv('international-airline-passengers.csv',sep=',') Error in file(file, "rt") : 无法打开链结 此外: Warning message: In file(file, "rt") : 无法打开文件'international-a

JavaWeb中的文件上传和下载功能的内容就这么多

一.开发环境搭建 创建一个FileUploadAndDownLoad项目,加入Apache的commons-fileupload文件上传组件的相关Jar包,如下图所示: 二.实现文件上传 2.1.文件上传页面和消息提示页面 upload.jsp页面的代码如下: 1<%@ page language="java" pageEncoding="UTF-8"%> 2<!DOCTYPE HTML> 3<html> 4<head>

PHP中读取文件的几个方法

整理了一下PHP中读取文件的几个方法,方便以后查阅. 1.fread string fread ( int $handle , int $length ) fread() 从 handle 指向的文件中读取最多 length 个字节.该函数在读取完最多 length 个字节数,或到达 EOF 的时候,或(对于网络流)当一个包可用时,或(在打开用户空间流之后)已读取了 8192 个字节时就会停止读取文件,视乎先碰到哪种情况. fread() 返回所读取的字符串,如果出错返回 FALSE. <?ph

javaWeb中的文件上传下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

[笨木头Unity3D]杂记003&#183;Unity在Android中读取文件

这周被一个问题给折腾了几个晚上,那就是在Android中读取文件,这本是一件很简单的事情,可想象总是美好的. 笨木头花心贡献,啥?花心?不,是用心. 转载请注明,原文地址:http://www.benmutou.com/archives/2094 文章来源:笨木头与游戏开发 1.在电脑上读取文件 首先要解决的当然是在电脑上读取文件了,这个并不难,网上一堆资料. 比如: public static string LoadFile(string filePath) { string url = Ap

javaweb中静态文件的处理方法

方案一:激活Tomcat的defaultServlet来处理静态文件 在web.xml中添加: <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-

android 从assets和res中读取文件

11. assets文件夹资源的访问 assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件. 1. 先在Activity里面调用getAssets()来获取AssetManager引用. 2. 再用AssetManager的open(String fileName, int accessMode)方法则指定读取的文件以及访问模式就能得到输入流InputStream. 3. 然后就是用已经open file 的inputStream读取文件,读取