2017-06-02 22 views
0

我试图在我的JAR文件中加载WAV资源文件。通过IDE运行时,它完美地工作。但是当通过java -jar运行时,它给我提供了大约75%的垃圾和25%的正确数据。我想知道为什么。这里有一些方法我试过:在JAR内部访问Java资源会返回大约75%的垃圾

  1. (我的首选方法):阅读与的getResourceAsStream从JAR给出了具有原始的某些部分损坏的数据:

    short[] waveform = AudioFileAPI.readWavFile(
        Blah.class.getResourceAsStream("/blah.wav")); 
    
  2. 从常规文件读取:从创建的JAR OK

    waveform = AudioFileAPI.readWavFile(new File("C:\\blah\\blah.wav")); 
    
  3. 提取WAV和阅读它作为一个普通的文件:OK

    waveform = AudioFileAPI.readWavFile(new File("C:\\blah\\fromjar.wav")); 
    
  4. 使用getResource读取并调用AppletAudioClip上的play()会导致75%的数据损坏,如上所述。

    Object o = Blah.class.getResource("/blah.wav").getContent(); 
    AppletAudioClip appletAudioClip = (AppletAudioClip) o; 
    appletAudioClip.play(); 
    
  5. 通过getResource()读取openStream():如上所述75%损坏的数据。

    InputStream is = Blah.class.getResource("/blah.wav").openStream(); 
    waveform = AudioFileAPI.readWavFile(is); 
    
  6. 解压缩并重新压缩JAR并重新运行该程序也没有帮助。

回顾一下,上述所有方法在从IDE运行时都能很好地工作,但是在作为资源加载时指示的方法失败。 JAR由IntelliJ IDEA打包。我使用JDK版本1.8.0_131。 AudioFileAPI是我自己的课程。

+0

可能是因为从'getResource(..)'返回的流不可定位。为什么不使用来自Java声音API的'Clip'呢? –

+0

我实际上并不打算播放音频,但我需要对音频样本进行一些信号处理。我需要资源中的二进制数据,而不是仅支持播放功能的对象。 – 3VYZkz7t

回答

0

这实际上是由于正在读取资源的InputStream的代码中的一个错误。如果InputStream的read()方法由于某种原因没有一次读取所有字节,后续的read()尝试将错误地写入总是从位置0开始的相同缓冲区,而不是从当前读取的总字节数确定的位置开始。

因此,最后,缓冲区看起来像是在开始时有正确数据的碎片,最后是垃圾。