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

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

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

person OscarRyz    schedule 28.11.2008    source источник
comment
Может ли кто-нибудь очень просто объяснить мне, что с NIO? Каждый раз, когда читаю об этом, я теряюсь в n-м упоминании канала :(   -  person OscarRyz    schedule 28.11.2008
comment
помните, что не гарантируется, что разделитель строк в файле не является таким же, как системный разделитель строк.   -  person Henrik Paul    schedule 28.11.2008
comment
В приведенном выше коде есть ошибка добавления дополнительного символа новой строки в последнюю строку. Это должно быть что-то вроде следующего if (line = reader.readLine ())! = Null) {stringBuilder.append (line); } пока (строка = reader.readLine ())! = ноль) {stringBuilder.append (ls); stringBuilder.append (строка); }   -  person Deep    schedule 12.08.2011
comment
Java 7 представляет byte[] Files.readAllBytes(file); Тем, кто предлагает решение «однострочного» сканера: не нужно ли его закрывать?   -  person Val    schedule 17.01.2012
comment
@OscarRyz Самым большим изменением для меня является то, что NIO позволяет вам прослушивать множество портов, не выделяя каждому потоку. Не проблема, если вы не хотите отправить пакет на каждую машину в сетевом адресном пространстве класса B (65 тыс. Адресов), чтобы увидеть, что существует, в Windows заканчиваются потоки примерно на 20 тыс. сеть класса A / B, до NIO было тяжело).   -  person Bill K    schedule 17.03.2015
comment
Если вы видите реализацию Files.readAllBytes (), вы заметите, что она использует закрываемый канал. Так что не нужно закрывать его явно.   -  person Rajesh Goel    schedule 06.06.2017
comment
С появлением Groovy вы можете читать файл таким образом: return new File (file) .text ()   -  person Piko    schedule 02.08.2017
comment
Связывание другой ссылки StackOverflow, поиск которой хорошо объяснен: stackoverflow.com/questions/14169661/   -  person Love Bisaria    schedule 14.11.2017
comment
@Deep Последняя строка в текстовом файле обычно заканчивается строкой, поэтому то, что вы описываете как ошибка, не является ошибкой, и в вашем коде есть ошибка удаления всех ограничителей строки.   -  person user207421    schedule 08.02.2019
comment
Пожалуйста, примите ответ на свой вопрос и помогите решить эту проблему.   -  person Alan    schedule 19.07.2021


Ответы (32)


Прочитать весь текст из файла

В Java 11 добавлен тег readString () для чтения небольших файлов как String, сохраняя символы конца строки:

String content = Files.readString(path, StandardCharsets.US_ASCII);

Для версий между Java 7 и 11 вот компактная и надежная идиома, заключенная в служебный метод:

static String readFile(String path, Charset encoding)
  throws IOException
{
  byte[] encoded = Files.readAllBytes(Paths.get(path));
  return new String(encoded, encoding);
}

Прочитать строки текста из файла

В Java 7 добавлен удобный метод чтения файла в виде строк текста, представленный как List<String>. Этот подход подразумевает потери, поскольку разделители строк удаляются с конца каждой строки.

List<String> lines = Files.readAllLines(Paths.get(path), encoding);

В Java 8 добавлен тег _ 6_ для создания Stream<String>. Опять же, этот метод с потерями, потому что разделители строк удаляются. Если при чтении файла встречается IOException, он помещается в UncheckedIOException, поскольку Stream не принимает лямбда-выражения, которые генерируют проверенные исключения.

try (Stream<String> lines = Files.lines(path, encoding)) {
  lines.forEach(System.out::println);
}

Для этого Stream требуется close() < / a> вызов; это плохо задокументировано в API, и я подозреваю, что многие люди даже не замечают, что Stream имеет close() метод. Обязательно используйте блок ARM, как показано на рисунке.

Если вы работаете с источником, отличным от файла, вы можете использовать _ 16_ в BufferedReader.

