Весь текстовый файл для строки в Java

Имеется ли в Java одна строка для чтения в текстовый файл, например, что у С#?

Я имею в виду, есть ли что-то эквивалентное этому в Java?:

String data = System.IO.File.ReadAllText("path to file");

Если нет... что такое "оптимальный способ"...?

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

Ответ 1

Java 11 добавляет поддержку этого варианта использования с помощью Files.readString, пример кода:

Files.readString(Path.of("/your/directory/path/file.txt"));

До Java 11 типичный подход со стандартными библиотеками был бы примерно таким:

public static String readStream(InputStream is) {
    StringBuilder sb = new StringBuilder(512);
    try {
        Reader r = new InputStreamReader(is, "UTF-8");
        int c = 0;
        while ((c = r.read()) != -1) {
            sb.append((char) c);
        }
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
    return sb.toString();
}

Заметки:

  • чтобы читать текст из файла, используйте FileInputStream
  • если важна производительность и вы читаете большие файлы, было бы желательно обернуть поток в BufferedInputStream
  • поток должен быть закрыт вызывающим

Ответ 2

apache commons-io имеет:

String str = FileUtils.readFileToString(file, "utf-8");

Но в стандартных классах Java нет такой утилиты. Если вам (по какой-то причине) не нужны внешние библиотеки, вам придется переопределить его. Вот несколько примеров, а также вы можете увидеть, как это реализовано commons-io или Guava.

Ответ 3

Не в основных библиотеках Java, но вы можете использовать Guava:

String data = Files.asCharSource(new File("path.txt"), Charsets.UTF_8).read();

Или читать строки:

List<String> lines = Files.readLines( new File("path.txt"), Charsets.UTF_8 );

Конечно, я уверен, что есть другие сторонние библиотеки, которые могли бы сделать это так же легко - я просто наиболее знаком с Guava.

Ответ 4

Java 7 улучшает эту жалкую ситуацию с помощью класса Files (не путать с классом Guava с тем же именем), вы можете получить все строки из файла - без внешних библиотек - с помощью:

List<String> fileLines = Files.readAllLines(path, StandardCharsets.UTF_8);

Или в одну строку:

String contents = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
// or equivalently:
StandardCharsets.UTF_8.decode(ByteBuffer.wrap(Files.readAllBytes(path)));

Если вам нужно что-то из коробки с чистым JDK, это отлично работает. Тем не менее, почему вы пишете Java без Guava?

Ответ 5

В Java 8 (без внешних библиотек) вы можете использовать потоки. Этот код читает файл и помещает все строки, разделенные символом ',' в строку.

try (Stream<String> lines = Files.lines(myPath)) {
    list = lines.collect(Collectors.joining(", "));
} catch (IOException e) {
    LOGGER.error("Failed to load file.", e);
}

Ответ 6

С JDK/11 вы можете прочитать весь файл в Path как строку, используя Files.readString(Path path):

try {
    String fileContent = Files.readString(Path.of("/foo/bar/gus"));
} catch (IOException e) {
    // handle exception in i/o
}

документация по методу из JDK гласит:

/**
 * Reads all content from a file into a string, decoding from bytes to characters
 * using the {@link StandardCharsets#UTF_8 UTF-8} {@link Charset charset}.
 * The method ensures that the file is closed when all content have been read
 * or an I/O error, or other runtime exception, is thrown.
 *
 * <p> This method is equivalent to:
 * {@code readString(path, StandardCharsets.UTF_8) }
 *
 * @param   path the path to the file
 *
 * @return  a String containing the content read from the file
 *
 * @throws  IOException
 *          if an I/O error occurs reading from the file or a malformed or
 *          unmappable byte sequence is read
 * @throws  OutOfMemoryError
 *          if the file is extremely large, for example larger than {@code 2GB}
 * @throws  SecurityException
 *          In the case of the default provider, and a security manager is
 *          installed, the {@link SecurityManager#checkRead(String) checkRead}
 *          method is invoked to check read access to the file.
 *
 * @since 11
 */
public static String readString(Path path) throws IOException 

Ответ 7

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

Path path = FileSystems.getDefault().getPath(directory, filename);
String fileContent = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);

Ответ 8

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

  String fileContent="";
  try {
          File f = new File("path2file");
          byte[] bf = new byte[(int)f.length()];
          new FileInputStream(f).read(bf);
          fileContent = new String(bf, "UTF-8");
      } catch (FileNotFoundException e) {
          // handle file not found exception
      } catch (IOException e) {
          // handle IO-exception
      }

Ответ 9

Вот 3 способа прочитать текстовый файл в одну строку, не требуя цикла. Я задокументировал 15 способов чтения из файла на Java, и это из этой статьи.

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

1) java.nio.file.Files.readAllLines() - кодировка по умолчанию

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.List;

public class ReadFile_Files_ReadAllLines {
  public static void main(String [] pArgs) throws IOException {
    String fileName = "c:\\temp\\sample-10KB.txt";
    File file = new File(fileName);

    List  fileLinesList = Files.readAllLines(file.toPath());

    for(String line : fileLinesList) {
      System.out.println(line);
    }
  }
}

2) java.nio.file.Files.readAllLines() - Явная кодировка

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.List;

public class ReadFile_Files_ReadAllLines_Encoding {
  public static void main(String [] pArgs) throws IOException {
    String fileName = "c:\\temp\\sample-10KB.txt";
    File file = new File(fileName);

    //use UTF-8 encoding
    List  fileLinesList = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);

    for(String line : fileLinesList) {
      System.out.println(line);
    }
  }
}

3) java.nio.file.Files.readAllBytes()

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

public class ReadFile_Files_ReadAllBytes {
  public static void main(String [] pArgs) throws IOException {
    String fileName = "c:\\temp\\sample-10KB.txt";
    File file = new File(fileName);

    byte [] fileBytes = Files.readAllBytes(file.toPath());
    char singleChar;
    for(byte b : fileBytes) {
      singleChar = (char) b;
      System.out.print(singleChar);
    }
  }
}

Ответ 10

Не совсем один вкладыш и, вероятно, устарел, если использовать JDK 11, опубликованный nullpointer. По-прежнему полезно, если у вас есть не входной поток файлов

InputStream inStream = context.getAssets().open(filename);
Scanner s = new Scanner(inStream).useDelimiter("\\A");
String string = s.hasNext() ? s.next() : "";
inStream.close();
return string;