如何从tomcat7中的jar获取txt文件

时间:2013-01-09 15:30:31

标签: java jar tomcat7

我有一个txt文件。我使用jar cf0...将它打包成拉链和罐子。为了让这个工作起作用,我尝试了两种方法。

models.zip/models.jar
 |
 |_subfolder
     |
     |_MyFile.txt

在某些代码中,我有......

InputStream in = getClass().getClassLoader().getResourceAsStream(path);
BufferedReader reader = new BufferedReader(new InputStreamReader(in));

我尝试过设置路径...

MyFile.txt
/MyFile.txt
/subfolder/MyFile.txt
classpath:/subfolder/MyFile.txt
models.zip/subfolder/MyFile.txt
models.jar/subfolder/MyFile.txt
models.zip!/subfolder/MyFile.txt
models.jar!/subfolder/MyFile.txt

我也尝试将jar/zip放入WEB-INF/classesWEB-INF/lib

这些都不起作用,in始终为空。

就这样你知道,当我把MyFile.txt放在WEB-INF /类中时,我可以把它弄好。

请提供久经考验的答案!请不要只复制并粘贴其他答案中的代码。

3 个答案:

答案 0 :(得分:2)

尝试

InputStream is = getClass().getClassLoader().getResourceAsStream  ("/subfolder/MyFile.txt");

并将您的jar文件放在WEB-INF / lib /

中 编辑:你应该相信自己的代码,这是我运行的webapp的一个片段。 类在包“it.sft.utils.props”中,相对属性文件通过ant int打包在同一个jar的同一个文件夹中。这完美无缺。

在您的特定场景中,您的类路径中可能没有jar

 private void loadFromProperties() throws IOException {
            if (currencies == null) {
                currencies = new Properties();
                InputStream is = this.getClass().getClassLoader().getResourceAsStream  ("/it/sft/utils/props/currencies.props");
            if (is != null) {

                currencies.load(is );

                for (String key : currencies.stringPropertyNames()) {
                    String value = currencies.getProperty(key);
                    try {
                        String [] tmp = value.split(",");
                        String code = tmp[0];
                        int decs = Integer.parseInt(tmp[1]);
                        String text = tmp[2];
                        Logger.getLogger(CurrencyResolver.class).debug("Adding " + key + " with code " + code + " [" + text + "]");
                        storeValutaIso4217(new ValutaIso4217(key, code, decs, text));
                    }catch (Exception e) {
                        // Ignore
                        Logger.getLogger(CurrencyResolver.class).warn("Cannot handle " + key + " >" + value + "<");
                    }
                }
            }
        }
    }

或者您是否偶然从某种IDE(NetBeans或Eclipse)运行它?

只是因为偏执:jar文件实际上是由tomcat运行用户读取的,不是吗?

答案 1 :(得分:1)

我认为问题是/中的/subfolder/MyFile.txt结尾。

spring ClassPathResource类使用的操作几乎与您使用的操作相同,但是javadoc states plainly

  

为ClassLoader用法创建一个新的ClassPathResource。领先的斜线   将被删除,因为ClassLoader资源访问方法不会   接受它。

所以,没有春天,它将是:

Thread.currentThread().getContextClassLoader().getResourceAsStream("subfolder/M‌​yFile.txt");

此外,您的jar必须放在WEB-INF/lib中,或者如果您想单独放置文本文件,请将其放入WEB-INF/classes/subfolder/

如果您正在使用spring(我猜是因为您使用的是伪url类路径:)直接使用:

InputStream is = new ClassPathResource("subfolder/MyFile.txt").getInputStream();

答案 2 :(得分:1)

我觉得自己像个笨蛋!问题是在lib和classes文件夹中都有models.jar。它应该只在lib文件夹中。