Использование памяти

Первый метод, который сохраняет разрывы строк, может временно потребовать память, в несколько раз превышающую размер файла, потому что на короткое время необработанное содержимое файла (массив байтов) и декодированные символы (каждый из которых имеет 16 бит, даже если он закодирован как 8 бит в файле) одновременно находятся в памяти. Безопаснее всего применять к файлам, которые, как вы знаете, имеют небольшой размер по сравнению с доступной памятью.

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

Для чтения больших файлов вам понадобится другой дизайн вашей программы, такой, который считывает фрагмент текста из потока, обрабатывает его, а затем переходит к следующему, повторно используя тот же блок памяти фиксированного размера. Здесь многое зависит от характеристик компьютера. В настоящее время этот порог может составлять несколько гигабайт оперативной памяти. Третий метод с использованием Stream<String> - это один из способов сделать это, если ваши входные записи являются отдельными строками. (Использование readLine() метода BufferedReader является процедурным эквивалентом этого подхода.)

Кодировка символов

Одна вещь, которой не хватает в образце исходного сообщения, - это кодировка символов. Есть некоторые особые случаи, когда платформа по умолчанию - это то, что вы хотите, но они редки, и вы должны быть в состоянии обосновать свой выбор.

Класс StandardCharsets определяет некоторые константы для кодировки, необходимые для всех сред выполнения Java:

String content = readFile("test.txt", StandardCharsets.UTF_8);

Платформа по умолчанию доступна по адресу сам Charset класс:

String content = readFile("test.txt", Charset.defaultCharset());

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

person erickson    schedule 28.11.2008
comment
Примечание: немного поработав этот код, я обнаружил, что вы не можете надежно удалить файл сразу после его прочтения с помощью этого метода, что в некоторых случаях может быть не проблемой, но не для меня. Может быть, это связано с этой проблемой: bugs.sun.com/bugdatabase/view_bug .do? bug_id = 4715154? В конце концов я согласился с предложением Джона Скита, который не страдает этой ошибкой. В любом случае, я просто хотел дать информацию другим людям, на всякий случай ... - person Sébastien Nussbaumer; 19.08.2010

Если вы хотите использовать внешнюю библиотеку, ознакомьтесь с Apache Commons IO (200 КБ БАНКА). Он содержит _ 1_, который позволяет вам прочитать весь File в String с помощью одной строчки кода.

Пример:

import java.io.*;
import java.nio.charset.*;
import org.apache.commons.io.*;

public String readFile() throws IOException {
    File file = new File("data.txt");
    return FileUtils.readFileToString(file, StandardCharsets.UTF_8);
}
person Willi aus Rohr    schedule 28.11.2008

Очень простое решение, основанное на Scanner:

Scanner scanner = new Scanner( new File("poem.txt") );
String text = scanner.useDelimiter("\\A").next();
scanner.close(); // Put this call in a finally block

Или, если вы хотите установить кодировку:

Scanner scanner = new Scanner( new File("poem.txt"), "UTF-8" );
String text = scanner.useDelimiter("\\A").next();
scanner.close(); // Put this call in a finally block

Или с помощью блока try-with-resources, который будет позвоните scanner.close() для вас:

try (Scanner scanner = new Scanner( new File("poem.txt"), "UTF-8" )) {
    String text = scanner.useDelimiter("\\A").next();
}

Помните, что конструктор Scanner может выдавать IOException. И не забудьте импортировать java.io и java.util.

Источник: Блог Пэта Нимейера

