Самый краткий способ прочитать содержимое потока файла / ввода в Java? - PullRequest
4 голосов
/ 22 октября 2008

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

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

Ответы [ 10 ]

7 голосов
/ 23 февраля 2009

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

, например

InputStream is = ...
String contents = IOUtils.toString(is);
// or
List lines = IOUtils.readLines(is)
5 голосов
/ 23 февраля 2009

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

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

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

2 голосов
/ 22 октября 2008

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

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

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

1 голос
/ 22 октября 2008

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

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;
}

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

1 голос
/ 22 октября 2008
String content = (new RandomAccessFile(new File("test.txt"))).readUTF();

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

0 голосов
/ 11 января 2017

Или 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.

0 голосов
/ 23 февраля 2009

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

Как создать строку 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();
  }
}

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

0 голосов
/ 23 февраля 2009

String org.apache.commons.io.FileUtils.readFileToString (файл файла)

0 голосов
/ 23 февраля 2009

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

0 голосов
/ 22 октября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...