Javaでループを使用せずに完全なファイルを読み取る


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

これには1行の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 Androidアセット(長さなし)では機能しません
akauppi

10
「小さい」はどのくらい小さいですか?
シルバー

8
@silverファイルの内容全体がメモリに保存されます。したがって、次のような5GBファイルの読み取りは避けてください:-)
Thibaut D.

2
注:のfile.length()下のファイルに対して0を返す場合があります/proc。これらの場合、このスニペットは空の文字列を返します。
Mygod

1
またread、バッファ全体がいっぱいになることはありません。ほとんどのJREで実際に機能する可能性がありますが、APIの保証はありません。
ダニエル・ルバロフ2017年

179

Java 7 1行ソリューション

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 14年

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
ネフ

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

1
Scannerファイルから最初の1024バイトのみを読み取るこのコード。ソースコードを見てください。バッファを読み込んで、この正規表現でチェックします。これは常に有効です-その後、すべてのバッファの内容を返します。デフォルトでは、バッファのサイズは1024バイトです。
Enyby 2017年

2
これは悪いアプローチです。正しい解決策(Java 1.7以降の場合)はFiles.readAllLines()です。レガシーJREの場合、FileInputStream.read()おそらく最適です。すべてのプラットフォームに移植可能かどうか(つまり、Ctl-Zがどこでも認識されるかどうか)はわかりませんScanner.close()
paulsm4 2017年

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
これはおそらく、サードパーティのlibを使用する最も簡単なソリューションです。

3
記述する最小限のコード。プロジェクトに追加する多くのライブラリ。
Please_Dont_Bully_Me_SO_Lords 2017年

2
型のfileutilsから(ファイル)readFileToString方法は推奨されている
JavaSheriff

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.