2016-07-26 4 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

末尾のスラッシュを削除し、\/に置き換えてください。

私はコンテンツ

123 

src\main\resources\setsにファイルТех. тип = 0 Сет. = 1 Комплект 1.qrを置き、これは私

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にあり、このクラスのソースに動作します。すべてのpathesは、プロジェクトのルートディレクトリに関連しています。

+0

答えをありがとう。既にあなたが提案した方法を含め、異なるスラッシュタイプで試してみました。もう一度やり直してください - このコードは正常なファイルを正常に処理しますが、InputStreamはまだ特定のファイルに対してnullです。私はWindowsマシンを使ってアプリケーションを実行することを忘れてしまいました。あなたの側で別々に動作するのはなぜでしょうか(私はあなたがMacやLinuxを使っていると思いますか?) –

+0

@KonstantinDobroliubovいいえ、私はWindowsを使用します。また、['ClassLoader'参照](http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html)で、_リソースの名前が '/'で区切られたパスであると宣言しましたリソースを識別する名前。おそらくディレクトリと関係があるでしょうか?あるいは、ファイル名がプログラム内で間違っていても、前後のスペースなどは? – NikolayKondratyev

+0

答えが本当に有効であるとマークします。しかし、ファイル名をどのように処理するかが問題でした。誤った変換操作の結果として切り捨てられました。みなさん、ありがとう!あなたは私の一日をした。 –

関連する問題