파일을 문자열로 읽는 가장 간단한 방법은?
나는 간단한 텍스트 파일을 스트링으로 읽으려고 한다.물론 입력 스트림을 가져와 readLine()으로 반복하고 내용을 String으로 읽는 일반적인 방법이 있다.
과거에 수백 번을 했으니, 어떻게 최소한의 코드 선으로 이것을 할 수 있을까 하는 생각했을 뿐이다.자바에는 이런 것이 있지 않은가?String fileContents = XXX.readFile(myFile/*File*/)
이것처럼 단순해 보이는 것은?
Apache Commons IO와 같은 라이브러리가 있어 이러한 간소화를 제공하거나 심지어 내가 이를 위해 간단한 Util 클래스를 작성할 수 있다는 것을 안다.하지만 내가 궁금한 것은 - 이것은 모든 사람들이 필요로 하는 매우 빈번한 작업인데 왜 자바는 그렇게 간단한 기능을 제공하지 않는가?파일을 어떤 기본 또는 지정된 인코딩으로 문자열로 읽을 수 있는 방법이 정말 한 가지 있지 않은가?
그래, 한 줄로 할 수 있다(강력한 경우는 그렇다).IOException
당신이 원하지 않는 것을 다루는 것.
String content = new Scanner(new File("filename")).useDelimiter("\\Z").next();
System.out.println(content);
이 경우 , 를 사용하여 입력을 다음으로 구분\Z
인 닻의 끝인 닻의 이다이는 궁극적으로 입력에 전체 파일인 하나의 실제 토큰이 포함되도록 하기 때문에 한 번의 통화로 읽을 수 있다.next()
.
A를 필요로 하는 시공자가 있다.File
그리고 aString charSetName
(다른 많은 과부하.이 두 시공자는 던질 수 있다.FileNotFoundException
, 그러나 모든것과 마찬가지로.Scanner
방법, 아니오IOException
이 시공자들 너머에 던져질 수 있다.
다음 항목을 쿼리할 수 있음Scanner
만약 ...이 있다면 그 방법을 통해서 그 자체로.IOException
발생했든 없었든.또한 명시적으로 다음 작업을 수행하려는 경우Scanner
당신이 내용을 읽은 후에, 그래서 아마도 저장하기 위해Scanner
로컬 변수의 참조가 가장 좋다.
참고 항목
관련 질문
- Java.util을 사용하여 입력을 확인하는 중.스캐너 - 보다 일반적인 용도의 많은 예
타사 라이브러리 옵션
완전성을 위해 다음과 같이 매우 유명하고 매우 유용한 제3자 라이브러리를 가지고 있는 경우, 이러한 옵션은 정말 좋은 옵션들이다.
구아바
com.google.common.io.Files
많은 유용한 방법들을 포함하고 있다.여기에 해당하는 것은 다음과 같다.
String toString(File, Charset)
- 지정된 문자 집합을 사용하여 파일의 모든 문자를
String
- 지정된 문자 집합을 사용하여 파일의 모든 문자를
List<String> readLines(File, Charset)
- 을 ...로.파일에서 a로 모든 행을 읽는다.
List<String>
, 한 줄에 한 항목씩
- 을 ...로.파일에서 a로 모든 행을 읽는다.
Apache Commons/IO
org.apache.commons.io.IOUtils
또한 유사한 기능을 제공한다.
String toString(InputStream, String encoding)
- 하여 지만 문자 메시지
InputStream
로서String
- 하여 지만 문자 메시지
List readLines(InputStream, String encoding)
- …로서 (원래)
List
의String
, 한 줄에 한 항목씩
- …로서 (원래)
관련 질문
Java 7(API Description) 이후로는 다음을 수행할 수 있다.
new String(Files.readAllBytes(Paths.get(filePath)), StandardCharsets.UTF_8);
여기서 filePath는 로드할 파일을 나타내는 문자열이다.
Apache commons 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")));
}
import org.apache.commons.io.FileUtils;
//...
String contents = FileUtils.readFileToString(new File("/path/to/the/file"), "UTF-8")
자세한 내용은 de javadoc을 참조하십시오.
이것을 하기 위해 너만의 활용 수업을 쓰지 마라 - 나는 모든 종류의 선함이 가득한 구아바를 사용하는 것을 추천하고 싶다.이 경우에는 클래스를 원하거나(정말로 파일을 읽고 있다면) CharStreams를 좀 더 일반적인 목적으로 읽기를 원할 것이다.데이터를 문자열 목록으로 읽어들이는 방법이 있다.readLines
) 또는 완전히 (toString
).
이항 데이터에도 비슷한 유용한 방법이 있다.그리고 나머지 도서관은...
나는 표준 도서관에서 비슷한 것이 없다는 것이 짜증난다는 것에 동의한다.헥, 그냥 공급할 수 있는 건CharSet
완전히FileReader
삶을 좀 더 단순하게 만들 수 있을 거야
또 다른 대안적 접근법은 다음과 같다.
다른 옵션은 오픈 소스 라이브러리가 제공하는 유틸리티를 사용하는 것이다.
http://http:///commons.apache.org/io/api-1.4/index.html?org/apache/commons/io/IOUtils.html
Java는 왜 그렇게 공통적인 API를 제공하지 않는가?
a) 인코딩, 버퍼링 등이 프로그래머에 의해 처리되도록 API를 일반화한다.
b) 프로그래머가 일부 작업을 하게 하고 오픈소스 활용 라이브러리를 쓰기/공유하게 한다 :D ;-)
슬프게도, 아니야.
나는 그렇게 빈번한 운영이 루프에서 라인별로 입력선을 복사하는 것보다 더 쉽게 구현되어야 한다는 것에 동의하지만, 당신은 도우미 방법을 쓰거나 외부 라이브러리를 사용해야 할 것이다.
나는 인정된 대답이 사실 항상 효과가 있는 것은 아니라는 것을 발견했다.\\Z
파일에서 발생할 수 있음.또 다른 문제는 만약 당신이 올바른 문자 집합을 가지고 있지 않다면, 예상치 못한 많은 일들이 일어나 스캐너가 파일의 일부분만 읽게 할 수 있다는 것이다.
해결책은 파일에서 절대 발생하지 않을 것으로 확신하는 구분 기호를 사용하는 것이다.그러나 이는 이론적으로 불가능하다.우리가 할 수 있는 것은 파일에서 일어날 가능성이 매우 작아서 무시할 수 있는 구분 기호를 사용하는 것인데, 그러한 구분 기호는 자바에서 기본적으로 지원되는 UUID이다.
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
'programing' 카테고리의 다른 글
일반 자바에서 HTML 기호를 이스케이프하는 방법은? (0) | 2022.05.22 |
---|---|
왜 argc가 'int'('부호화되지 않은 int'가 아닌) (0) | 2022.05.22 |
Eclipse 디버거는 어떤 명백한 예외 없이 항상 ThreadPoolExecutor를 차단하며, 그 이유는? (0) | 2022.05.22 |
@click in select options - Vue.js 2 (0) | 2022.05.22 |
Nuxt.js 구성 요소 내에서 어떤 레이아웃이 사용되고 있는지 확인하는 방법 (0) | 2022.05.22 |