Весь текстовый файл для строки в 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;