我应该如何将文件加载到我的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; } // ()