小谈——读取web资源文件的方式和路径问题

读取web资源文件的方式

a): 采用servletContext对象获得.

  优点: 任意文件,任意路径都可获得

  缺点: 必须在web环境下

// 拿到全局对象
        ServletContext sc = this.getServletContext();

        // 获取p1.properties文件的路径
        String path = sc.getRealPath("/WEB-INF/classes/p1.properties");

b): 采用resourceBundle获得

  优点: 非web环境下

  缺点: 只能获取properties文件

// 采用resourceBunble拿取资源文件:获取p1资源文件的内容 默认路径是src,对用到web环境就是classes目录
    public void test21() {
        // 拿取ResourceBundle对象(专门用来获取properties文件的信息)
        ResourceBundle rb = ResourceBundle.getBundle("p1");
        // 拿取文件中的内容
        System.out.println(rb.getString("k"));
    }

c): 采用类加载器获得

优点: 任意路径,任意文件(文件不能过大)

// 获取类加载器的方式
        /*
         * 1. 通过类名 ServletContext.class.getClassLoader() 2. 通过对象
         * this.getClass().getClassLoader() 3. Class.forName()
         * 获取Class.forName("ServletContext7").getClassLoader()
         */
        URL url  = this.getClass().getClassLoader().getResource("p1.properties") ;
        String path = url.getPath() ;

读取web资源文件

读取工程中的资源文件,Java中的IO流其实就可以完成,下面使用Java中的IO流完成读取资源文件。

  • 首先在Web工程中,创建四个资源文件。

2 在Web工程的根目录下创建1.txt。

2 在Web工程的WebRoot目录下创建2.txt。

2 在Web工程的WebRoot目录的WEB-INF目录下创建3.txt。

2 在Web工程的src目录下创建4.txt。

  • 创建一个Java文件用于读取上述的四个资源文件。
public class ReaderFileTest {
    // 编写readfile()方法完成资源文件的读取工作.
    public static void readfile(String fileName) throws Exception{
        BufferedReader reader = new BufferedReader(new FileReader(fileName));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        reader.close();
    }

    public static void main(String[] args) throws Exception {
        // 读取1.txt
        String filename1 = "1.txt";
        readfile(filename1);
        // 读取2.txt
        String filename2 = "WebRoot/2.txt";
        readfile(filename2);
        // 读取3.txt
        String filename3 = "WebRoot/WEB-INF/3.txt";
        readfile(filename3);
        // 读取4.txt
        String filename4 = "src/4.txt";
        readfile(filename4);
    }
}
  • 运行该Java文件会在控制台打印响应信息。

如果要想利用Servlet API的内容来读取Web工程中的资源文件,又要如何来做呢?ServletContext对象的getRealPath()方法可以来完成此项工作。

  • 创建一个自定义Servlet,使用ServletContext对象的getRealPath()方法来完成读取资源文件。
public class ReadFileServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        InputStream in = getServletContext().getResourceAsStream("/WEB-INF/classes/4.txt");
        IOUtils.copy(in, out);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

还有一种通用的方法:利用Class类的getResource()方法也可以完成读取资源文件的工作。

public class ReadFileServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 利用类加载器读取Web工程的资源文件
        String filename = ReadFileServlet.class.getResource("/4.txt").getFile();
        InputStream in = new FileInputStream(new File(filename));
        IOUtils.copy(in, out);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

IOUtils.copy(in, out)用来复制文件的工具类

    public class IOUtils{
public void copy(InputStream in,OutputStream out) throws IOException{
        //创建具体的流对象
                BufferedInputStream buffis = new BufferedInputStream(in);
                BufferedOutputStream buffos = new BufferedOutputStream(out);

                byte [] buf = new byte[1024];
                int len = 0;
                while((len = buffis.read(buf)) !=-1){
                    buffos.write(buf, 0, len);
                    buffos.flush();
                }
                in.close();
                out.close();
    }
}
时间: 2024-12-26 15:06:57

小谈——读取web资源文件的方式和路径问题的相关文章

加载web资源文件

servlet编程: 1.servlet生命周期: 构造方法:创建servlet对象.默认情况下,第一次访问servlet对象时.只调用一次. init方法(有参):创建完servlet对象后调用.只调用一次. 注意:会调用无参的init方法 servlet方法:servlet提供服务的方法,每次发出请求调用. 注意:request对象,response对象 destory方法:tomcat服务器停止或web应用重新部署,servlet对象销毁,destory方法被调用 2.servletCon

J2EE之普通类加载web资源文件的方法

在WEB中普通类并不能像Servlet那样通过this.getServletContext().getResourceAsStream()获取web资源,需要通过类加载器加载,这里有两种方式,这两种方式是有区别的,下载咱们一起来看一下吧. 方法1. public class UserDao { public void connect() throws IOException { method1(); } private void method1() throws IOException { In

Spring加载资源文件的方式

UrlResource 封装了java.net.URL,它能够被用来访问任何通过URL可以获得的对象,例如:文件.HTTP对象.FTP对象等.所有的URL都有个标准的 String表示,这些标准前缀可以标识不同的URL类型,包括file:访问文件系统路径,http: 通过HTTP协议访问的资源,ftp: 通过FTP访问的资源等等. FileSystemResource封装了java.io.File的操作,用来访问File类型的对象. ServletContextResource实现了Servle

java util工具读取国际化资源文件

Locale ResourceBundle Locale读取资源文件 package yycg.util; import java.io.Serializable; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.ResourceBundle;

Java IO流 之 ResourceBundle 读取国际化资源文件

http://www.verejava.com/?id=16994867037422 /** java.util.ResourceBundle : 用来读取资源文件的类(*.properties) 资源文件里面的内容是Key=value 键值对 注意: 1. 根据Locale来读取资源文件时,如果没有找到以 baseName_language_country.properties 形式定义的资源文件, 就从 baseName.properties 资源文件读取 */ import java.ut

在服务端中,读取properties资源文件中的数据

1.获取到资源的路径 2.读取数据 //properties文件对象 Properties properties = new Properties(); //通过HttpServletRequest request 对象 获取服务上下文环境中目标文件的真实路径 String realPath = request.getServletContext().getRealPath("/deom.properties"); //加载目标文件的数据 properties.load(new Fil

jar包要读取的资源文件路径问题

本地调试读取文件没有问题 获取 Thread.currentThread().getContextClassLoader().getPath() 读取文件 打jar包之后 获取的路径出错 不能读取文件 解决方式 使用ConfigName.class.getResourceAsStream的方式获取流解析即可 原文地址:https://www.cnblogs.com/zuopy/p/12079996.html

win10 uwp 读取resw资源文件

ResourceContext resourceContext = ResourceContext.GetForViewIndependentUse(); ResourceMap resourceMap = Windows.ApplicationModel.Resources.Core.ResourceManager.Current.MainResourceMap.GetSubtree("my"); // Here you load the resource you need var

小谈c#数据库存取图片的方式

代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> /// <summary> /// 上传图片 /// </summary> /// <param name="FUSShopURL">FileUpload对象</param> /// <param name="Upl