我使用spring-boot开发了一个应用程序,我需要读取包含电子邮件的csv文件。
这是我的一个片段:
public Set<String> readFile() {
Set<String> setOfEmails = new HashSet<String>();
try {
ClassPathResource cl = new ClassPathResource("myFile.csv");
File file = cl.getFile();
Stream<String> stream = Files.lines(Paths.get(file.getPath()));
setOfEmails = stream.collect(Collectors.toSet());
} catch (IOException e) {
logger.error("file error " + e.getMessage());
}
return setOfEmails;
}
当我使用eclipse执行应用程序时它可以工作:运行As - &gt; spring-boot app
但是当我将jar放入容器docker时,方法readFile()返回一个空集。
我使用gradle构建应用程序
你有什么想法吗?
祝你好运
答案 0 :(得分:4)
ClassPathResource
状态的javadoc:
如果类路径资源驻留在文件系统中,支持解析为
java.io.File
,,而不是JAR中的资源。始终支持解析为URL。
因此,当资源(CSV文件)位于JAR文件中时,getFile()
将失败。
解决方法是使用getURL()
代替,然后将URL作为输入流打开,等等。像这样:
public Set<String> readFile() {
Set<String> setOfEmails = new HashSet<String>();
ClassPathResource cl = new ClassPathResource("myFile.csv");
URL url = cl.getURL();
try (BufferedReader br = new BufferedReader(
new InputStreamReader(url.openStream()))) {
Stream<String> stream = br.lines();
setOfEmails = stream.collect(Collectors.toSet());
} catch (IOException e) {
logger.error("file error " + e.getMessage());
}
return setOfEmails;
}
如果仍然失败,请检查您是否使用了正确的资源路径。
答案 1 :(得分:2)
我不使用Spring,但我发现ClassPathResource的Javadoc声明:
如果类路径资源驻留在文件系统中,则支持解析为java.io.File,但不支持JAR中的资源。始终支持解析为URL。
尝试使用getURL()
代替getFile()
。
答案 2 :(得分:0)
使用http://jd.benow.ca/ Jd GUI将jar文件放在那里
1)检查文件是否在jar中
2)如果是,则查看放置它的路径/文件夹结构。
3)如果存在Yes文件夹使用"/<path>/myFile.csv"
干杯享受编码