2016-07-26 70 views
0

我有一组文件作为资源附加到我的项目中。这些文件包含程序读取和处理的数据。 这就是我要做的事:用空格和西里尔文符号名称读取资源文件

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();  
InputStream inputStream = classLoader.getResourceAsStream(filename);    
packageParameters = IOUtils.toString(inputStream, "UTF-8");      
inputStream.close();  

,一切都很好,直到我试图像具体的名称来读取文件:

\sets\Тех. тип = 0 Сет. = 1 Комплект 1.qr 

getResourceAsStream回报null这意味着它无法找到该资源。

所以,问题是:如何读取包含西里尔文符号,空格和名称中特殊符号的文件? 试图编码名称 - 没有帮助。无法将其转换为URI,因为构造函数会为非法符号引发异常。

任何想法赞赏。 花了一些时间分析类似的答案 - 仍然不知道如何解决它。

+1

感谢尼古拉为了更新问题! –

+0

你有控制文件命名吗? – injecteer

+0

不,我对文件名的生成方式没有任何影响。我也想过重命名它们。但要在程序中对它们进行重命名,我需要能够将它们定位为资源,这正是我想要做的:) –

回答

2

尝试删除尾部斜杠并用/替换\

我把文件Тех. тип = 0 Сет. = 1 Комплект 1.qrsrc\main\resources\sets与内容

123 

这对我的作品

import org.apache.commons.io.IOUtils; 
import java.io.IOException; 
import java.io.InputStream; 

public class Application { 
    public static void main(String[] args) throws IOException { 
     String filename = "sets/Тех. тип = 0 Сет. = 1 Комплект 1.qr"; 
     ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
     InputStream inputStream = classLoader.getResourceAsStream(filename); 
     String packageParameters = IOUtils.toString(inputStream, "UTF-8"); 
     inputStream.close(); 
     System.out.println(packageParameters); // prints 123 
    } 
} 

该类位于src\main\java\Application.java的来源。所有路径都与项目的根目录有关。

+0

感谢您的回答。已经尝试过不同的斜杠类型,包括您提出的方法。又一次 - 这段代码成功处理了常规文件,但对于我的特定文件,InputStream仍为空。忘了提及我使用Windows机器来运行应用程序,它可以是它为什么在你身边工作不同的原因(我猜你使用Mac或Linux,对不对?) –

+0

@KonstantinDobroliubov不,我使用Windows。同样在['ClassLoader'参考文献](http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html)中声明_资源的名称是一个'/'分隔的路径标识资源的名称。可能它与目录有关?或者甚至文件的名称在程序内部是不正确的,例如之前或之后的空格? – NikolayKondratyev

+0

标记答案是有效的,因为它确实有效。然而,问题在于我如何处理文件名。它由于错误的转换操作而被截断。谢谢大家,伙计!你做了我的一天。 –

相关问题