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


Answers:


56

简短的答案

使用以下两种方法之一:

例如:

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

-

长答案

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

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

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

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

而是使用类中的getResource()方法Class。这使应用程序更加可移植。可以将其移动到不同的平台,机器或目录,并且仍然可以正常运行。


7
Esp。不要执行File(“ C:\ Users \ Joe \ image.jpg”),因为\ U \ J和\ i都是转义符,并且会出现错误。<微笑>
劳伦斯·多尔

1
也可以像这样使用它:getClass().getClassLoader().getResource("image.jpg");
ktulinho,2013年

应当指出的是,如果您使用的是Windows NT或更高版本,则可以使用/字符作为分隔符。因此,据我所知,没有一个操作系统既具有JRE,又不了解images / splashimage.png。
HaakonLøtveit17年

9

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

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


1
docs.oracle.com/javase/7/docs/api/java/lang/…说:The name of a resource is a '/'-separated path name that identifies the resource。因此,请勿使用File.separator。
Vsevolod Golovanov

8

您要为配置文件或数据(例如输入文件)或作为资源加载文件?

  • 如果作为资源,请遵循Will和Justin的建议和示例
  • 如果进行配置,则可以使用ResourceBundleSpring(如果您的配置更为复杂)。
  • 如果您需要读取文件以处理内部数据,此代码段可能会有所帮助BufferedReader file = new BufferedReader(new FileReader(filename)),然后使用“file.readLine(); 不要忘记关闭文件”来读取文件的每一行。

3

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

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


1
实际上,在每个Java平台上都可以使用正斜杠(并且我已经使用了Windows 2000,XP,Vista,Mobile,CE,Linux,OSX,OS / 400)。
劳伦斯·多尔

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;
} // ()

4
这使用available()方法a)分配和b)确定要从流中读取的字节数。绝不应该这样做,因为该方法不应返回流中的字节总数。请参阅javadoc:“使用此方法的返回值分配旨在容纳该流中所有数据的缓冲区永远是不正确的。”
f1sh 2014年

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 "";
    }
}

您好Fridjato Part Fridjat。请考虑添加更多信息。
Tiago Martins Peres李大仁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.