Как мне загрузить файлы в мое Java-приложение?
Краткий ответ
Используйте один из этих двух методов:
Например:
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. У меня не было проблем с использованием разделителей путей в стиле Unix, даже в Windows (хотя рекомендуется проверять File.separatorChar ).
Техника использования ClassLoader.getResource () лучше всего подходит для ресурсов только для чтения, которые будут загружаться из файлов JAR. Иногда вы можете программно определить каталог приложения , что полезно для настраиваемых администратором файлов или серверных приложений. (Конечно, редактируемые пользователем файлы должны храниться где-то в каталоге System.getProperty ("user.home") .)
Для чего вы загружаете файлы - конфигурацию или данные (например, входной файл) или как ресурс?
- Если в качестве ресурса, следуйте предложению и примеру Уилла и Джастина.
- Если конфигурация, то вы можете использовать ResourceBundle или Spring (если ваша конфигурация более сложная).
- Если вам нужно прочитать файл для обработки данных внутри, этот фрагмент кода может помочь,
BufferedReader file = new BufferedReader(new FileReader(filename))
а затем прочитать каждую строку файла, используя «file.readLine();
Не забудьте закрыть файл».
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()
метод для а) выделения и б) определения количества байтов для чтения из потока. Это никогда не должно выполняться, поскольку метод не должен возвращать общее количество байтов в потоке. Смотрите 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 "";
}
}