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

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

Если вы используете Maven и если ваш файл содержит текст, вам нужно обратить внимание на кодировку (см. Здесь: tshikatshikaaa.blogspot.nl/2012/07/…)

Jérôme Verstrynge 27.07.2012 23:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
70
1
159 157
6

Ответы 6

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

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

  • 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. Это делает приложение более портативным. Его можно перемещать на разные платформы, машины или каталоги, и при этом он по-прежнему работает правильно.

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

Lawrence Dol 02.05.2009 11:38

Также можно использовать так: getClass().getClassLoader().getResource("image.jpg");

ktulinho 31.05.2013 17:45

Следует отметить, что если вы используете Windows NT или новее, может использует символ / в качестве разделителя. Итак, я не знаю ОС, которая имеет одновременно JRE и, например, не понимает images / splashimage.png.

Haakon Løtveit 01.07.2017 23:44

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

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

docs.oracle.com/javase/7/docs/api/java/lang/… says: The name of a resource is a '/'-separated path name that identifies the resource. So don't use File.separator.
Vsevolod Golovanov 18.08.2015 14:17

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

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

На практике использование косой черты работает на любой платформе Java (и я использовал их в Windows 2000, XP, Vista, Mobile, CE, Linux, OSX, OS / 400).

Lawrence Dol 02.05.2009 11:41

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

  • Если в качестве ресурса, следуйте совету и примеру Уилл и Джастин
  • Если конфигурация, то вы можете использовать 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: «Никогда нельзя использовать возвращаемое значение этого метода для выделения буфера, предназначенного для хранения всех данных в этом потоке».

f1sh 29.04.2014 18:46

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 "";
    }
}

Привет Фридьято. Партия Фритьят. Пожалуйста, подумайте о добавлении дополнительной информации.

Tiago Martins Peres 李大仁 23.12.2019 15:48

Другие вопросы по теме