【发布时间】:2010-09-05 14:51:07
【问题描述】:
我应该如何将文件加载到我的 Java 应用程序中?
【问题讨论】:
-
如果您使用的是 Maven,并且您的文件包含文本,则需要注意编码(参见此处:tshikatshikaaa.blogspot.nl/2012/07/…)
我应该如何将文件加载到我的 Java 应用程序中?
【问题讨论】:
使用 docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ClassLoader.html#getResource(java.lang.String)
【讨论】:
我只使用 Unix 样式的路径分隔符没有问题,即使在 Windows 上也是如此(尽管检查 File.separatorChar 是个好习惯)。
使用ClassLoader.getResource() 的技术最适合将从JAR 文件加载的只读资源。有时,you can programmatically determine the application directory,这对于管理员可配置文件或服务器应用程序很有用。 (当然,用户可编辑的文件应该存储在System.getProperty("user.home") 目录中的某个位置。)
【讨论】:
public static String loadTextFile(File f) {
try {
BufferedReader r = new BufferedReader(new FileReader(f));
StringWriter w = new StringWriter();
try {
String line = reader.readLine();
while (null != line) {
w.append(line).append("\n");
line = r.readLine();
}
return w.toString();
} finally {
r.close();
w.close();
}
} catch (Exception ex) {
ex.printStackTrace();
return "";
}
}
【讨论】:
简短回答
使用以下两种方法之一:
例如:
InputStream inputStream = YourClass.class.getResourceAsStream("image.jpg");
--
长答案
通常,我们不想使用绝对路径加载文件。例如,如果你能帮助它,就不要这样做:
File file = new File("C:\\Users\\Joe\\image.jpg");
不推荐这种技术,至少有两个原因。首先,它创建了对特定操作系统的依赖,这会阻止应用程序轻松迁移到另一个操作系统。 Java 的主要优势之一是能够在许多不同的平台上运行相同的字节码。使用这样的绝对路径会使代码的可移植性大大降低。
其次,根据文件的相对位置,此技术可能会创建外部依赖项并限制应用程序的移动性。如果该文件存在于应用程序的当前目录之外,则会创建一个外部依赖项,并且必须了解该依赖项才能将应用程序移动到另一台机器(容易出错)。
改为使用Class 类中的getResource() 方法。这使得应用程序更加便携。它可以移动到不同的平台、机器或目录,仍然可以正常工作。
【讨论】:
getClass().getClassLoader().getResource("image.jpg");
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;
} // ()
【讨论】:
available() 方法来a) 分配和b) 确定要从流中读取的字节数。永远不应该这样做,因为该方法不应该返回流中的总字节数。请参阅the javadoc:“使用此方法的返回值来分配一个旨在保存此流中所有数据的缓冲区是不正确的。”
您加载文件是为了什么 - 配置或数据(如输入文件)或作为资源?
BufferedReader file = new BufferedReader(new FileReader(filename))然后使用file.readLine();读取文件的每一行不要忘记关闭文件。
【讨论】:
getResource 很好,但使用相对路径也可以,只要您可以控制工作目录的位置(通常可以)。
此外,关于分隔符的平台依赖性可以使用File.separator、File.separatorChar 或System.getProperty("file.separator") 来解决。
【讨论】:
The name of a resource is a '/'-separated path name that identifies the resource。所以不要使用 File.separator。