2008-08-09 87 views

回答

52

简短的回答

使用以下两种方法之一:

例如:

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

-

长的答案

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

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

此技术至少有两个原因不推荐。首先,它会创建对特定操作系统的依赖关系,这会阻止应用程序轻松移动到其他操作系统。 Java的主要优点之一是能够在许多不同的平台上运行相同的字节码。使用这样的绝对路径使代码更加便于携带。

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

而是使用Class类中的getResource()方法。这使得应用程序更具可移植性。它可以被移动到不同的平台,机器或目录,并仍然正常工作。

+5

特别提示:不要做File(“C:\ Users \ Joe \ image.jpg”),因为\ U \ J和\我都是逃避,你会得到一个错误。 2009-05-02 07:38:47

+0

也可以像这样使用它: `getClass()。getClassLoader()。getResource(“image.jpg”);` – ktulinho 2013-05-31 13:45:39

+0

那么应该指出,如果你在Windows NT或更新的版本,你*可以*使用/字符作为分隔符。所以没有我知道的OS有JRE,并且不会理解images/splashimage.png。 – 2017-07-01 20:44:53

8

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

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

+1

http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String)说:“资源的名称是'/' - 分隔标识资源的路径名称。所以不要使用File.separator。 – 2015-08-18 11:17:17

2

即使在Windows上,我也没有遇到过使用unix风格路径分隔符的问题(尽管最好检查File.separatorChar)。

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

7

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

  • 如果作为一种资源,遵循Will and Justin
  • 给出。如果配置,那么你可以使用一个ResourceBundleSpring(如果你的配置较为复杂)的建议和例子。
  • 如果您需要读取文件以处理数据,则此代码段可能会帮助BufferedReader file = new BufferedReader(new FileReader(filename)),然后使用file.readLine();读取文件的每一行。不要忘记关闭文件。
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; 
} //() 
相关问题