2012-12-04 130 views
0

我有一个创建一个临时的MP3文件,并把它放在一个目录一样C:\爪哇 - 从目录中读取文件的jar

File tempfile = File.createTempFile("something", ".mp3", new File("C:\\)); 

我能够通过只使用同一tempfile读它的应用程序再次。 在Eclipse IDE中一切正常。

但是,当我将项目导出为Runnable jar时,我的文件仍在正确制作中(我可以使用iTunes等普通音乐播放器播放它们),但似乎无法在我的应用程序中阅读它们。

我发现我需要使用类似getClass().getResource("/relative/path/in/jar.mp3")使用是在jar.资源文件,但是这似乎并没有工作,如果我想在我的文件系统,选择从某个位置的文件像C:\something.mp3

有人能帮我解决这个问题吗?

回答

1

看来你没有文件名称的临时文件。当你在eclipse中运行你的程序时,这个实例创建了一个处理文件,但是当你创建一个可运行的程序后,你不能够在eclipse创建的那个文件中读这个文件,你可运行的文件可以创建它自己的临时文件并且可以处理它们, 为了使临时文件截止放在那里(路径+名称)项中的一些数据库或属性文件

例如,你会从打击代码创建一个临时文件

File tempfile = File.createTempFile("out", ".txt", new File("D:\\"));   
FileWriter fstream = new FileWriter(tempfile);//write in file 
out = new BufferedWriter(fstream); 

的出来会不会出.txt文件它将是

out6654748541383250156.txt // it mean a randum number will be append with file 

你在可运行jar中的代码是无法找到这些临时文件

0

getClass().getResource()只读取类路径中的资源。事实上,传递给getResource()的路径是相对于当前类路径中任何路径的路径。这听起来有点令人困惑,所以我举个例子:

如果你的类路径包含一个目录C:\development\resources,你可以使用getResource()加载这个目录下的任何文件。例如,有一个文件C:\development\resources\mp3\song.mp3。你可以通过调用

getClass().getResource("mp3/song.mp3"); 

底线加载此文件:如果你想使用getResource()读取文件,你需要这些文件是在类路径中。

+0

好的,我应该然后把我的runnable jar在c:\ development(对于这个例子)? – dumazy

+0

不知道你正在试图用这个应用程序来完成什么,我不能提出任何建议。我只是在指出为什么你的例子不起作用。您应该将应用程序文件保存在jar中,可以运行或不运行,并且应该可以在文件系统的任何位置播放MP3。 – rmlan

0

对于来自特权的JAR文件和文件系统加载,我不得不使用两种不同的机制:

  • getClass().getClassLoader().getResource(path),并且如果返回null,
  • new File(path).toURI().toURL();

你可以将其转换为ResourceResolver策略,该策略使用classpath方法和一个或多个文件方法(可能使用不同的基本路径)。