我应该如何将文件加载到Java应用程序中?
Answers:
简短的答案
使用以下两种方法之一:
例如:
InputStream inputStream = YourClass.class.getResourceAsStream("image.jpg");
-
长答案
通常,人们不希望使用绝对路径加载文件。例如,如果可以帮助,请不要这样做:
File file = new File("C:\\Users\\Joe\\image.jpg");
至少有两个原因,不建议使用此技术。首先,它创建了对特定操作系统的依赖关系,从而阻止了应用程序轻松移至另一个操作系统。Java的主要优点之一是能够在许多不同的平台上运行相同的字节码。使用这样的绝对路径会使代码的可移植性大大降低。
其次,根据文件的相对位置,此技术可能会创建外部依赖关系并限制应用程序的移动性。如果文件存在于应用程序的当前目录之外,则会创建一个外部依赖关系,因此必须将依赖关系知道才能将应用程序移至另一台计算机(容易出错)。
而是使用类中的getResource()
方法Class
。这使应用程序更加可移植。可以将其移动到不同的平台,机器或目录,并且仍然可以正常运行。
getClass().getClassLoader().getResource("image.jpg");
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。
您要为配置文件或数据(例如输入文件)或作为资源加载文件?
BufferedReader file = new BufferedReader(new FileReader(filename))
,然后使用“file.readLine();
不要忘记关闭文件”来读取文件的每一行。即使在Windows上,使用Unix样式的路径分隔符也没有问题(尽管检查File.separatorChar是一个好习惯)。
使用ClassLoader.getResource()的技术最适合将从JAR文件加载的只读资源。有时,您可以以编程方式确定应用程序目录,这对于可配置文件或服务器应用程序很有用。(当然,用户可编辑的文件应该存储在System.getProperty(“ user.home”)目录中的某个位置。)
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)确定要从流中读取的字节数。绝不应该这样做,因为该方法不应返回流中的字节总数。请参阅javadoc:“使用此方法的返回值分配旨在容纳该流中所有数据的缓冲区永远是不正确的。”
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 "";
}
}