Как мне загрузить файлы в мое Java-приложение?
Как мне загрузить файлы в мое Java-приложение?
7 ответов
Краткий ответ
Используйте один из этих двух методов:
Class.getResource(String)
Class.getResourceAsStream(String)
Например:
InputStream inputStream = YourClass.class.getResourceAsStream("image.jpg");
-
Длинный ответ
Как правило, не нужно загружать файлы, используя абсолютные пути. Например, не делайте этого, если можете помочь:
File file = new File("C:\\Users\\Joe\\image.jpg");
Этот метод не рекомендуется по крайней мере по двум причинам. Во-первых, он создает зависимость от конкретной операционной системы, которая не позволяет приложению легко перемещаться в другую операционную систему. Одним из основных преимуществ Java является возможность запускать один и тот же байт-код на разных платформах. Использование такого абсолютного пути делает код намного менее переносимым.
Во-вторых, в зависимости от относительного расположения файла этот метод может создать внешнюю зависимость и ограничить мобильность приложения. Если файл существует за пределами текущего каталога приложения, это создает внешнюю зависимость, и нужно было бы знать о зависимости, чтобы переместить приложение на другой компьютер (подверженный ошибкам).
Вместо этого используйте getResource()
методы в Class
учебный класс. Это делает приложение намного более портативным. Его можно перемещать на разные платформы, машины или каталоги и при этом функционировать правильно.
С getResource все в порядке, но использование относительных путей будет работать так же хорошо, если вы можете контролировать, где находится ваш рабочий каталог (что вы обычно можете).
Кроме того, зависимость платформы от символа разделителя можно обойти, используя File.separator, File.separatorChar или System.getProperty ("file.separator").
Для чего вы загружаете файлы - конфигурацию или данные (например, входной файл) или как ресурс?
- Если в качестве ресурса, следуйте предложению и примеру Уилла и Джастина.
- Если конфигурация, то вы можете использовать ResourceBundle или Spring (если ваша конфигурация более сложная).
- Если вам нужно прочитать файл для обработки данных внутри, этот фрагмент кода может помочь
BufferedReader file = new BufferedReader(new FileReader(filename))
а затем прочитать каждую строку файла, используяfile.readLine();
Не забудьте закрыть файл.
У меня не было проблем с использованием разделителей путей в стиле Unix, даже в Windows (хотя рекомендуется проверять 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;
} // ()
используйте docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ClassLoader.html#getResource(java.lang.String)
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 "";
}
}