【问题标题】:Java getting resource relative pathJava获取资源相对路径
【发布时间】:2013-01-06 01:38:10
【问题描述】:

我正在尝试将 .wav 文件加载到内存中,但它一直告诉我该文件不存在。

String filename;

public MyClass(String _filename){
 filename = _filename;
}

public void run(){
   InputStream in = View.class.getClassLoader().getResourceAsStream("/sounds/"+filename);

   File inputFile = new File(in.toString());
   if(!inputFile.exists()){
      System.err.println("Wave file not found: " + in.toString());
      return;
   }
}

控制台:

未找到波形文件:java.io.FileInputStream@dd5b524

未找到波形文件:java.io.FileInputStream@570add96

该文件位于包文件夹中。它在

myPackage/sounds/write.wav

编辑:

其实我是想加载声音的:

InputStream in = this.getClass().getResourceAsStream("sounds/"+filename);

AudioInputStream audioInputStream = null;
try { 
     audioInputStream = AudioSystem.getAudioInputStream(in);
} catch (UnsupportedAudioFileException e1) { 
         e1.printStackTrace();
         return;
} catch (IOException e1) { 
         e1.printStackTrace();
         return;
}

但是控制台还是报错:

线程“Thread-6”中的异常线程“Thread-7”中的异常 java.lang.NullPointerException 在 com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(未知 来源)在 javax.sound.sampled.AudioSystem.getAudioInputStream(未知来源) 在 com.chrissman.threads.AePlayWave.run(AePlayWave.java:47) java.lang.NullPointerException 在 com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(未知 来源)在 javax.sound.sampled.AudioSystem.getAudioInputStream(未知来源) 在 com.chrissman.threads.AePlayWave.run(AePlayWave.java:47)

【问题讨论】:

  • 将声音目录移动到项目的根目录中。

标签: java path resources relative-path


【解决方案1】:

in.toString() 不返回用于打开流的路径,它返回类名后跟散列:java.io.FileInputStream@dd5b524

错误是因为您的当前目录中没有名为java.io.FileInputStream@dd5b524 的文件。

因为你得到了一个对象而不是null 作为in 它找到了你的文件。您不能使用File 对象来获取此文件,但您可以通过in 对象访问它。从流中读取内容并使用它。

【讨论】:

  • 我应该在哪里调用 in.avaible()?这是我的问题的解决方案吗?
  • 几乎没有理由打电话给available()
  • 我编辑了它。我的意思是,您的文件打开正常。但是不需要File 对象。
  • 将第二个示例更改为使用与第一个示例相同的路径 ("/sounds/"+filename),它应该可以正常打开。
【解决方案2】:

可以使用绝对路径和相对路径查找资源。您当前拥有的是一个以/ 开头的绝对路径。所以把它改成/myPackage/sounds/write.wav。一般来说,我更喜欢绝对路径,因为使用相对路径很难确定哪个包是“当前”包。

【讨论】:

  • 以及如何使用绝对路径?
  • 如果第一个字符是'/'那么你把它称为绝对路径。
  • 然后查看 .jar 文件并验证该文件是否确实已打包。
  • 是的,文件在包里。这个包叫做“com.chrissman”,在这个包中我有一个名为“sounds”的文件夹,在这个文件夹中我有一个.wav文件“write.wav”;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
  • 2016-09-10
  • 1970-01-01
  • 2011-09-12
  • 2010-12-08
  • 2011-12-15
相关资源
最近更新 更多