Как мне загрузить файлы в мое Java-приложение?

Как мне загрузить файлы в мое Java-приложение?

9.08.2008 05:33:22
Если вы используете Maven и если ваш файл содержит текст, вам необходимо обратить внимание на кодировку (см. Здесь: tshikatshikaaa.blogspot.nl/2012/07/… )
Jérôme Verstrynge 27.07.2012 19:25:36
6 ОТВЕТОВ

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

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

Например:

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

-

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

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

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

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

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

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

54
7.02.2016 18:00:58
Особенно не делайте File («C: \ Users \ Joe \ image.jpg»), потому что \ U \ J и \ i - это экранирование, и вы получите ошибку. <smile>
Lawrence Dol 2.05.2009 07:38:47
Можно также использовать это так:getClass().getClassLoader().getResource("image.jpg");
ktulinho 31.05.2013 13:45:39
Что ж, следует отметить, что если вы работаете в Windows NT или новее, вы можете использовать символ / в качестве разделителя. Так что нет ни одной известной мне ОС, которая бы имела JRE и не понимала, например, images / splashimage.png.
Haakon Løtveit 1.07.2017 20:44:53

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

Кроме того, зависимость платформы от символа разделителя можно обойти, используя File.separator , File.separatorChar или System.getProperty ("file.separator") .

9
9.08.2008 07:18:04
docs.oracle.com/javase/7/docs/api/java/lang/... говорит: The name of a resource is a '/'-separated path name that identifies the resource. Так что не используйте File.separator.
Vsevolod Golovanov 18.08.2015 11:17:17

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

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

2
9.08.2008 09:16:10
На практике использование прямой косой черты работает на любой платформе Java (и я использовал их в Windows 2000, XP, Vista, Mobile, CE, Linux, OSX, OS / 400).
Lawrence Dol 2.05.2009 07:41:14

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

  • Если в качестве ресурса, следуйте предложению и примеру Уилла и Джастина.
  • Если конфигурация, то вы можете использовать ResourceBundle или Spring (если ваша конфигурация более сложная).
  • Если вам нужно прочитать файл для обработки данных внутри, этот фрагмент кода может помочь, BufferedReader file = new BufferedReader(new FileReader(filename))а затем прочитать каждую строку файла, используя « file.readLine(); Не забудьте закрыть файл».
7
23.05.2017 11:47:09
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;
} // ()
2
20.02.2011 17:21:44
При этом используется available()метод для а) выделения и б) определения количества байтов для чтения из потока. Это никогда не должно выполняться, поскольку метод не должен возвращать общее количество байтов в потоке. Смотрите javadoc : «Никогда не правильно использовать возвращаемое значение этого метода для выделения буфера, предназначенного для хранения всех данных в этом потоке».
f1sh 29.04.2014 14:46:47
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 "";
    }
}
0
23.12.2019 12:20:17
Привет Фриъято Часть Фриджат. Пожалуйста, рассмотрите возможность добавления дополнительной информации.
Tiago Martins Peres 李大仁 23.12.2019 12:48:16