72

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

4

7 回答 7

56

简短的回答

使用以下两种方法之一:

例如:

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

--

长答案

通常,不想使用绝对路径加载文件。例如,如果您能提供帮助,请不要这样做:

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

至少有两个原因不推荐使用这种技术。首先,它创建了对特定操作系统的依赖,这会阻止应用程序轻松迁移到另一个操作系统。Java 的主要优点之一是能够在许多不同的平台上运行相同的字节码。使用这样的绝对路径会使代码的可移植性大大降低。

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

相反,使用类getResource()中的方法Class。这使得应用程序更加便携。它可以移动到不同的平台、机器或目录,并且仍然可以正常工作。

于 2008-08-09T05:35:50.623 回答
10

getResource 很好,但是使用相对路径也可以,只要您可以控制工作目录的位置(通常可以)。

此外,可以使用File.separatorFile.separatorCharSystem.getProperty("file.separator")来解决有关分隔符的平台依赖性。

于 2008-08-09T07:18:04.550 回答
8

你加载文件是为了什么 - 配置或数据(如输入文件)或作为资源?

  • 如果作为资源,请遵循Will 和 Justin给出的建议和示例
  • 如果配置,那么您可以使用ResourceBundleSpring(如果您的配置更复杂)。
  • 如果您需要读取文件以处理其中的数据,此代码段可能会有所帮助BufferedReader file = new BufferedReader(new FileReader(filename)),然后使用file.readLine(); “不要忘记关闭文件”读取文件的每一行。
于 2008-08-27T18:47:33.393 回答
3

即使在 Windows 上,仅使用 Unix 样式的路径分隔符我也没有问题(尽管检查File.separatorChar是一种好习惯)。

使用ClassLoader.getResource()的技术最适合将从 JAR 文件加载的只读资源。有时,您可以以编程方式确定应用程序目录,这对于管理员可配置文件或服务器应用程序很有用。(当然,用户可编辑的文件应该存储在System.getProperty("user.home")目录中的某个位置。)

于 2008-08-09T09:16:10.023 回答
2
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;
} // ()
于 2011-02-20T17:21:44.813 回答
1

使用 docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ClassLoader.html#getResource(java.lang.String)

于 2021-06-15T15:59:19.570 回答
0
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 "";
    }
}
于 2019-12-23T12:20:17.890 回答