Utils для чтения текстового файла ресурсов в String (Java)

Есть ли какая-нибудь утилита, которая помогает читать текстовый файл в ресурсе в String. Полагаю, это популярное требование, но после Googling я не нашел никакой полезности.

Да, Guava предоставляет это в classе Resources . Например:

 URL url = Resources.getResource("foo.txt"); String text = Resources.toString(url, Charsets.UTF_8); 

Вы можете использовать старый Stupid Scanner trick oneliner, чтобы сделать это без каких-либо дополнительных зависимостей, таких как guava:

 String text = new Scanner(AppropriateClass.class.getResourceAsStream("foo.txt"), "UTF-8").useDelimiter("\\A").next(); 

Ребята, не используйте сторонние вещи, если вам это действительно не нужно. В JDK уже много функциональности.

Для java 7:

 new String(Files.readAllBytes(Paths.get(getClass().getResource("foo.txt").toURI()))); 

У Guava есть метод toString для чтения файла в String:

 import com.google.common.base.Charsets; import com.google.common.io.Files; String content = Files.toString(new File("/home/x1/text.log"), Charsets.UTF_8); 

Этот метод не требует, чтобы файл находился в пути к classам (как в предыдущем ответе Джона Скита ).

У apache-commons-io есть имя утилиты FileUtils :

 URL url = Resources.getResource("myFile.txt"); File myFile = new File(url.toURI()); String content = FileUtils.readFileToString(myFile, "UTF-8"); // or any other encoding 

yegor256 нашел приятное решение с использованием Apache Commons IO :

 import org.apache.commons.io.IOUtils; String text = IOUtils.toString(this.getClass().getResourceAsStream("foo.xml"), "UTF-8"); 

Чистое и простое решение Java 8

Этот простой метод ниже будет очень хорош, если вы используете Java 8:

 /** * Reads given resource file as a string. * * @param fileName the path to the resource file * @return the file's contents or null if the file could not be opened */ public String getResourceFileAsString(String fileName) { InputStream is = getClass().getClassLoader().getResourceAsStream(fileName); if (is != null) { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); return reader.lines().collect(Collectors.joining(System.lineSeparator())); } return null; } 

И он также работает с ресурсами в файлах jar.

Там нет необходимости в больших, толстых библиотеках. Если вы уже не используете Guava или Apache Commons IO, добавляете эти библиотеки в свой проект, чтобы иметь возможность читать файл в виде строки, кажется, слишком много.


Загрузка из статического контекста

Поскольку это обычно означает функцию полезности, возможно, он захочет получить ее из статического classа утилит. Я немного изменил реализацию, поэтому метод можно объявить статическим. Он работает одинаково. Вот:

 /** * Reads given resource file as a string. * * @param fileName the path to the resource file * @return the file's contents or null if the file could not be opened */ public static String getResourceFileAsString(String fileName) { ClassLoader classLoader = ClassLoader.getSystemClassLoader(); InputStream is = classLoader.getResourceAsStream(fileName); if (is != null) { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); return reader.lines().collect(Collectors.joining(System.lineSeparator())); } return null; } 

У меня часто возникала эта проблема. Чтобы избежать зависимостей от небольших проектов, я часто пишу небольшую полезную функцию, когда мне не нужны коммиты io или такие. Вот код для загрузки содержимого файла в строковый буфер:

 StringBuffer sb = new StringBuffer(); BufferedReader br = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("path/to/textfile.txt"), "UTF-8")); for (int c = br.read(); c != -1; c = br.read()) sb.append((char)c); System.out.println(sb.toString()); 

В этом случае важно указать кодировку, потому что вы можете отредактировать свой файл в UTF-8, а затем поместить его в банку, а компьютер, который открывает файл, может иметь CP-1251 в качестве собственной кодировки файла (например) ; поэтому в этом случае вы никогда не знаете целевую кодировку, поэтому явная информация о кодировании имеет решающее значение. Также цикл для чтения символа файла char представляется неэффективным, но он используется на BufferedReader, и так на самом деле довольно быстро.

