src包中文件用相对路径访问WebContent下文件的问题

src包中文件用相对路径访问WebContent下文件的问题,第1张

目录
  • 阐述
  • 解决方案
    • 新出现的问题
  • 最终方案

阐述

在完成第五个第六个war包时,发现第5个包中的is得到的是空指针

	public void init() throws ServletException{
		//count = 0;
		System.out.println("在init中完成计数器的初始化begin");
		sc = this.getServletContext();
		path = sc.getRealPath("WEB-INF/count.txt");
		System.out.println("读路径是:"+path);
		//说明path没问题
		try {
			System.out.println("进入try catch");
			InputStream is = LifeServlet.class.getResourceAsStream("count.txt");
			System.out.println("is="+is);
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			String string = br.readLine();
			System.out.println("读到的字符串是:"+string);
			count = Integer.parseInt(string);
			br.close();
			is.close();
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e.getMessage());
		}
		System.out.println("在init中完成计数器的初始化end");
	}

而第六个war包正常显示

	public void init() throws ServletException{
		count = 0;
		System.out.println("在init中完成计数器的初始化");
		sc = this.getServletContext();
		path = sc.getRealPath("WEB-INF/count.txt");

		try {
			System.out.println("进入try catsh");
			InputStream is = LifeServlet.class.getResourceAsStream("countinpackage.txt");
			System.out.println("is的值是:"+is);
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			String string;
			string = br.readLine();
			System.out.println("读到的字符串为:"+string);
			count = Integer.parseInt(string); //计数器完成初始化
			br.close();
			is.close();
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println("1");
		}

	}
	

经对比,未发现两段代码代码有出入,在仔细排查过后,发现:

InputStream is = LifeServlet.class.getResourceAsStream(“count.txt”);
InputStream is = LifeServlet.class.getResourceAsStream(“countinpackage.txt”);

count.txt和countinpackage.txt所在的路径不同:

解决方案

对此,我认为有两种解决方案:

  1. 将count.txt放入与该java文件同一包下
  2. 修改路径为正确的相对路径格式
新出现的问题

当我认为修改过后能够解决问题,却发现is得到的值依旧是空指针

InputStream is = LifeServlet.class.getResourceAsStream("../../../WebContent/WEB-INF/count.txt");


当时考虑,是否自己对相对路径的理解存在偏差。在自己的多次实 *** 过后发现没有问题。

最终方案

经老师的提醒,发现问题是web项目运行的时候所在的路径和本地路径不相同

使用插旗的方式,我们找到了该工作目录下的路径

String Path= this.getClass().getResource("").getPath();

得出的结果是:

path=
C:\Users\sch\Documents\workspace-spring-tool-suite-4-4.6.0.RELEASE.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\j2019001001_05_showServletLifeCyclePlusDemo\count.txt

通过打开该路径,我们可以发现,任何WEB-INF里的文件,均映射到了以该包为根目录下的位置,如这里的j2019001001_05_showServletLifeCyclePlusDemo/

注意,运行的.java文件编译之后生成的会在WEB-INF下生成的classes的servlet里

/WEB-INF/classes/servlet/

故上图的LifeServlet.class会出现在该目录下。
因此对于该问题来说,只需要修改路径为

path = sc.getRealPath("count.txt");

就可以找到此路径了

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/736219.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存