person Pablo Grisafi    schedule 16.09.2011
comment
\\ A работает, потому что нет другого начала файла, поэтому вы фактически читаете последний токен ... который также является первым. Никогда не пробовал с \\ Z. Также обратите внимание, что вы можете читать все, что доступно для чтения, например, Files, InputStreams, каналы ... Иногда я использую этот код для чтения из окна дисплея eclipse, когда я не уверен, читаю ли я тот или иной файл .. .да, путь к классам меня смущает. - person Pablo Grisafi; 17.09.2011
comment
Сканер реализует Closeable (он вызывает close для источника), поэтому, хотя он элегантен, он не должен быть однострочным. Размер буфера по умолчанию - 1024, но Scanner при необходимости увеличит его размер (см. Scanner # makeSpace ()) - person earcam; 23.11.2012

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

начиная с java 7 вы можете сделать это таким образом.

person J J    schedule 28.10.2016

Если вы ищете альтернативу, не использующую стороннюю библиотеку (например, Commons I / O), вы можете использовать сканер класс:

private String readFile(String pathname) throws IOException {

    File file = new File(pathname);
    StringBuilder fileContents = new StringBuilder((int)file.length());        

    try (Scanner scanner = new Scanner(file)) {
        while(scanner.hasNextLine()) {
            fileContents.append(scanner.nextLine() + System.lineSeparator());
        }
        return fileContents.toString();
    }
}
person Dónal    schedule 28.11.2008

Guava имеет метод, аналогичный методу из Commons IOUtils, о котором упоминал Вилли аус Рор:

import com.google.common.base.Charsets;
import com.google.common.io.Files;

// ...

String text = Files.toString(new File(path), Charsets.UTF_8);

РЕДАКТИРОВАТЬ от PiggyPiglet
Files#toString устарело и подлежит удалению в октябре 2019 года. Вместо этого используйте Files.asCharSource(new File(path), StandardCharsets.UTF_8).read();

ИЗМЕНИТЬ Оскар Рейес

Это (упрощенный) базовый код указанной библиотеки:

InputStream in = new FileInputStream(file);
byte[] b  = new byte[file.length()];
int len = b.length;
int total = 0;

while (total < len) {
  int result = in.read(b, total, len - total);
  if (result == -1) {
    break;
  }
  total += result;
}

return new String( b , Charsets.UTF_8 );

Изменить (автор: Jonik): приведенное выше не соответствует исходному коду последних версий Guava. Для текущего источника см. Классы Файлы, CharStreams, ByteSource и CharSource в com.google.common.io пакет.

person Community    schedule 08.02.2010
comment
Этот код имеет преобразование от long к int, что может вызвать сумасшедшее поведение с большими файлами. Есть лишние пробелы и где вы закрываете поток ввода? - person Mohamed Taher Alrefaie; 22.04.2013
comment
@MTA: поток закрыт, обратите внимание на использование Closer в CharSource. Код в ответе не является фактическим текущим исходным кодом Guava. - person Jonik; 29.12.2013

Если вам нужна обработка строк (параллельная обработка), в Java 8 есть отличный Stream API.

String result = Files.lines(Paths.get("file.txt"))
                    .parallel() // for parallel processing 
                    .map(String::trim) // to change line   
                    .filter(line -> line.length() > 2) // to filter some lines by a predicate                        
                    .collect(Collectors.joining()); // to join lines

Дополнительные примеры доступны в примерах JDK sample/lambda/BulkDataOperations, которые можно загрузить со страницы Oracle Java SE 8 для загрузки страница

Еще один пример лайнера

String out = String.join("\n", Files.readAllLines(Paths.get("file.txt")));
person Andrei N    schedule 29.10.2014

Этот код нормализует разрывы строк, что может быть, а может и не быть тем, что вы действительно хотите делать.

Вот альтернатива, которая этого не делает и которая (IMO) проще для понимания, чем код 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 {
    // No real need to close the BufferedReader/InputStreamReader
    // as they're only wrapping the stream
    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 {
        // Potential issue here: if this throws an IOException,
        // it will mask any others. Normally I'd use a utility
        // method which would log exceptions and swallow them
        stream.close();
    }        
}
person Jon Skeet    schedule 28.11.2008
comment
Простите меня за то, что я возродил такой старый комментарий, но вы хотели передать объект String с именем file, или это должен быть объект File? - person Bryan Larson; 05.06.2013
comment
Отличный ответ. +1. Но этому ответу 12 лет. В Java теперь есть возможность попробовать ресурсы. - person Harshal Parekh; 10.11.2020

Собрал все возможные способы чтения файла в виде строки с диска или сети.

  • Guava: Google с использованием классов _ 1_, _ 2_

    static Charset charset = com.google.common.base.Charsets.UTF_8;
    public static String guava_ServerFile( URL url ) throws IOException {
        return Resources.toString( url, charset );
    }
    public static String guava_DiskFile( File file ) throws IOException {
        return Files.toString( file, charset );
    }
    

  • APACHE - COMMONS IO с использованием классов IOUtils, FileUtils

    static Charset encoding = org.apache.commons.io.Charsets.UTF_8;
    public static String commons_IOUtils( URL url ) throws IOException {
        java.io.InputStream in = url.openStream();
        try {
            return IOUtils.toString( in, encoding );
        } finally {
            IOUtils.closeQuietly(in);
        }
    }
    public static String commons_FileUtils( File file ) throws IOException {
        return FileUtils.readFileToString( file, encoding );
        /*List<String> lines = FileUtils.readLines( fileName, encoding );
        return lines.stream().collect( Collectors.joining("\n") );*/
    }
    

  • BufferReader в Java 8 с использованием Stream API

    public static String streamURL_Buffer( URL url ) throws IOException {
        java.io.InputStream source = url.openStream();
        BufferedReader reader = new BufferedReader( new InputStreamReader( source ) );
        //List<String> lines = reader.lines().collect( Collectors.toList() );
        return reader.lines().collect( Collectors.joining( System.lineSeparator() ) );
    }
    public static String streamFile_Buffer( File file ) throws IOException {
        BufferedReader reader = new BufferedReader( new FileReader( file ) );
        return reader.lines().collect(Collectors.joining(System.lineSeparator()));
    }
    

  • Класс сканера с регулярным выражением \A. что соответствует началу ввода.

    static String charsetName = java.nio.charset.StandardCharsets.UTF_8.toString();
    public static String streamURL_Scanner( URL url ) throws IOException {
        java.io.InputStream source = url.openStream();
        Scanner scanner = new Scanner(source, charsetName).useDelimiter("\\A");
        return scanner.hasNext() ? scanner.next() : "";
    }
    public static String streamFile_Scanner( File file ) throws IOException {
        Scanner scanner = new Scanner(file, charsetName).useDelimiter("\\A");
        return scanner.hasNext() ? scanner.next() : "";
    }
    

  • Java 7 (java.nio.file.Files.readAllBytes)

    public static String getDiskFile_Java7( File file ) throws IOException {
        byte[] readAllBytes = java.nio.file.Files.readAllBytes(Paths.get( file.getAbsolutePath() ));
        return new String( readAllBytes );
    }
    

  • BufferedReader с использованием InputStreamReader.

    public static String getDiskFile_Lines( File file ) throws IOException {
        StringBuffer text = new StringBuffer();
        FileInputStream fileStream = new FileInputStream( file );
        BufferedReader br = new BufferedReader( new InputStreamReader( fileStream ) );
        for ( String line; (line = br.readLine()) != null; )
            text.append( line + System.lineSeparator() );
        return text.toString();
    }
    

Пример с основным методом для доступа к вышеуказанным методам.

public static void main(String[] args) throws IOException {
    String fileName = "E:/parametarisation.csv";
    File file = new File( fileName );

    String fileStream = commons_FileUtils( file );
            // guava_DiskFile( file );
            // streamFile_Buffer( file );
            // getDiskFile_Java7( file );
            // getDiskFile_Lines( file );
    System.out.println( " File Over Disk : \n"+ fileStream );


    try {
        String src = "https://code.jquery.com/jquery-3.2.1.js";
        URL url = new URL( src );

        String urlStream = commons_IOUtils( url );
                // guava_ServerFile( url );
                // streamURL_Scanner( url );
                // streamURL_Buffer( url );
        System.out.println( " File Over Network : \n"+ urlStream );
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
}

@видеть

person Yash    schedule 29.05.2018

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

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

public static String readFileToString(File file) throws IOException

Если вы хотите, чтобы строки в виде списка использовали

public static List<String> readLines(File file) throws IOException
person Home in Time    schedule 17.10.2011

Начиная с 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
person leventov    schedule 26.06.2018
comment
Зачем, ну зачем вводить новые методы, основанные на кодировке по умолчанию в 2018 году? - person mryan; 24.09.2018
comment
@mryan этот метод не полагается на системную кодировку по умолчанию. По умолчанию используется UTF-8, это нормально. - person leventov; 24.09.2018
comment
@leventov ты прав! как и Files.readAllLines! что делает API файлов не очень совместимым со старыми методами, но это к лучшему :) - person mryan; 25.09.2018

Чтобы прочитать файл как двоичный и преобразовать в конце

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();
    }
}
person Peter Lawrey    schedule 18.04.2010

