2008-08-09 3 views

ответ

52

Короткий ответ

Используйте один из этих двух методов:

Например:

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

-

Длинный ответ

Как правило, один не хочет загружать файлы, используя абсолютные пути. Например, не делайте этого, если вы можете помочь ему:

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

Этот метод не рекомендуется, по крайней мере по двум причинам. Во-первых, он создает зависимость от конкретной операционной системы, которая не позволяет приложению легко перемещаться в другую операционную систему. Одним из основных преимуществ Java является возможность запуска одного и того же байт-кода на разных платформах. Использование абсолютного пути, как это делает код гораздо менее портативным.

Во-вторых, в зависимости от относительного расположения файла этот метод может создать внешнюю зависимость и ограничить мобильность приложения. Если файл существует вне текущего каталога приложения, это создает внешнюю зависимость, и вам нужно будет знать об этой зависимости, чтобы переместить приложение на другую машину (склонность к ошибкам).

Вместо этого используйте методы getResource() в классе Class. Это делает приложение более переносимым. Его можно перемещать на разные платформы, машины или каталоги и по-прежнему работать правильно.

+5

Esp. не делайте File («C: \ Users \ Joe \ image.jpg»), потому что \ U \ J и \ i - все экраны, и вы получите сообщение об ошибке. 2009-05-02 07:38:47

+0

Может также использовать его так: `getClass(). GetClassLoader(). GetResource (" image.jpg ");` – ktulinho 2013-05-31 13:45:39

+0

Нужно указать, что если вы находитесь в Windows NT или новее, вы можете * * используйте символ/как разделитель. Поэтому нет ОС, которые, как я знаю, имеют как JRE, так и не понимают изображения/splashimage.png, например. – 2017-07-01 20:44:53

8

getResource прекрасно, но использование относительных путей будет работать так же хорошо, если вы можете контролировать, где находится ваш рабочий каталог (который вы обычно можете).

Кроме того, зависимость платформы от характера разделителя может быть получена с использованием File.separator, File.separatorChar или System.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

У меня не было проблем, просто используя разделители путей в стиле unix, даже в Windows (хотя рекомендуется проверять File.separatorChar).

Метод использования ClassLoader.getResource() лучше всего подходит для ресурсов только для чтения, которые будут загружены из файлов JAR. Иногда, you can programmatically determine the application directory, что полезно для административно настраиваемых файлов или серверных приложений. (Конечно, редактируемые пользователем файлы должны храниться где-то в каталоге System.getProperty("user.home").)

7

Что вы загружаете файлы для - конфигурации или данных (например, входного файла) или в качестве ресурса?

  • Если в качестве ресурса, следовать предложению и пример, приведенный Will and Justin
  • Если конфигурация, то вы можете использовать ResourceBundle или Spring (если конфигурация является более сложным).
  • Если вам нужно прочитать файл, чтобы обработать данные внутри, этот фрагмент кода может помочь 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; 
} //() 

 Смежные вопросы

  • Нет связанных вопросов^_^