Вы можете использовать следующую форму кода Java

  new String(Files.readAllBytes(Paths.get(getClass().getResource("example.txt").toURI()))); 

Если вы хотите получить свою String из ресурса проекта, например, файл testcase / foo.json в src / main / resources в своем проекте, сделайте следующее:

 String myString= new String(Files.readAllBytes(Paths.get(getClass().getClassLoader().getResource("testcase/foo.json").toURI()))); 

Обратите внимание, что метод getClassLoader () отсутствует в некоторых других примерах.

Используйте FileUtils сообщества Apache. Он имеет метод readFileToString

Вот мой подход работал отлично

 public String getFileContent(String fileName) { String filePath = "myFolder/" + fileName+ ".json"; try(InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath)) { return IOUtils.toString(stream, "UTF-8"); } catch (IOException e) { // Please print your Exception } } 

Я использую следующее для чтения файлов ресурсов из classpath к classpath :

 import java.io.IOException; import java.io.InputStream; import java.net.URISyntaxException; import java.util.Scanner; public class ResourceUtilities { public static String resourceToString(String filePath) throws IOException, URISyntaxException { try (InputStream inputStream = ResourceUtilities.class.getClassLoader().getResourceAsStream(filePath)) { return inputStreamToString(inputStream); } } private static String inputStreamToString(InputStream inputStream) { try (Scanner scanner = new Scanner(inputStream).useDelimiter("\\A")) { return scanner.hasNext() ? scanner.next() : ""; } } } 

Никаких зависимостей третьих сторон не требуется.

В Guava также есть Files.readLines() если вы хотите получить возвращаемое значение в виде List по очереди:

 List lines = Files.readLines(new File("/file/path/input.txt"), Charsets.UTF_8); 

См. Здесь, чтобы сравнить 3 пути ( BufferedReader vs. Guava’s Files vs. Guava’s Resources ), чтобы получить String из текстового файла.

С набором статических импортов решение Guava может быть очень компактным однострочным:

 toString(getResource("foo.txt"), UTF_8); 

Требуется следующий импорт:

 import static com.google.common.io.Resources.getResource import static com.google.common.io.Resources.toString import static java.nio.charset.StandardCharsets.UTF_8 

Здесь я написал методы readResource () , чтобы иметь возможность сделать это одним простым вызовом. Это зависит от библиотеки Guava, но мне нравятся методы JDK-only, предложенные в других ответах, и я думаю, что я изменю их таким образом.

 package test; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.Scanner; public class Main { public static void main(String[] args) { try { String fileContent = getFileFromResources("resourcesFile.txt"); System.out.println(fileContent); } catch (Exception e) { e.printStackTrace(); } } //USE THIS FUNCTION TO READ CONTENT OF A FILE, IT MUST EXIST IN "RESOURCES" FOLDER public static String getFileFromResources(String fileName) throws Exception { ClassLoader classLoader = Main.class.getClassLoader(); InputStream stream = classLoader.getResourceAsStream(fileName); String text = null; try (Scanner scanner = new Scanner(stream, StandardCharsets.UTF_8.name())) { text = scanner.useDelimiter("\\A").next(); } return text; } } 

По крайней мере, с Apache commons-io 2.5, метод IOUtils.toString () поддерживает аргумент URI и возвращает содержимое файлов, расположенных внутри jars в пути к classам:

 IOUtils.toString(SomeClass.class.getResource(...).toURI(), ...) 
 public static byte[] readResoureStream(String resourcePath) throws IOException { ByteArrayOutputStream byteArray = new ByteArrayOutputStream(); InputStream in = CreateBffFile.class.getResourceAsStream(resourcePath); //Create buffer byte[] buffer = new byte[4096]; for (;;) { int nread = in.read(buffer); if (nread <= 0) { break; } byteArray.write(buffer, 0, nread); } return byteArray.toByteArray(); } Charset charset = StandardCharsets.UTF_8; String content = new String(FileReader.readResoureStream("/resource/...*.txt"), charset); String lines[] = content.split("\\n"); 
Давайте будем гением компьютера.