2011-02-07 13 views
0

私はすべてのクラスファイルとリソースをjarファイルとしてパッケージ化しましたが、実行時にはサウンドファイルは再生されません。私のパッケージ構造は次のとおりです。サウンドがjarで再生されない

+project 
|_classes 
|_ _*.class 
|_resources 
|_ _ *.jpg,*.wav 

コード:

AudioInputStream inputStream = AudioSystem.getAudioInputStream(kidsClassRoom.class.getResourceAsStream("../resources/"+file)); 

この行が実行されたときにnullを取得します!

答えて

0

getResourceAsStreamを実行すると、現在のクラスに相対的ではなく、アーカイブのルートになります。つまり、まず../を削除してみてください。

+0

'../'はまだ動作していません! – sarath

+0

リソースフォルダを右クリックし、「ビルドパス - >ソースフォルダとして使用」を選択してください。 (これは、eclipseから起動するときにファイルがクラスローダーにアクセス可能であることを確認することです) – aioobe

+0

私は現在IDEを使用していません:) – sarath

1

enter image description here

以下のように

AudioSystem.getAudioInputStream(kidsClassRoom.class.getResourceAsStream("resources/"+file)); 
+0

'resources'という名前のフォルダを持つことは必須ですか? – sarath

+0

'Foo'が実行するフォルダはありませんが、' kidsClassRoom.class.getResourceAsStream( "Foo /" + file) ' –

+0

も動作しませんでした。 – sarath

2

その後、すでに提示されたものへの代替理論をresourcesという名前のパッケージを作成します。成功したgetResource()呼び出しは、呼び出されたクラスローダのインスタンスに依存します。このため、getResource()を呼び出すためのユーザー定義オブジェクトのインスタンスを使用することをお勧めします。例えば。

// Sanity check 
System.out.println("The value of 'file' is: " + file); 
// Presuming kidsClassRoom1 is an instance of kidsClassRoom 
AudioInputStream inputStream = AudioSystem. 
    getAudioInputStream(
     kidsClassRoom1. 
      getClass(). 
      getResourceAsStream("/resources/"+file)); 

スニペットでは、リソースに接頭辞「/」が使用されていることに注意してください。他の人が言っていることとは反対に、私は、リソースパスのルートから、ランタイムクラスパス上のJarが見つかったことを意味すると確信しています。 '/'または '../'のままにしておくと、クラスローダーは、これが発生しているクラスのサブパス内のリソースを検索します。

もちろん、Wavが瓶! .jarを.zipにコピー/名前を変更してダブルクリックすると、Windows上でアーカイブの内容を調べるための「クイック&ダーティな」方法です。

+0

なぜkidsClassRoom1.getClass() 。クラス? – sarath

+0

私は確信していません。異なるクラスローダーがあります。 J2SEから物をロードするために使用されるブートストラップクラスローダーは、アプリケーションの実行時クラスパス上のクラスまたはリソースを検出しません。アプリケーションを見つけるための最高のクラスローダー。 resourcesはコンテキストクラスローダーです。 className.class **を使用すると、コンテキストクラスローダーが生成される可能性があります。カスタムクラスの実際のオブジェクトインスタンスを使用するOTOHは、コンテキストクラスローダーが使用されることを保証します。しかし、最も重要なのは、このアドバイスはあなたのために働くのですか? wavファイルは「見つかりました」ですか? –

+0

kidsClassRoom.class方法は私のために働いた。問題は私が間違ったファイル名を与えていたことでした! – sarath

1

これは、ジャーでループサウンドファイルを再生するための私の機能です、それは私のために正常に動作します。

getResourceAsStream()はjarでは機能しません。ただし、getResource()はありません。

public synchronized void alarm() { 
    try { 
     crit = AudioSystem.getClip(); 
     AudioInputStream inputStream1 = AudioSystem.getAudioInputStream(this.getClass().getResource("critical.wav")); 
     crit.open(inputStream1); 
     crit.loop(Clip.LOOP_CONTINUOUSLY); 

    } catch (Exception e) { 
     System.err.println(e.getMessage()); 
     } 
} 
+0

私のために働いています。どうもありがとう – Sk1X1

0

注意すべき重要なことは、エクスポートされたjarファイル内のリソースが(このどこかを読んで、誰より知識があるを入力してください)ファイルとして格納されていないということです。そのため、まずURLオブジェクトとしてリソースを取得してから、AudioInputStreamオブジェクトに渡してください。

URL url = YourClass.class.getResource(filename); 
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url); 

リソースがサブフォルダにある場合は、ファイル名のパスに追加してください。

関連する問題