【问题标题】:Java - read file from directory for jarJava - 从目录中读取 jar 文件
【发布时间】:2012-11-22 10:42:51
【问题描述】:

我有一个应用程序,它创建一个临时 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

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

【问题讨论】:

    标签: java file file-io jar


    【解决方案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 中的代码无法找到这些临时文件

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 好的,然后我应该把我的可运行 jar 放在 c:\development 中(对于这个例子)?
      • 在不确切知道您要使用此应用程序完成什么的情况下,我无法提出任何建议。我只是在指出为什么您的示例不起作用。您应该将应用程序文件保存在 jar 中,无论是否可运行,并且您应该能够在文件系统的任何位置播放 MP3。
      【解决方案3】:

      为了从特权 JAR 和文件系统加载,我不得不使用两种不同的机制:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-12-09
        • 2012-04-09
        • 1970-01-01
        • 2012-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多