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