В Java 7 я предпочитаю читать файл UTF-8:

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

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

person Moritz Petersen    schedule 19.04.2016

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

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

Лучше всего, вероятно, будет второй вариант, так как он имеет наименьшее количество зависимостей.

person Claudiu    schedule 28.11.2008
comment
Ага. Это заставляет язык высокого уровня принимать другое значение. Java имеет высокий уровень по сравнению с C, но низкий по сравнению с Python или Ruby. - person OscarRyz; 28.11.2008
comment
Согласитесь, что в Java много абстракций высокого уровня, но мало удобных методов. - person Dónal; 11.05.2011
comment
Действительно, в Java есть безумное количество способов работы с файлами, и многие из них кажутся сложными. Но это довольно близко к тому, что мы имеем в языках более высокого уровня: byte[] bytes = Files.readAllBytes(someFile.toPath()); - person Thorn; 17.04.2013

Используя JDK 8 или выше:

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

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

public String readStringFromFile(String filePath) throws IOException {
    String fileContent = new String(Files.readAllBytes(Paths.get(filePath)));
    return fileContent;
}
person Saikat    schedule 21.06.2018
comment
Дубликат ответа Морица Петерсена, который написал: String content = new String (Files.readAllBytes (Paths.get (filename)), UTF-8); - person Jean-Christophe Blanchard; 29.11.2018

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

