17

Как создать строку Java из содержимого файла?

16

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

Существует ли лучший или другой способ прочитать файл в строку на 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();
}

}

5 ответ(ов)

1

В Java 7 и более ранних версиях у вас есть возможность читать содержимое текстового файла, используя класс Files из библиотеки java.nio.file. Для этого вы можете воспользоваться следующим примером:

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

String content = new String(Files.readAllBytes(Paths.get("readMe.txt")), StandardCharsets.UTF_8);

В этом коде мы сначала читаем все байты из файла "readMe.txt", а затем создаём строку, используя кодировку UTF-8.

С выходом Java 11, процесс чтения текстового файла стал ещё проще благодаря методу Files.readString(Path). Вот как это выглядит:

import java.nio.file.Files;
import java.nio.file.Path;

String content = Files.readString(Path.of("readMe.txt"));

В этом примере мы просто вызываем метод readString, передавая ему путь к файлу, и получаем содержимое файла в виде строки. Это более лаконичный и удобный способ по сравнению с версией для Java 7.

0

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

import java.nio.file.Files;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

String readFile(String filename) {
    // Создаем объект File с заданным именем файла
    File f = new File(filename);
    try {
        // Читаем содержимое файла в массив байтов
        byte[] bytes = Files.readAllBytes(f.toPath());
        // Преобразуем массив байтов в строку с кодировкой UTF-8
        return new String(bytes, "UTF-8");
    } catch (FileNotFoundException e) {
        // Обрабатываем случай, если файл не найден
        e.printStackTrace();
    } catch (IOException e) {
        // Обрабатываем другие ошибки ввода-вывода
        e.printStackTrace();
    }
    // Возвращаем пустую строку в случае ошибки
    return "";
}

Пояснения:

  1. Импорт классов: Убедитесь, что вы импортируете необходимые классы, такие как File, FileNotFoundException и IOException.
  2. Обработка исключений: Вы уже обрабатываете FileNotFoundException и IOException, что хорошо. Однако вместо printStackTrace() вы можете рассмотреть возможность обработки ошибок более элегантным образом, например, выбрасывая собственное исключение или выводя сообщение логирования.
  3. Кодировка: Вы используете кодировку UTF-8, что является хорошей практикой, так как она поддерживает множество символов.

Если у вас есть дополнительные вопросы или требуется более подробное объяснение, не стесняйтесь спрашивать!

0

Этот код нормализует разрывы строк, что может или не может совпадать с вашими реальными намерениями.

Вот альтернатива, которая этого не делает и, на мой взгляд, проще для понимания, чем код из NIO (хотя все равно использует java.nio.charset.Charset):

public static String readFile(String file, String csName)
            throws IOException {
    Charset cs = Charset.forName(csName);
    return readFile(file, cs);
}

public static String readFile(String file, Charset cs)
            throws IOException {
    // Нет реальной необходимости закрывать BufferedReader/InputStreamReader,
    // так как они только оборачивают поток
    FileInputStream stream = new FileInputStream(file);
    try {
        Reader reader = new BufferedReader(new InputStreamReader(stream, cs));
        StringBuilder builder = new StringBuilder();
        char[] buffer = new char[8192];
        int read;
        while ((read = reader.read(buffer, 0, buffer.length)) > 0) {
            builder.append(buffer, 0, read);
        }
        return builder.toString();
    } finally {
        // Потенциальная проблема: если здесь произойдет IOException,
        // это замаскирует любые другие. Обычно я использую вспомогательный
        // метод, который регистрирует исключения и игнорирует их.
        stream.close();
    }        
}

Если у вас возникнут дополнительные вопросы или потребуется дальнейшая помощь с кодом, не стесняйтесь спрашивать!

0

С тех пор как появилась JDK 11, вы можете использовать следующий подход для чтения содержимого файла:

String file = ...; // Укажите путь к вашему файлу
Path path = Paths.get(file);
String content = Files.readString(path);
// Или используйте readString(path, someCharset), если вам нужен Charset, отличный от UTF-8

Этот код позволяет удобно и просто считать содержимое текстового файла в виде строки, используя стандартные средства Java. Если вам нужно задать кодировку, просто передайте нужный Charset в метод readString.

0

Чтобы прочитать файл в двоичном формате и затем преобразовать его содержимое, вы можете воспользоваться следующим кодом на Java. Обратите внимание, что данный метод считывает файл и возвращает его содержимое в виде строки, используя кодировку UTF-8.

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("Файл " + filePath + " слишком большой, размер: " + len + " байт.");
        byte[] bytes = new byte[(int) len];
        dis.readFully(bytes);
        return new String(bytes, "UTF-8");
    } finally {
        dis.close();
    }
}

Пояснение работы:

  1. Создается DataInputStream, который обертывает FileInputStream для чтения файла.
  2. Затем определяем размер файла. Если размер превышает Integer.MAX_VALUE, выбрасывается исключение.
  3. Читаем файл в массив байтов с помощью метода readFully.
  4. Наконец, массив байтов преобразуется в строку с использованием кодировки UTF-8 и возвращается.

Обратите внимание на блок finally, который гарантирует закрытие потока, предотвращая утечки ресурсов.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь