Как мне создать строку 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 ]

3 голосов
/ 08 февраля 2010
public static String slurp (final File file)
throws IOException {
    StringBuilder result = new StringBuilder();

    BufferedReader reader = new BufferedReader(new FileReader(file));

    try {
        char[] buf = new char[1024];

        int r = 0;

        while ((r = reader.read(buf)) != -1) {
            result.append(buf, 0, r);
        }
    }
    finally {
        reader.close();
    }

    return result.toString();
}
3 голосов
/ 23 октября 2011

В этом методе используется 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
        }
    }
}
3 голосов
/ 26 октября 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);
}
3 голосов
/ 07 февраля 2017

Вы можете попробовать сканер и файл класса, решение в несколько строк

 try
{
  String content = new Scanner(new File("file.txt")).useDelimiter("\\Z").next();
  System.out.println(content);
}
catch(FileNotFoundException e)
{
  System.out.println("not found!");
}
2 голосов
/ 29 ноября 2015

После Ctrl + F'ing после 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 должны быть вещи, которые должны лучше выполнять эту работу.

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

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

2 голосов
/ 10 декабря 2016

Используя эту библиотеку , это одна строка:

String data = IO.from(new File("data.txt")).toString();
2 голосов
/ 01 апреля 2018

На основании ответа @ 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()]));
}
2 голосов
/ 15 марта 2017

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

String sMessage = String.join("\n", reader.lines().collect(Collectors.toList()));
2 голосов
/ 16 февраля 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");
1 голос
/ 13 декабря 2013

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

Один из лучших ответов здесь (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();
    }
}
...