for(String line = reader.readLine(); line != null; line = reader.readLine()) {
    stringBuilder.append(line);
    stringBuilder.append(ls);
}
person Dan Dyer    schedule 28.11.2008
comment
Это изменит символы новой строки на выбор по умолчанию. Это может быть желательно или непреднамеренно. - person Peter Lawrey; 18.04.2010
comment
Откатил редактирование этого ответа, потому что цель заключалась в том, чтобы сузить область действия переменной line. Редакция объявила это дважды, что было бы ошибкой компиляции. - person Dan Dyer; 02.08.2013

Если у вас нет доступа к классу 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);
}
person Ilya Gazman    schedule 06.01.2015
comment
пример кодировки для вызова? - person Thufir; 30.12.2018

Гибкое решение с использованием 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-адреса.

person wau    schedule 15.02.2012

Имейте в виду, что при использовании 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.

person Henry    schedule 15.03.2013

Здесь используется метод RandomAccessFile.readFully, кажется, он доступен в JDK 1.0!

public static String readFileContent(String filename, Charset charset) throws IOException {
    RandomAccessFile raf = null;
    try {
        raf = new RandomAccessFile(filename, "r");
        byte[] buffer = new byte[(int)raf.length()];
        raf.readFully(buffer);
        return new String(buffer, charset);
    } finally {
        closeStream(raf);
    }
} 


private static void closeStream(Closeable c) {
    if (c != null) {
        try {
            c.close();
        } catch (IOException ex) {
            // do nothing
        }
    }
}
person barjak    schedule 23.10.2011

