在java中不使用循环读取完整文件

Ade*_*ngh 95 java io file

可能重复:
如何从文件内容创建Java String
整个文本文件到Java中的String

我试图使用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();
 }
Run Code Online (Sandbox Code Playgroud)

Evg*_*eev 168

Java 7一线解决方案

List<String> lines = Files.readAllLines(Paths.get("file"), StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)

要么

 String text = new String(Files.readAllBytes(Paths.get("file")), StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)

  • 并非所有Java答案都必须适合Android,@ akauppi!只需从另一个答案中寻找Android支持的解决方案! (21认同)

imx*_*ylz 118

如果文件很小,您可以读取整个数据一次:

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");
Run Code Online (Sandbox Code Playgroud)

  • "小"有多小? (8认同)
  • @silver文件的全部内容将存储在内存中.所以,避免阅读像这样的5GB文件:-) (7认同)
  • 不适用于InputStream的sa资产(无长度) (4认同)
  • 注意:`file.length()` 可能会为 `/proc` 下的文件返回 0。在这些情况下,此代码段将返回一个空字符串。 (2认同)
  • 此外,`read` 可能不会填满整个缓冲区。它可能适用于大多数 JRE,但在 API 中没有保证。 (2认同)

Pau*_*gas 32

如果您使用的是Java 5/6,则可以使用Apache Commons IO将读取文件转换为字符串.该类包含org.apache.commons.io.FileUtils几种读取文件的方法.

例如使用方法FileUtils#readFileToString:

File file = new File("abc.txt");
String content = FileUtils.readFileToString(file);
Run Code Online (Sandbox Code Playgroud)

  • 写的最小代码; 要添加到项目中的更多库. (3认同)
  • 不建议使用FileUtils类型的readFileToString(File)方法 (2认同)

Jay*_*han 29

如果您使用的是JDK5或更高版本,则可以尝试使用扫描仪.

Scanner scan = new Scanner(file);  
scan.useDelimiter("\\Z");  
String content = scan.next(); 
Run Code Online (Sandbox Code Playgroud)

或者你也可以使用番石榴

String data = Files.toString(new File("path.txt"), Charsets.UTF8);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,扫描仪应在使用后关闭. (4认同)
  • 这是错误的方法。正确的解决方案(对于Java 1.7及更高版本)是`Files.readAllLines()`。对于旧式JRE,最好使用FileInputStream.read()。我不确定它是否可以移植到所有平台(即Ctl-Z在任何地方都可以识别),并且很容易错过执行`Scanner.close()`。 (2认同)

Ear*_*ind 11

从 Java 11 开始,您可以更简单地做到这一点:

import java.nio.file.Files;

Files.readString(Path path);
Files.readString?(Path path, Charset cs)
Run Code Online (Sandbox Code Playgroud)

来源:https : //docs.oracle.com/en/java/javase/11/docs/api/java.base/java/nio/file/Files.html#readString(java.nio.file.Path)