Java - 从jar目录中读取文件

时间:2012-12-04 18:04:41

标签: java file file-io jar

我有一个创建临时mp3文件的应用程序,并将其放在像C:\

这样的目录中
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

有人可以帮我这个吗?

3 个答案:

答案 0 :(得分:1)

好像你没有临时文件的文件名。当您在eclipse中运行程序时,该实例正在创建处理文件,但是在您创建了一个可运行的程序后,您无法读取eclipse中创建的那个实例的文件,您可运行的文件可以创建自己的临时文件并可以处理它们, 要将临时文件全局放在某个数据库或属性文件中的(路径+名称)条目

例如,您将根据打击代码

创建临时文件
File tempfile = File.createTempFile("out", ".txt", new File("D:\\"));           
FileWriter fstream = new FileWriter(tempfile);//write in file
out = new BufferedWriter(fstream);

out不会是out.txt文件,它将是

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

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

答案 1 :(得分:0)

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

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

加载此文件
getClass().getResource("mp3/song.mp3");

底线:如果您想使用getResource()读取文件,则需要将这些文件放在类路径中。

答案 2 :(得分:0)

要从特权JAR和文件系统加载,我必须使用两种不同的机制:

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

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