Вы можете попробовать класс Scanner и File, решение из нескольких строк

 try
{
  String content = new Scanner(new File("file.txt")).useDelimiter("\\Z").next();
  System.out.println(content);
}
catch(FileNotFoundException e)
{
  System.out.println("not found!");
}
person jamesjara    schedule 07.02.2017

Основываясь на ответе @ erickson, вы можете использовать:

public String readAll(String fileName) throws IOException {
    List<String> lines = Files.readAllLines(new File(fileName).toPath());
    return String.join("\n", lines.toArray(new String[lines.size()]));
}
person Muskovets    schedule 01.04.2018

Пользователь java.nio.Files читает все строки файла.

public String readFile() throws IOException {
        File fileToRead = new File("file path");
        List<String> fileLines = Files.readAllLines(fileToRead.toPath());
        return StringUtils.join(fileLines, StringUtils.EMPTY);
}
person Nitin    schedule 26.10.2018

Я пока не могу комментировать другие записи, поэтому просто оставлю это здесь.

Один из лучших ответов здесь (https://stackoverflow.com/a/326448/1521167):

private String readFile(String pathname) throws IOException {

File file = new File(pathname);
StringBuilder fileContents = new StringBuilder((int)file.length());
Scanner scanner = new Scanner(file);
String lineSeparator = System.getProperty("line.separator");

try {
    while(scanner.hasNextLine()) {        
        fileContents.append(scanner.nextLine() + lineSeparator);
    }
    return fileContents.toString();
} finally {
    scanner.close();
}
}

есть еще один недостаток. Он всегда помещает символ новой строки в конец строки, что может вызвать некоторые странные ошибки. Я предлагаю изменить его на:

    private String readFile(String pathname) throws IOException {
    File file = new File(pathname);
    StringBuilder fileContents = new StringBuilder((int) file.length());
    Scanner scanner = new Scanner(new BufferedReader(new FileReader(file)));
    String lineSeparator = System.getProperty("line.separator");

    try {
        if (scanner.hasNextLine()) {
            fileContents.append(scanner.nextLine());
        }
        while (scanner.hasNextLine()) {
            fileContents.append(lineSeparator + scanner.nextLine());
        }
        return fileContents.toString();
    } finally {
        scanner.close();
    }
}
person Ajk    schedule 13.12.2013
comment
В первом случае вы могли бы добавить в конец дополнительный перевод строки. во втором случае вы можете пропустить один. Так что оба одинаково неправы. См. эту статью - person Patrick Parker; 28.03.2018

После нажатия Ctrl + F после Scanner, я думаю, что решение Scanner тоже должно быть указано. Проще всего это выглядит так:

public String fileToString(File file, Charset charset) {
  Scanner fileReader = new Scanner(file, charset);
  fileReader.useDelimiter("\\Z"); // \Z means EOF.
  String out = fileReader.next();
  fileReader.close();
  return out;
}

Если вы используете Java 7 или новее (а вам действительно стоит), подумайте об использовании try-with-resources, чтобы упростить чтение кода. Больше никаких беспорядков, засоряющих все вокруг. Но, думаю, это в основном стилистический выбор.

Я публикую это в основном для завершения, так как, если вам нужно делать это много, должны быть вещи в java.nio.file.Files, которые должны работать лучше.

Я предлагаю использовать Files # readAllBytes (Path), чтобы захватить все байты и передать их новому String (byte [] Charset), чтобы получить из него строку, которой можно доверять. Кодировки будут иметь значение для вас в течение всей вашей жизни, так что остерегайтесь этого сейчас.

Другие дали код и прочее, и я не хочу украсть их славу. ;)

person Haakon Løtveit    schedule 29.11.2015

При использовании этой библиотеки это одна строка:

String data = IO.from(new File("data.txt")).toString();
person satnam    schedule 10.12.2016
comment
если не учитываются строки внутри библиотеки. - person Ari; 01.08.2017

