Programing

문자열로 파일을 읽는 가장 간단한 방법은 무엇입니까?

lottogame 2020. 4. 3. 08:10
반응형

문자열로 파일을 읽는 가장 간단한 방법은 무엇입니까? [복제]


이 질문에는 이미 답변이 있습니다.

간단한 텍스트 파일을 문자열로 읽으려고합니다. 물론 입력 스트림을 가져 와서 readLine ()으로 반복하고 내용을 String으로 읽는 일반적인 방법이 있습니다.

과거에 수백 번이 작업을 수행 한 후 최소 코드 줄에서 어떻게 할 수 있을지 궁금했습니다. 자바에 String fileContents = XXX.readFile(myFile/*File*/).. 같은 것이 없습니까? 오히려 이것처럼 간단하게 보이는 것이 있습니까?

그러한 단순화를 제공하는 Apache Commons IO와 같은 라이브러리가 있거나 간단한 Util 클래스를 작성하여이를 수행 할 수 있다는 것을 알고 있습니다. 그러나 내가 궁금한 것은 모든 사람들이 필요로하는 빈번한 작업이므로 Java가 왜 그렇게 간단한 기능을 제공하지 않습니까? 기본 또는 지정된 인코딩으로 파일을 문자열로 읽는 단일 방법이 실제로 있습니까?


예, 한 줄로이 작업을 수행 할 수 있습니다 (강력한 IOException처리를 원치 않는 경우 에도 ).

String content = new Scanner(new File("filename")).useDelimiter("\\Z").next();
System.out.println(content);

이것은을 사용 java.util.Scanner하여 입력 구분하는 그것을 말하고, \Z문자열 앵커의 끝입니다. 결과적으로 입력에 전체 토큰 인 하나의 실제 토큰이 있으므로를 한 번의 호출로 읽을 수 있습니다 next().

생성자 소요 File하고을 String charSetName(다른 많은 과부하 사이가). 이 두 생성자는 throw 할 수 FileNotFoundException있지만 다른 모든 Scanner메소드 와 마찬가지로 IOException이러한 생성자를 넘어서는 던져 질 수 없습니다 .

발생 여부에 관계 Scanner없이 ioException()메소드를 통해 자체를 쿼리 할 수 ​​있습니다 IOException. 또한 명시 적으로 할 수 있습니다 그렇게 아마 저장 내용을 읽을 후 지역 변수에 대한 참조를 가장 좋습니다.close()ScannerScanner

또한보십시오

관련 질문


타사 라이브러리 옵션

완성도를 높이기 위해 매우 유명하고 유용한 타사 라이브러리가있는 경우 다음과 같은 옵션이 있습니다.

구아바

com.google.common.io.Files많은 유용한 방법이 포함되어 있습니다. 여기에 적절한 것들이 있습니다 :

Apache Commons / IO

org.apache.commons.io.IOUtils 비슷한 기능도 제공합니다.

  • String toString(InputStream, String encoding)
    • 지정된 문자 인코딩을 사용하여,의 내용을 얻는다 InputStreamA와String
  • List readLines(InputStream, String encoding)
    • ... (원시) ListString한 줄에 한 항목

관련 질문


Java 7 (API 설명) 부터 다음을 수행 할 수 있습니다.

new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);

여기서 filePath는로드하려는 파일을 나타내는 문자열입니다.


아파치 커먼즈 IO를 사용할 수 있습니다.

FileInputStream fisTargetFile = new FileInputStream(new File("test.txt"));

String targetFileStr = IOUtils.toString(fisTargetFile, "UTF-8");

이것은 당신을 위해 작동합니다 :

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

public static void main(String[] args) throws IOException {
    String content = new String(Files.readAllBytes(Paths.get("abc.java")));
}

사용 아파치 코 몬즈 IO를 .

import org.apache.commons.io.FileUtils;

//...

String contents = FileUtils.readFileToString(new File("/path/to/the/file"), "UTF-8")

자세한 내용 은 javadoc을 참조 하십시오.


이를 위해 util 클래스를 작성하지 마십시오 . 모든 종류의 장점으로 가득한 Guava를 사용하는 것이 좋습니다 . 이 경우 Files클래스 (실제로 파일을 읽는 경우) 또는 더 일반적인 용도의 독서를 위해 CharStream원할 것 입니다. 데이터를 문자열 목록 ( readLines) 또는 전체 ( toString) 로 읽는 방법이 있습니다 .

이진 데이터에도 비슷한 유용한 방법이 있습니다. 그리고 나머지 도서관이 있습니다.

표준 라이브러리에는 비슷한 것이 없다는 것이 귀찮습니다. 빌어 먹을, 단지 제공 할 수있는 CharSetA와는 FileReader인생은 만들 것 간단 ...


다른 대안은 다음과 같습니다.

파일 내용에서 Java 문자열을 작성하는 방법

다른 옵션은 오픈 소스 라이브러리가 제공하는 유틸리티를 사용하는 것입니다
http://commons.apache.org/io/api-1.4/index.html?org/apache/commons/io/IOUtils.html

java가 왜 일반적인 util API를 제공하지 않습니까?
a) 프로그래머가 인코딩, 버퍼링 등을 처리 할 수 ​​있도록 API를 일반으로 유지합니다.
b) 프로그래머가 일을하고 오픈 소스 유틸리티 라이브러리를 작성 / 공유하도록한다 : D ;-)


안타깝게도

이러한 빈번한 작업은 루프 단위로 입력을 복사하는 것보다 구현이 더 쉬워야한다는 데 동의하지만 도우미 메서드를 작성하거나 외부 라이브러리를 사용해야합니다.


수락 된 답변이 실제로 작동하지는 않는다는 것을 발견했습니다 \\Z. 파일에서 발생할 수 있기 때문 입니다. 또 다른 문제는 올바른 문자 집합이 없으면 예기치 않은 일이 발생하여 스캐너가 파일의 일부만 읽을 수 있다는 것입니다.

해결책은 파일에서 절대 발생하지 않는 구분 기호를 사용하는 것입니다. 그러나 이것은 이론적으로 불가능합니다. 우리가 할 수있는 일은 파일에서 무시할 수있는 작은 기회를 가진 구분 기호를 사용하는 것입니다.이 구분 기호는 UUID 이며 기본적으로 Java에서 지원됩니다.

String content = new Scanner(file, "UTF-8")
    .useDelimiter(UUID.randomUUID().toString()).next();

참고 URL : https://stackoverflow.com/questions/3402735/what-is-simplest-way-to-read-a-file-into-string

반응형