读取完整文件而不在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();
 }

这段代码不会从一开始就编译。
艾莉亚·波塔巴塔巴伊

有一个针对此的单行Java 11解决方案:stackoverflow.com/a/52301018/942774
Hendrik,

Answers:


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安卓资产(无长度)
akauppi 2014年

10
“小”有多小?
银色

8
@silver文件的全部内容将存储在内存中。因此,避免读取这样的5GB文件:-)
Thibaut D.

2
注意:file.length()下的文件可能返回0 /proc。在这种情况下,此代码段将返回一个空字符串。
Mygod '16

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年

23
并非所有Java答案都必须适合Android @akauppi!只需从另一个答案中寻找Android支持的解决方案即可!
艾萨克·伍兹

String text = Files.readString(Paths.get("file"));假设您要使用UTF-8字符串输出,则长度甚至更短。
Eagterrian Knight '18

并且,如果您已经有了File对象,则可以在file.toPath()内部进行操作readAllBytes
Kartik Chugh,

对于Android重要:Call requires API level 26: java.nio.file.Files#readAllBytes-相同readString
Neph

33

如果您使用的是JDK5或更高版本,则可以尝试使用Scanner

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

或者您也可以使用番石榴

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

4
请注意,使用后应关闭扫描仪。
巴里NL 2015年

String data = Files.toString(new File("path.txt"), Charsets.UTF_8);。只是一个小错字。:-)
pisaruk

1
此代码Scanner仅从文件读取前1024个字节。查看源代码。它读取缓冲区并使用此正则表达式对其进行检查。这始终有效-然后它将返回所有缓冲区内容。默认情况下,缓冲区的大小为1024字节。
Enyby'3

2
这是错误的方法。正确的解决方案(适用于Java 1.7及更高版本)是Files.readAllLines()。对于旧式JRE,FileInputStream.read()可能是最好的。我不确定它是否可以移植到所有平台(即Ctl-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 '17

2
不建议使用
FileUtils

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.