Как мне создать строку Java из содержимого файла? - PullRequest
1368 голосов
/ 28 ноября 2008

Я уже некоторое время использую приведенную ниже идиому. И, похоже, он наиболее распространен, по крайней мере, на сайтах, которые я посетил.

Есть ли лучший / другой способ чтения файла в строку в Java?

private String readFile(String file) throws IOException {
    BufferedReader reader = new BufferedReader(new FileReader (file));
    String         line = null;
    StringBuilder  stringBuilder = new StringBuilder();
    String         ls = System.getProperty("line.separator");

    try {
        while((line = reader.readLine()) != null) {
            stringBuilder.append(line);
            stringBuilder.append(ls);
        }

        return stringBuilder.toString();
    } finally {
        reader.close();
    }
}

Ответы [ 33 ]

24 голосов
/ 17 октября 2011

Если это текстовый файл, почему бы не использовать apache commons-io ?

Имеет следующий метод

public static String readFileToString(File file) throws IOException

Если вы хотите, чтобы строки были списком, используйте

public static List<String> readLines(File file) throws IOException
24 голосов
/ 26 июня 2018

С JDK 11:

String file = ...
Path path = Paths.get(file);
String content = Files.readString(path);
// Or readString(path, someCharset), if you need a Charset different from UTF-8
16 голосов
/ 19 апреля 2016

В Java 7 это мой предпочтительный вариант для чтения файла UTF-8:

String content = new String(Files.readAllBytes(Paths.get(filename)), "UTF-8");

Начиная с Java 7, JDK имеет новый java.nio.file API, который предоставляет множество ярлыков, поэтому сторонние библиотеки не всегда требуются для простых файловых операций.

16 голосов
/ 18 апреля 2010

Для чтения файла в двоичном виде и преобразования в конце

public static String readFileAsString(String filePath) throws IOException {
    DataInputStream dis = new DataInputStream(new FileInputStream(filePath));
    try {
        long len = new File(filePath).length();
        if (len > Integer.MAX_VALUE) throw new IOException("File "+filePath+" too large, was "+len+" bytes.");
        byte[] bytes = new byte[(int) len];
        dis.readFully(bytes);
        return new String(bytes, "UTF-8");
    } finally {
        dis.close();
    }
}
15 голосов
/ 28 ноября 2008

Java пытается быть чрезвычайно универсальным и гибким во всем, что делает. В результате, что-то относительно простое в языке сценариев (ваш код будет заменен на "open(file).read()" в Python) намного сложнее. Кажется, нет более короткого способа сделать это, кроме использования внешней библиотеки (как упомянуто Willi aus Rohr ). Ваши варианты:

  • Использовать внешнюю библиотеку.
  • Скопируйте этот код во все ваши проекты.
  • Создайте свою собственную мини-библиотеку, которая содержит функции, которые вы часто используете.

Ваша лучшая ставка, вероятно, вторая, поскольку она имеет наименьшее количество зависимостей.

11 голосов
/ 21 июня 2018

Использование JDK 8 или выше:

внешние библиотеки не используются

Вы можете создать новый объект String из содержимого файла (используя классы из пакета java.nio.file):

public String readStringFromFile(String filePath) throws IOException {
    String fileContent = new String(Files.readAllBytes(Paths.get(filePath)));
    return fileContent;
}
8 голосов
/ 28 ноября 2008

Существует вариант в той же теме, который использует цикл for вместо цикла while для ограничения области действия строковой переменной. Является ли это "лучше" - дело личного вкуса.

for(String line = reader.readLine(); line != null; line = reader.readLine()) {
    stringBuilder.append(line);
    stringBuilder.append(ls);
}
7 голосов
/ 06 января 2015

Если у вас нет доступа к классу Files, вы можете использовать собственное решение.

static String readFile(File file, String charset)
        throws IOException
{
    FileInputStream fileInputStream = new FileInputStream(file);
    byte[] buffer = new byte[fileInputStream.available()];
    int length = fileInputStream.read(buffer);
    fileInputStream.close();
    return new String(buffer, 0, length, charset);
}
4 голосов
/ 15 февраля 2012

Гибкое решение с использованием IOUtils от Apache commons-io в сочетании с StringWriter :

Reader input = new FileReader();
StringWriter output = new StringWriter();
try {
  IOUtils.copy(input, output);
} finally {
  input.close();
}
String fileContents = output.toString();

Работает с любым ридером или потоком ввода (не только с файлами), например, при чтении с URL.

3 голосов
/ 15 марта 2013

Имейте в виду, что при использовании fileInputStream.available() возвращаемое целое число не обязательно должно представлять фактический размер файла, а скорее предполагаемое количество байтов, которое система должна быть в состоянии прочитать из потока без блокировки ввода-вывода. Безопасный и простой способ может выглядеть следующим образом

public String readStringFromInputStream(FileInputStream fileInputStream) {
    StringBuffer stringBuffer = new StringBuffer();
    try {
        byte[] buffer;
        while (fileInputStream.available() > 0) {
            buffer = new byte[fileInputStream.available()];
            fileInputStream.read(buffer);
            stringBuffer.append(new String(buffer, "ISO-8859-1"));
        }
    } catch (FileNotFoundException e) {
    } catch (IOException e) { }
    return stringBuffer.toString();
}

Следует учитывать, что этот подход не подходит для многобайтовых кодировок символов, таких как UTF-8.

...