Как прочитать файл из ресурсов java
Перейти к содержимому

Как прочитать файл из ресурсов java

  • автор:

Прочитать файл из папки resources

Author24 — интернет-сервис помощи студентам

Обращение к файлам из папки Resources в проекте
Как обратиться к изображению в папке Resources, например вывести его в pictureBox?

Не запускается приложение без папки Resources
В чем может быть проблема? Я создаю в дебаге или в папке релиз приложение, выношу на рабочий.

Image. Как программно с папки Resources взять картинку?
Всем привет! Возможно это глупый вопрос но мне нужна помощь. Как программно с папки Resources.

Как задать путь открытия файла из папки \Resources после опубликования приложения?
Добрый день уважаемые форумчане. При создании приложения (используется VS2013) в Обозреватель.

Как прочитать файл из ресурсов java

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

Через конструктор класса FileOutputStream задается файл, в который производится запись. Класс поддерживает несколько конструкторов:

FileOutputStream(String filePath) FileOutputStream(File fileObj) FileOutputStream(String filePath, boolean append) FileOutputStream(File fileObj, boolean append)

Файл задается либо через строковый путь, либо через объект File. Второй параметр — append задает способ записи: eсли он равен true, то данные дозаписываются в конец файла, а при false — файл полностью перезаписывается

Например, запишем в файл строку:

import java.io.*; public class Program < public static void main(String[] args) < String text = "Hello world!"; // строка для записи try(FileOutputStream fos=new FileOutputStream("notes.txt")) < // перевод строки в байты byte[] buffer = text.getBytes(); fos.write(buffer, 0, buffer.length); System.out.println("The file has been written"); >catch(IOException ex) < System.out.println(ex.getMessage()); >> >

Для создания объекта FileOutputStream используется конструктор, принимающий в качестве параметра путь к файлу для записи. Если такого файла нет, то он автоматически создается при записи. Так как здесь записываем строку, то ее надо сначала перевести в массив байтов. И с помощью метода write строка записывается в файл.

Для автоматического закрытия файла и освобождения ресурса объект FileOutputStream создается с помощью конструктции try. catch.

При этом необязательно записывать весь массив байтов. Используя перегрузку метода write() , можно записать и одиночный байт:

fos.write(buffer[0]); // запись первого байта

Чтение файлов и класс FileInputStream

Для считывания данных из файла предназначен класс FileInputStream , который является наследником класса InputStream и поэтому реализует все его методы.

Для создания объекта FileInputStream мы можем использовать ряд конструкторов. Наиболее используемая версия конструктора в качестве параметра принимает путь к считываемому файлу:

FileInputStream(String fileName) throws FileNotFoundException

Если файл не может быть открыт, например, по указанному пути такого файла не существует, то генерируется исключение FileNotFoundException .

Считаем данные из ранее записанного файла и выведем на консоль:

import java.io.*; public class Program < public static void main(String[] args) < try(FileInputStream fin=new FileInputStream("notes.txt")) < int i; while((i=fin.read())!=-1)< System.out.print((char)i); >> catch(IOException ex) < System.out.println(ex.getMessage()); >> >

В данном случае мы считываем каждый отдельный байт в переменную i:

while((i=fin.read())!=-1)

Когда в потоке больше нет данных для чтения, метод возвращает число -1.

Затем каждый считанный байт конвертируется в объект типа char и выводится на консоль.

Подобным образом можно считать данные в массив байтов и затем производить с ним манипуляции:

import java.io.*; public class Program < public static void main(String[] args) < try(FileInputStream fin=new FileInputStream("notes.txt")) < byte[] buffer = new byte[256]; System.out.println("File data:"); int count; while((count=fin.read(buffer))!=-1)< for(int i=0; i> > catch(IOException ex) < System.out.println(ex.getMessage()); >> >

В данном случае с помощью метода read() считываем данные в массив buffer длиной 256 байтов. Метод возвращает количество считанных байтов.

Поскольк файл может быть больше 256 байтов, то считываем в цикле while до конца файла. Когда больше не останется файлов для считывания, то метод возвратит -1.

while((count=fin.read(buffer))!=-1)

Поскольку количество считанных байтов/размер файла могут быть меньше 256 байт, то реальное количество считанных байт сохраняем в переменную count. Затем выводим считанное количество данных на консоль в цикле for.

for(int i=0; i

Совместим оба класса и выполним чтение из одного и запись в другой файл:

import java.io.*; public class Program < public static void main(String[] args) < try(FileInputStream fin=new FileInputStream("notes.txt"); FileOutputStream fos=new FileOutputStream("notes_new.txt")) < byte[] buffer = new byte[256]; int count; // считываем буфер while((count=fin.read(buffer))!=-1)< // записываем из буфера в файл fos.write(buffer, 0, count); >System.out.println("File has been written"); > catch(IOException ex) < System.out.println(ex.getMessage()); >> >

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

Чтение ресурсных файлов

Помимо конфигурационных файлов в приложении бывает удобно хранить и некоторые другие файлы ресурсов. Например, тексты или изображения. Достаточно положить эти файлы в папку resources вашего проекта и в процессе выполнения вы сможете получить к ним доступ.

Например, нам нужно прочитать файл test.txt. Положим его в папку resources вашего проекта (она есть и в maven, и в gradle). Важно положить именно в ту resources, которая относится к самому приложению, а не к тестам, иначе вы не сможете обратиться к файлу.

public class ResourceReader <

public static void main(String[] args) throws Exception var example = new ResourceReader();
var content = example.readTextResource( "test.txt" );
System.out.println(content);
>

public String readTextResource(String filename) throws Exception var uri = getClass().getResource(String.format( "/%s" , filename)).toURI();
return Files.readString(Paths.get(uri));
>
>

Доступ к ресурсам мы получаем через метод getResource(), который имеется у объекта Class. Но доступ к классу из статичного контекста метода main() получить нельзя, поэтому мы сначала создаём экземпляр класса, а затем внутри него уже обращаемся к ресурсу. Обратите внимание, что имя ресурса начинается со слеша. Путь до ресурса указывается от корня папки resources. Для чтения содержимого файла целиком в строку используем метод Files.readString(), появившийся в Java 11. Если у вас более ранняя версия Java, то данный метод будет недоступен. В случае, если файл будет очень большим, также лучше данный метод не использовать, а читать файл с помощью буферизованного потока.

То же самое на kotlin:

fun main() <
val example = ResourceReader()
val content = example.readTextResource( "test.txt" )
println(content)
>

class ResourceReader fun readTextResource(filename: String): String val uri = this .javaClass.getResource( "/$filename" ).toURI()
return Files.readString(Paths.get(uri))
>
>

Ожидаемо, что код на kotlin более компактный.

Как считать с файла в коллекцию java

Для считывания данных из файла в коллекцию можно воспользоваться классом Scanner , который позволяет считывать данные из разных источников, включая файлы.

import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class FileToCollectionExample  public static void main(String[] args)  ListString> lines = new ArrayList<>(); try (Scanner scanner = new Scanner(new File("input.txt")))  while (scanner.hasNextLine())  String line = scanner.nextLine(); lines.add(line); > > catch (FileNotFoundException e)  e.printStackTrace(); > // do something with the lines System.out.println(lines); > > 
  • В этом примере мы создали объект Scanner , который читает данные из файла "input.txt" построчно.
  • Каждую считанную строку мы добавляем в список lines
  • Закрытие потока чтения данных из файла происходит автоматически благодаря использованию конструкции try-with-resources

После считывания всех строк мы можем обработать данные из коллекции как угодно.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *