主页 > 开发文档

Java从文本文件中读取数据的六种方法详解

更新: 2024-12-26 00:59:38   人气:8257
在Java编程语言中,处理和操作外部资源是常见且重要的任务之一。其中一种常见的场景就是从文本文件中读取数据,并将其转换为可进行进一步计算或分析的数据结构。以下是 Java 中实现这一目标所采用的六种主要策略:

1. **使用BufferedReader类**

`java.io.BufferedReader` 类提供了高效的字符流缓冲区机制来帮助我们逐行地读取大容量文本文件。

java

try (FileReader fr = new FileReader("input.txt");
BufferedReader br = new BufferedReader(fr)) {
String line;
while ((line = br.readLine()) != null) {
// 对每一行执行所需的操作
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}


2. **利用Scanner类**

Java中的`java.util.Scanner`不仅能够解析基本类型值(如int、double等),还能用于扫描字符串以及来自各种来源包括TextFiles的内容。

java

try (Scanner scanner = new Scanner(new File("input.txt"))) {
while (scanner.hasNextLine()) {
String data = scanner.nextLine();
// 处理每行内容
System.out.println(data);
}
}catch (FileNotFoundException fe){
fe.printStackTrace();
}


3. **运用InputStreamReader与ByteArrayOutputStream结合**

当需要以字节的方式而不是字符方式访问时,可以借助于`InputStreamReader`, 并配合 ByteArrayOutputStream 进行二进制到字符编码的转化。

java

try (InputStream is = Files.newInputStream(Paths.get("input.txt"));
InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
StringWriter sw = new StringWriter();) {

char[] buffer = new char[1024];
int n;

while (-1!=(n=isr.read(buffer))) {
sw.write(buffer, 0, n);
}

String content = sw.toString();

// 使用获取的文字内容
System.out.println(content);

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



4. **通过Apache Commons IO库**

第三方工具包 Apache Commons-IO 提供了便捷的方法简化输入输出操作,例如其提供的`org.apache.commons.io.FileUtils.readFileToString()` 方法可以直接将整个文本文件加载至一个String对象内:

java

import org.apache.commons.io.FileUtils;

try{
String fileContent = FileUtils.readFileToString(new File("input.txt"), "UTF-8");
System.out.println(fileContent);
}catch(IOException ioe){
ioe.printStackTrace();
}


5. **NIO Channel 和 ByteBuffer 的路径通道**

自JDK 7开始引入的新I/O API(NIO),它允许非阻塞式高效 I/O 操作,Channel接口及ByteBuffer可用于读取大型文本文件:

java

Path path = Paths.get("input.txt");

Charset charset = Charset.forName("US-ASCII");

try (
InputStream in = Files.newInputStream(path);
Reader reader = Channels.newReader(in, charset.newDecoder(), -1)
) {
CharBuffer buf =(CharBuffer.allocate(8192));
StringBuilder sb=new StringBuilder();
while(reader.read(buf)>0){
buf.flip();
sb.append(buf.array());
buf.clear();
}
System.out.println(sb.toString());
} catch (IOException x) {
System.err.format("%s%n", x);
}


6. **使用Java 8 Stream Api**

对于现代风格的代码编写习惯,我们可以选择使用Java 8 StreamsAPI对文件按行进行流畅化操作:

java

List<String> lines = Files.lines(Path.of("input.txt"))
.collect(Collectors.toList());

lines.forEach(System.out::println);


以上就是在Java中用来从文本文件读取数据的主要方法,开发者可以根据具体需求,在性能要求、内存消耗、程序设计简洁度等方面权衡后选取最合适的方式来完成这项工作。同时,请注意每个示例都包含了相应的异常捕获语句块,这是因为在实际开发过程中正确处理可能出现的错误至关重要。