자바에서 루프를 사용하지 않고 전체 파일 읽기


103

중복 가능성 :
파일 전체 텍스트 파일 의 내용에서 Java의 문자열로 Java 문자열을 만드는 방법

FileReader를 사용하여 파일의 내용을 읽으려고합니다. 하지만 한 줄씩 읽지 않고 파일을 읽고 싶습니다. 루프없이 전체 파일을 읽을 수 있습니까? 다음 코드를 사용하고 있습니다.

 try
 {
     File ff=new File("abc.txt");
     FileReader fr=new FileReader(ff);

     String s;
     while(br.read()!=-1)
     {
          s=br.readLine();
     }
 }

 catch(Exception ex)
 {
     ex.printStackTrace();
 }

이 코드는 처음부터 컴파일되지 않습니다.
Arya Pourtabatabaie

이에 대한 한 줄 Java 11 솔루션이 있습니다. stackoverflow.com/a/52301018/942774
Hendrik

답변:


129

파일이 작 으면 전체 데이터를 한 번 읽을 수 있습니다.

File file = new File("a.txt");
FileInputStream fis = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
fis.read(data);
fis.close();

String str = new String(data, "UTF-8");

4
의 InputStream의 SA 안드로이드 자산에 대한 작업 (NO 길이)하지 않습니다
akauppi

10
"작음"은 얼마나 작습니까?
실버

8
@silver 파일의 전체 내용이 메모리에 저장됩니다. 따라서 다음과 같은 5GB 파일을 읽지 마십시오. :-)
Thibaut D.

2
참고 : file.length()아래의 파일에 대해 0을 반환 할 수 있습니다 /proc. 이 경우이 코드 조각은 빈 문자열을 반환합니다.
Mygod

1
또한 read전체 버퍼를 채우지 못할 수도 있습니다. 대부분의 JRE에서 실제로 작동 할 수 있지만 API에 대한 보장은 없습니다.
Daniel Lubarov

179

Java 7 한 줄 솔루션

List<String> lines = Files.readAllLines(Paths.get("file"), StandardCharsets.UTF_8);

또는

 String text = new String(Files.readAllBytes(Paths.get("file")), StandardCharsets.UTF_8);

1
Android에서 해당 파일을 찾을 수 없습니다.
akauppi 2014-06-13

23
모든 Java 답변이 Android @akauppi에 적합 할 필요는 없습니다! 다른 답변에서 Android가 지원하는 솔루션을 찾으십시오!
Isaac Woods

String text = Files.readString(Paths.get("file"));UTF-8 문자열 출력을 원한다고 가정하면 더 짧습니다.
Eagterrian Knight

그리고 이미 File 객체가 있다면 file.toPath()내부 에서 할 수 있습니다readAllBytes
Kartik Chugh

Android에서 중요 : Call requires API level 26: java.nio.file.Files#readAllBytes- readString.
Neph

33

JDK5 이상을 사용하는 경우 스캐너 를 사용해 볼 수 있습니다 .

Scanner scan = new Scanner(file);  
scan.useDelimiter("\\Z");  
String content = scan.next(); 

또는 구아바 를 사용할 수도 있습니다.

String data = Files.toString(new File("path.txt"), Charsets.UTF8);

4
사용 후에는 스캐너를 닫아야합니다.
Barry NL

String data = Files.toString(new File("path.txt"), Charsets.UTF_8);. 작은 오타입니다. :-)
pisaruk 2015-06-12

1
이 코드 Scanner는 파일에서 처음 1024 바이트 만 읽습니다. 소스 코드를보십시오. 버퍼를 읽고이 정규 표현식으로 확인합니다. 이것은 항상 유효합니다. 그러면 모든 버퍼 내용을 반환합니다. 기본적으로 버퍼의 크기는 1024 바이트입니다.
Enyby

2
이것은 나쁜 접근법입니다. 올바른 솔루션 (Java 1.7 이상)은 Files.readAllLines(). 레거시 JRE의 경우 FileInputStream.read()아마도 가장 좋습니다. 이 모든 플랫폼에 이식 있는지 잘 모르겠어요 (즉 FET의-Z는 사방 인식), 그리고 '는 일을 놓치기 쉽다 Scanner.close().
paulsm4

33

Java 5/6을 사용하는 경우 파일을 문자열로 읽기 위해 Apache Commons IO 를 사용할 수 있습니다 . 이 클래스 org.apache.commons.io.FileUtils는 파일 읽기를위한 여러 방법을 포함합니다.

FileUtils#readFileToString: 방법 사용 :

File file = new File("abc.txt");
String content = FileUtils.readFileToString(file);

1
이것은 아마도 타사 라이브러리를 사용하는 가장 쉬운 솔루션 일 것입니다.
실버

3
작성할 최소한의 코드; 프로젝트에 추가 할 더 많은 라이브러리.
Please_Dont_Bully_Me_SO_Lords

2
유형 Fileutils의에서 메소드 readFileToString (파일)은 지원되지 않습니다
JavaSheriff

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.