Самый краткий способ прочитать содержимое файла / входного потока в Java?

Какой самый краткий способ прочитать содержимое файла или входного потока в Java? Всегда ли мне нужно создавать буфер, читать (максимум) построчно и так далее, или есть более лаконичный способ? Я бы хотел просто

String content = new File("test.txt").readFully();
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
0
5 285
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

String content = (new RandomAccessFile(new File("test.txt"))).readUTF();

К сожалению, Java очень требовательна к тому, чтобы исходный файл был действительным UTF8, иначе вы получите исключение EOFException или UTFDataFormatException.

Я не думаю, что дело в том, что Java «разборчива» в отношении текста, который вы читаете с помощью readUTF (), просто вы его неправильно используете. Прочтите это: java.sun.com/javase/6/docs/api/java/io/…

Alan Moore 22.10.2008 14:01

Полагаю, вам нужно создать свою собственную функцию. Проблема в том, что процедуры чтения Java (по крайней мере, те, которые я знаю) обычно принимают буферный аргумент заданной длины.

Решение, которое я видел, - это получить размер файла, создать буфер этого размера и сразу же прочитать файл. Надеюсь, что это не гигабайтный журнал или XML-файл ...

Обычный способ - иметь буфер фиксированного размера или использовать readLine и объединять результаты в StringBuffer / StringBuilder.

Вспомогательные функции. Я в основном использую несколько из них, в зависимости от ситуации

  • cat, который передает InputStream в OutputStream
  • метод, который вызывает cat к ByteArrayOutputStream и извлекает массив байтов, обеспечивая быстрое чтение всего файла в массив байтов
  • Реализация Iterator <String>, построенная с использованием Reader; он оборачивает его в BufferedReader и readLine в next ()
  • ...

Либо разверните свой собственный, либо используйте что-то из commons-io или вашу любимую библиотеку утилит.

Чтобы привести пример такой вспомогательной функции:

String[] lines = NioUtils.readInFile(componentxml);

Ключ в том, чтобы попытаться закрыть BufferedReader, даже если возникает исключение IOException.

/**
 * Read lines in a file. <br />
 * File must exist
 * @param f file to be read
 * @return array of lines, empty if file empty
 * @throws IOException if prb during access or closing of the file
 */
public static String[] readInFile(final File f) throws IOException
{
    final ArrayList lines = new ArrayList();
    IOException anioe = null;
    BufferedReader br = null; 
    try 
    {
        br = new BufferedReader(new FileReader(f));
        String line;
        line = br.readLine();
        while(line != null)
        {
            lines.add(line);
            line = br.readLine();
        }
        br.close();
        br = null;
    } 
    catch (final IOException e) 
    {
        anioe = e;
    }
    finally
    {
        if (br != null)
        {
            try {
                br.close();
            } catch (final IOException e) {
                anioe = e;
            }
        }
        if (anioe != null)
        {
            throw anioe;
        }
    }
    final String[] myStrings = new String[lines.size()];
    //myStrings = lines.toArray(myStrings);
    System.arraycopy(lines.toArray(), 0, myStrings, 0, lines.size());
    return myStrings;
}

(если вам просто нужна строка, измените функцию, чтобы добавить каждую строку в StringBuffer (или StringBuilder в java5 или 6)

Я не думаю, что чтение с использованием BufferedReader - хорошая идея, потому что BufferedReader вернет только содержимое строки без разделителя. Когда строка не содержит ничего, кроме символа новой строки, BR вернет ноль, хотя он все еще не достигает конца потока.

Нет. Когда BufferedReader видит два последовательных разделителя строк, readLine () возвращает пустую строку. Он возвращает значение null, только когда достигает конца файла.

Alan Moore 23.02.2009 06:57

Строка org.apache.commons.io.FileUtils.readFileToString (файл-файл)

Я думаю, что использование сканера вполне нормально с точки зрения лаконичности встроенных инструментов Java:

Scanner s = new Scanner(new File("file"));
StringBuilder builder = new StringBuilder();
while(s.hasNextLine()) builder.append(s.nextLine());

Кроме того, он также довольно гибкий (например, поддержка регулярных выражений, парсинг чисел).

хорошее решение. путь чище, чем все остальное

Janusz 08.07.2009 23:44

Выбери один отсюда.

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

Фаворитами были:

private static String readFile(String path) throws IOException {
  FileInputStream stream = new FileInputStream(new File(path));
  try {
    FileChannel fc = stream.getChannel();
    MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
    /* Instead of using default, pass in a decoder. */
    return CharSet.defaultCharset().decode(bb).toString();
  }
  finally {
    stream.close();
  }
}

Автор: Эриксон

Ответ принят как подходящий

Используйте пакет Apache Commons IOUtils. В частности, класс IOUtils предоставляет набор методов для чтения из потоков, средств чтения и т. д. И обработки всех исключений и т. д.

например

InputStream is = ...
String contents = IOUtils.toString(is);
// or
List lines = IOUtils.readLines(is)

Или способ Java 8:

try {
    String str = new String(Files.readAllBytes(Paths.get("myfile.txt")));
    ...
} catch (IOException ex) {
    Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
}

Можно передать соответствующий Charset конструктору String.

Другие вопросы по теме