【问题标题】:How should I load files into my Java application?我应该如何将文件加载到我的 Java 应用程序中?
【发布时间】:2010-09-05 14:51:07
【问题描述】:

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

【问题讨论】:

标签: java file loading


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 在实践中使用正斜杠适用于每个 Java 平台(我在 Windows 2000、XP、Vista、Mobile、CE、Linux、OSX、OS/400 上使用过它们)。
    【解决方案3】:
    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 "";
        }
    }
    

    【讨论】:

    • 嗨 Fridjato Part Fridjat。请考虑添加更多信息。
    【解决方案4】:

    简短回答

    使用以下两种方法之一:

    例如:

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

    --

    长答案

    通常,我们不想使用绝对路径加载文件。例如,如果你能帮助它,就不要这样做:

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

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

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

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

    【讨论】:

    • 特别是。不要做 File(“C:\Users\Joe\image.jpg”) 因为 \U \J 和 \i 都是转义符,你会得到一个错误。
    • 也可以这样使用:getClass().getClassLoader().getResource("image.jpg");
    • 那么应该指出,如果您使用的是 Windows NT 或更新版本,您可以使用 / 字符作为分隔符。因此,据我所知,没有一个操作系统既具有 JRE 又不理解 images/splashimage.png 等。
    【解决方案5】:
    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:“使用此方法的返回值来分配一个旨在保存此流中所有数据的缓冲区是不正确的。”
    【解决方案6】:

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

    • 如果作为资源,请遵循Will and Justin给出的建议和示例
    • 如果配置,那么您可以使用ResourceBundleSpring(如果您的配置更复杂)。
    • 如果你需要读取一个文件来处理里面的数据,这段代码sn -p可能会帮助BufferedReader file = new BufferedReader(new FileReader(filename))然后使用file.readLine();读取文件的每一行不要忘记关闭文件。

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-14
      • 2013-07-14
      • 1970-01-01
      • 2016-08-06
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多