- Scanner(Java 1.5)
- 按行读数据
- String、Int、Long类型等
- 按分隔符读数据。
- 按分隔符读取特定类型数据
public void rf1(String filename) throws IOException {
try (Scanner sc = new Scanner(new FileReader(filename))) {
while (sc.hasNextLine()) { //按行读取字符串
String line = sc.nextLine();
System.out.println(line);
}
}
try (Scanner sc = new Scanner(new FileReader(filename))) {
sc.useDelimiter("\\|"); //分隔符
while (sc.hasNext()) { //按分隔符读取字符串
String str = sc.next();
System.out.println(str);
}
}
//sc.hasNextInt() 、hasNextFloat() 、基础数据类型等等等等。
//文件内容:1|2
try (Scanner sc = new Scanner(new FileReader(filename))) {
sc.useDelimiter("\\|"); //分隔符
while (sc.hasNextInt()) { //按分隔符读取Int
int intValue = sc.nextInt();
System.out.println(intValue);
}
}
}
- Files.lines, 返回Stream(Java 8)
- 流式数据处理,将文件读取与文件处理有机融合
- 按行读取
- 代码简洁
public void rf2(String filename) throws IOException {
Path path = Paths.get(filename);
//读取文件到Stream流,按行读取
Stream<String> lines = Files.lines(path);
// 随机行顺序进行数据处理
lines.forEach(ele -> {
System.out.println(ele);
});
//按文件行顺序进行数据处理
lines.forEachOrdered(ele -> {
System.out.println(ele);
});
//利用CPU多核,并行处理数据,适合较大的文件
lines.parallel().forEachOrdered(ele ->{
System.out.println(ele);
});
}
可以把Stream转换成List,但是要注意这意味着你要将所有的数据一次性加载到内存,要注意java.lang.OutOfMemoryError
List<String> collect = lines.collect(Collectors.toList());
- Files.readAllLines, 返回List(Java 8)
直接按行读取文件获取到一个List 一次存入内存
public void rf3(String filename) throws IOException {
// TODO Auto-generated method stub
// 转换成List<String>, 要注意java.lang.OutOfMemoryError: Java heap space
Path path = Paths.get(filename);
List<String> lines = Files.readAllLines(path,StandardCharsets.UTF_8);
lines.forEach(System.out::println);
}
- Files.readString, 读取String(Java 11), 文件最大 2G.
- 一次性的快速读取一个文件的内容转为String
-
- 适用于读取小文本
public void rf4(String filename) {
// TODO Auto-generated method stub
Path path = Paths.get(filename);
//JDK 11
String s = Files.readString(Paths.get(filename));
}
- Files.readAllBytes, 读取byte[](Java 7), 文件最大 2G.
- 一次性的快速读取一个文件的内容转为String
- 先将数据读取为二进制数组,然后转换成String内容
- 适用于读取小文本且无JDK11
public void rf5(String filename) throws IOException {
// TODO Auto-generated method stub
Path path = Paths.get(filename);
byte[] bytes = Files.readAllBytes(path);
String content = new String(bytes, StandardCharsets.UTF_8);
System.out.println(content);
}
- BufferedReader, 经典方式 管道流(Java 1.1 -> forever)
- 通过管道流嵌套的方式,组合使用,比较灵活
public void rf6(String filename) throws IOException {
// TODO Auto-generated method stub
try (BufferedReader br = new BufferedReader(new FileReader(filename))){
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
//java 8中这样写也可以
try (BufferedReader br = Files.newBufferedReader(Paths.get(filename))){
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}
想从文件中读取java Object就可以使用下面的代码,前提是文件中的数据是ObjectOutputStream写入的数据,才可以用ObjectInputStream来读取。
try (FileInputStream fis = new FileInputStream(fileName);
ObjectInputStream ois = new ObjectInputStream(fis)){
ois.readObject();
}