我应该如何将文件加载到我的Java应用程序中?

我应该如何将文件加载到我的Java应用程序中?

简短的回答

使用以下两种方法之一:

  • Class.getResource(String)
  • Class.getResourceAsStream(String)

例如:

 InputStream inputStream = YourClass.class.getResourceAsStream("image.jpg"); 

长的答案

通常,人们不想使用绝对path加载文件。 例如,如果可以帮助,请不要这样做:

 File file = new File("C:\\Users\\Joe\\image.jpg"); 

至less有两个原因不推荐这种技术。 首先,它会在特定的操作系统上创build依赖关系,从而阻止应用程序轻松移动到另一个操作系统。 Java的主要好处之一是能够在许多不同的平台上运行相同的字节码。 使用这样的绝对path使代码更加便于携带。

其次,根据文件的相对位置,这种技术可能会创build一个外部依赖关系,并限制应用程序的移动性。 如果文件存在于应用程序的当前目录之外,则会创build一个外部依赖关系,并且必须意识到依赖关系才能将该应用程序移动到另一台机器(容易出错)。

而是使用Class类中的getResource()方法。 这使得应用程序更具可移植性。 它可以被移动到不同的平台,机器或目录,并仍能正常工作。

getResource是好的,但使用相对path也可以,只要你可以控制你的工作目录(你通常可以)在哪里。

此外,可以使用File.separator , File.separatorChar或System.getProperty(“file.separator”)来获取有关分隔符的平台依赖性。

什么是你加载文件的configuration或数据(如input文件)或作为资源?

  • 如果作为一个资源,按照威尔和贾斯汀的build议和例子
  • 如果configuration,那么你可以使用ResourceBundle或Spring (如果你的configuration更复杂)。
  • 如果你需要读取文件来处理里面的数据,这个代码片段可以帮助BufferedReader file = new BufferedReader(new FileReader(filename)) ,然后使用file.readLine();读取文件的每一行file.readLine(); 不要忘记closures文件。

即使在Windows上,使用unix样式的path分隔符也没有问题(尽pipe最好检查File.separatorChar )。

使用ClassLoader.getResource()的技术最适合将要从JAR文件加载的只读资源。 有时, 您可以通过编程来确定应用程序目录 ,这对pipe理员可configuration文件或服务器应用程序很有用。 (当然,用户可编辑的文件应该存储在System.getProperty(“user.home”)目录的某个地方。)

 public byte[] loadBinaryFile (String name) { try { DataInputStream dis = new DataInputStream(new FileInputStream(name)); byte[] theBytes = new byte[dis.available()]; dis.read(theBytes, 0, dis.available()); dis.close(); return theBytes; } catch (IOException ex) { } return null; } // ()