如何从文件内容创建Java字符串?

1760

我已经使用下面的习语有一段时间了。至少在我访问的网站上,它似乎是最为广泛使用的。

在Java中读取文件到字符串的方式是否存在更好/不同的方法?

private String readFile(String file) throws IOException {
    BufferedReader reader = new BufferedReader(new FileReader (file));
    String         line = null;
    StringBuilder  stringBuilder = new StringBuilder();
    String         ls = System.getProperty("line.separator");

    try {
        while((line = reader.readLine()) != null) {
            stringBuilder.append(line);
            stringBuilder.append(ls);
        }

        return stringBuilder.toString();
    } finally {
        reader.close();
    }
}

8
有人能用非常简单易懂的语言解释一下NIO是什么吗?每次我阅读相关内容时,总是迷失在对通道的第N次提及中。 - OscarRyz
8
请记住,文件中的行分隔符未必与系统的行分隔符相同,并且需要进行调整。 - Henrik Paul
7
上述代码存在一个bug,在最后一行会多添加一个换行符。应该像下面这样修改:如果(line = reader.readLine())!= null { stringBuilder.append(line); } while((line = reader.readLine())!= null){ stringBuilder.append(ls); stringBuilder.append(line); } - Deep
31
Java 7 引进了 byte[] Files.readAllBytes(file); 方法。对于那些建议使用“一行代码” Scanner 解决方案的人:你不需要关闭它吗? - Val
@OscarRyz 对我来说最大的变化是NIO允许你监听许多端口而不为每个端口分配一个线程。这不是问题,除非你想向类B网络地址空间中的每台机器发送一个数据包(65k个地址)以查看存在的内容,Windows在大约20k时就会用完线程(在解决这个问题之前发现了这个问题——发现A/B网络,没有NIO很困难)。 - Bill K
显示剩余9条评论
35个回答

1

如之前评论中提到的那样使用BufferedReader,但这种方式更易读:

String FILE_PATH = "filepath.txt";

try (FileReader fileReader = new FileReader(FILE_PATH)) {
    BufferedReader fileBufferReader = new BufferedReader(fileReader);
    String text = fileBufferReader.lines()
        .collect(Collectors.joining(System.lineSeparator()));
    System.out.println(text);
} catch (IOException e) {
    // exception handling
}


1

Use code:

File file = new File("input.txt");
BufferedInputStream bin = new BufferedInputStream(new FileInputStream(
                file));
byte[] buffer = new byte[(int) file.length()];
bin.read(buffer);
String fileStr = new String(buffer);

fileStr 包含字符串输出。


0
Scanner sc = new Scanner(new File("yourFile.txt"));
sc.useDelimiter("\\Z");

String s = sc.next();

-1

纯 Kotlin 代码,无依赖项

适用于所有 Android 版本

val fileAsString = file.bufferedReader().use { it.readText() }

-2
在Java 8中,有一个新的类。

java.util.stream.Stream

流(Stream)代表一系列元素,并支持不同类型的操作来对这些元素执行计算。

了解更多信息:

Oracle文档

以下是一个示例:

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

public Class ReadFile{
  public  static String readFile(String filePath) {
 StringBuilder  stringBuilder = new StringBuilder();
    String ls = System.getProperty("line.separator");
        try {

            try (Stream<String> lines = Files.lines(Paths.get(filePath), StandardCharsets.UTF_8)) {
                for (String line : (Iterable<String>) lines::iterator) {


                      stringBuilder.append(line);
                      stringBuilder.append(ls);


                }
            }

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

      return stringBuilder.toString(); 


}

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接