Статьи Генератор паролей UUID MD5 Unix-время URL-encode Base64 Форматирование XML Ваш внешний IP Число прописью


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

Вернуться назад

1 марта 2020

Тэги: Kotlin gradle maven Java 11

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