java eclipse 读取文件_java 在eclipse工程下读取文件内容和打成war包后,读取同样文件内容,正确读取...

在Eclipse工程下,Java使用`Thread.currentThread().getContextClassLoader().getResource("").toString().split("file:/")[1].split("/target")[0]+"/src/main/webapp/txt/a.txt"`能正确读取文件,但打包成WAR后失效。解决方案包括:1) 创建resource资源包,通过相对路径读取;2) 打包时保留src/main结构。最佳答案建议使用`A.class.getResourceAsStream("/txt/a.txt")`来确保在不同环境下都能读取到文件。
摘要由CSDN通过智能技术生成

java 在eclipse工程下读取文件内容和打成war包后,读取同样文件内容,正确读取

关注:139  答案:3  mip版

解决时间 2021-01-16 22:44

e6cb1a03ad541b3098697807b7bf1798.png

提问者彼岸独舞

2021-01-16 17:43

请高手指点,非常感谢!

在eclipse工程下,读取文件内容代码,如下:

String []projectPath= Thread.currentThread().getContextClassLoader().getResource("").toString().split("file:/");

String []array = projectPath[1].split("/target");

filePath=array[0]+"/src/main/webapp/txt/a.txt";

List fileContentList= projectService.readFile(filePath);

public List readFile(String filePath){

List list=new ArrayList();

try

{

File f = new File(filePath);

if(f.isFile()&&f.exists())

{

InputStreamReader read = new InputStreamReader(new FileInputStream(f),"GBK");

BufferedReader reader=new BufferedReader(read);

String line;

while ((line = reader.readLine()) != null)

{

list.add(line);

}

read.close();

return list;

}

} catch (Exception e)

{

e.printStackTrace();

}

return null;

}

以上代码在eclipse工程下,能够正确读取到文件内容,但是打成war后,读取该内容为空。希望能够有一个通用的方法,在eclipse工程下和打成war包后的文件,都能正确的读取该文件。(使用相对路径)

最佳答案

e6cb1a03ad541b3098697807b7bf1798.png

二级知识专家守給你的承諾

2021-01-16 18:19

首先war打完之后你可以用解压软件看看里面的文件结构,和工程是不一样的。没有src/main/这一层。因此如果要满足你的使用相对路径要求,又要通用,只有两个方法。

1、在项目下重新建一个resource资源包,配置文件放在里面,然后根据resource相对路径读取

2、变更项目打包结构,打包输出时把src/main/这层加上

总之这两个方法的目的都是为了让war包结构和你工程一致。

我的读取配置文件方法如下,你可以参考下。文件路径:

String path = null;

try {

path = SellerProductController.class.getClassLoader()

.getResource("").toURI().getPath();

log.info("获取到配置文件的路径为:" + path);

} catch (URISyntaxException e) {

log.error("获取配置文件路径出现异常," + e.getMessage());

}

// 把文件读入文件输入流,存入内存中

FileInputStream fis = null;

try {

fis = new FileInputStream(new File(path + "isa_addr.json"));

} catch (FileNotFoundException e) {

log.error("读取配置文件出现异常," + e.getMessage());

}

// 设置response的字符集为项目指定字符集

response.setCharacterEncoding("UTF-8");

// 创建输出流对象

PrintWriter out = null;

try {

out = response.getWriter();

} catch (IOException e) {

log.error("创建输出流对象失败:" + e.getMessage());

}

String res = this.ReadFile(fis);

log.debug("最终获得的Json串为:" + res);

全部回答

e6cb1a03ad541b3098697807b7bf1798.png

1楼归人

2021-01-16 19:43

你这是通过绝对路径读的文件,打包后运行的环境有变化,最重要的是 /src/main 在打包后已经不存在了。

正确的做法可以是:当前这个class假设为A,A.class.getResourceAsStream("/txt/a.txt"),确保编译时 .txt 文件会复制到 classes 路径下(可以解压缩war以后看看是否在 WEB-INF/classes/txt/a.txt),如果不在,修改编译工具,除了将 .class 、.xml复制到class目录下,.txt也要复制。

e6cb1a03ad541b3098697807b7bf1798.png

2楼輓畱嶼赱

2021-01-16 19:10

右键需要导出的web工程——选择export

选择myeclipse jee——war file

选择导出的目标目录和运行环境,finish完成

我要举报

如以上问答内容为低俗/色情/暴力/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!

→点此我要举报以上信息!←

推荐资讯

大家都在看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值