전체 텍스트 파일을 Java의 문자열로
Java에는 C #과 같이 텍스트 파일을 읽는 한 줄 명령이 있습니까?
내 말은, Java에서 이것과 동등한 것이 있습니까? :
String data = System.IO.File.ReadAllText("path to file");
그렇지 않다면 ...이를 수행하는 '최적의 방법'은 무엇입니까 ...?
편집 :
Java 표준 라이브러리 내 방식을 선호합니다 ... 타사 라이브러리를 사용할 수 없습니다 ..
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();
}
메모:
- file 에서 텍스트 를 읽으 려면 FileInputStream을 사용하십시오.
- 성능이 중요 하고 큰 파일을 읽는 경우 스트림을 BufferedInputStream으로 래핑하는 것이 좋습니다.
- 호출자가 스트림을 닫아야합니다.
apache commons-io 에는 다음이 있습니다.
String str = FileUtils.readFileToString(file, "utf-8");
그러나 표준 자바 클래스에는 그러한 유틸리티가 없습니다. (어떤 이유로) 외부 라이브러리를 원하지 않는 경우이를 다시 구현해야합니다. 다음 은 몇 가지 예입니다. 또는 commons-io 또는 Guava에서 어떻게 구현되는지 확인할 수 있습니다.
기본 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에 가장 익숙합니다.
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로 즉시 사용할 수있는 것이 필요한 경우 이것은 훌륭하게 작동합니다. 즉, Guava없이 Java를 작성하는 이유는 무엇입니까?
에서 자바 8 (외부 라이브러리) 당신은 스트림을 사용할 수 있습니다. 이 코드는 파일을 읽고 ','로 구분 된 모든 줄을 문자열에 넣습니다.
try (Stream<String> lines = Files.lines(myPath)) {
list = lines.collect(Collectors.joining(", "));
} catch (IOException e) {
LOGGER.error("Failed to load file.", e);
}
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
외부 라이브러리가 필요하지 않습니다. 파일의 내용은 문자열로 변환되기 전에 버퍼링됩니다.
Path path = FileSystems.getDefault().getPath(directory, filename);
String fileContent = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);
다음은 루프없이 텍스트 파일을 한 줄로 읽는 3 가지 방법입니다. 나는 자바로 파일을 읽는 15 가지 방법을 문서화 했고 이것들은 그 기사에서 나온 것이다.
Note that you still have to loop through the list that's returned, even though the actual call to read the contents of the file requires just 1 line, without looping.
1) java.nio.file.Files.readAllLines() - Default Encoding
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() - Explicit Encoding
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);
}
}
}
No external libraries needed. The content of the file will be buffered before converting to string.
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
}
Not quite a one liner and probably obsolete if using JDK 11 as posted by nullpointer. Still usefull if you have a non file input stream
InputStream inStream = context.getAssets().open(filename);
Scanner s = new Scanner(inStream).useDelimiter("\\A");
String string = s.hasNext() ? s.next() : "";
inStream.close();
return string;
ReferenceURL : https://stackoverflow.com/questions/3849692/whole-text-file-to-a-string-in-java
'programing tip' 카테고리의 다른 글
iPhone에서 NSTimeInterval을 연도, 월, 일,시, 분 및 초로 나누려면 어떻게합니까? (0) | 2021.01.06 |
---|---|
UIScrollView에서 contentOffset은 무엇을합니까? (0) | 2021.01.06 |
IntelliJ IDEA에 사용하지 않은 것으로 식별하지 말아야 할 방법 알리기 (0) | 2021.01.06 |
CMake를 통해 Visual Studio 솔루션의 시작 프로젝트를 변경하려면 어떻게하나요? (0) | 2021.01.06 |
Jenkins 기본보기 변경 (0) | 2021.01.06 |