Также, если ваш файл находится внутри банки, вы также можете использовать это:

public String fromFileInJar(String path) {
    try ( Scanner scanner 
            = new Scanner(getClass().getResourceAsStream(path))) {
        return scanner.useDelimiter("\\A").next();
    }
}

Путь должен начинаться с /, например, если ваша банка

my.jar/com/some/thing/a.txt

Затем вы хотите вызвать его так:

String myTxt = fromFileInJar("/com/com/thing/a.txt");
person OscarRyz    schedule 15.02.2017

В одной строке (Java 8), если у вас есть Reader:

String sMessage = String.join("\n", reader.lines().collect(Collectors.toList()));
person Malcolm Boekhoff    schedule 15.03.2017

Используйте код:

File file = new File("input.txt");
BufferedInputStream bin = new BufferedInputStream(new FileInputStream(
                file));
byte[] buffer = new byte[(int) file.length()];
bin.read(buffer);
String fileStr = new String(buffer);

fileStr содержит вывод в виде строки.

person Devram Kandhare    schedule 16.01.2017

Вы можете прочитать содержимое файла несколькими способами. Ниже приведены несколько способов чтения содержимого файла.

  • BufferedReader
  • Сканер
  • Files.ReadBytes

Использование BufferedReader

try {
            
            File file = new File("C://temp/sample.txt");
            FileInputStream fileInputStream = new FileInputStream(file);
            InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
            
            // Converting input stream to buffer reader
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String temp = "";
            StringBuffer textFileContent = new StringBuffer();
            while ((temp = bufferedReader.readLine()) != null) {
                textFileContent.append(temp);
            }
            
            System.out.println(textFileContent);
            // In below line we are closing the bufferReader
            bufferedReader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

С помощью сканера

try {
            File file = new File("C:\\temp\\sample.txt");
            
            Scanner scanner = new Scanner(file);
            StringBuffer textFileContent = new StringBuffer();
            while (scanner.hasNextLine()) {
                textFileContent.append(scanner.nextLine());
            }
            System.out.println(textFileContent);
            scanner.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Использование File.ReadBytes

try {
            byte[] encoded = Files.readAllBytes(Paths.get("D:\\workspace\\sample.txt"));
            String s = new String(encoded, StandardCharsets.US_ASCII);
            System.out.println(s);
        } catch (Exception e) {
            e.printStackTrace();
        }

Для получения дополнительной информации см. URL-адрес ниже

https://beginnersbug.com/how-to-read-a-file-from-java-with-example/

person Rajesh Kumar    schedule 12.06.2021

в java 8 есть новый класс

java.util.stream.Stream

Поток представляет собой последовательность элементов и поддерживает различные типы операций для выполнения вычислений над этими элементами.

Подробнее об этом:

Документация Oracle

Вот пример:

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

public Class ReadFile{
  public  static String readFile(String filePath) {
 StringBuilder  stringBuilder = new StringBuilder();
    String ls = System.getProperty("line.separator");
        try {

            try (Stream<String> lines = Files.lines(Paths.get(filePath), StandardCharsets.UTF_8)) {
                for (String line : (Iterable<String>) lines::iterator) {


                      stringBuilder.append(line);
                      stringBuilder.append(ls);


                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

      return stringBuilder.toString(); 


}

}
person Community    schedule 06.12.2016

person    schedule
comment
Я думаю, что это неудобно при использовании кодировки платформы по умолчанию. +1 все равно :) - person OscarRyz; 09.02.2010
comment
Мне кажется, что блок finally не знает переменных, определенных в блоке try. javac 1.6.0_21 выдает ошибку cannot find symbol. - person ceving; 25.06.2012
comment
Вы хоть раз пробовали свой собственный код? Вы определили читателя в блоке try / catch, поэтому он не будет доступен в блоке finally. - person mauron85; 31.10.2018