Java读取⽂件内容的六种⽅法
1.Scanner
第⼀种⽅式是Scanner,从JDK1.5开始提供的API,特点是可以按⾏读取、按分割符去读取⽂件数据,既可以读取String类型,也可以读取Int类型、Long类型等基础数据类型的数据。@Test
void testReadFile1() throws IOException {
//⽂件内容:Hello World|Hello Zimug
String fileName = "D:\\data\\test\\";
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
fileName = "D:\\data\\test\\";
try (Scanner sc = new Scanner(new FileReader(fileName))) {
sc.useDelimiter("\\|"); //分隔符
while (sc.hasNextInt()) { //按分隔符读取Int
int intValue = sc.nextInt();
System.out.println(intValue);
}
}
}
上⾯的⽅法输出结果如下:
Hello World|Hello Zimug
Hello World
Hello Zimug
1
2
2.Files.lines (Java 8)
如果你是需要按⾏去处理数据⽂件的内容,这种⽅式是我推荐⼤家去使⽤的⼀种⽅式,代码简洁,使⽤java 8的Stream流将⽂件读取与⽂件处理有机融合。
@Test
void testReadFile2() throws IOException {
String fileName = "D:\\data\\test\\";
// 读取⽂件内容到Stream流中,按⾏读取
Stream<String> lines = Files.(fileName));
// 随机⾏顺序进⾏数据处理
lines.forEach(ele -> {
System.out.println(ele);
});
}
forEach获取Stream流中的⾏数据不能保证顺序,但速度快。如果你想按顺序去处理⽂件中的⾏数据,可以使⽤forEachOrdered,但处理效率会下降。
// 按⽂件⾏顺序进⾏处理
lines.forEachOrdered(System.out::println);
nextint()方法或者利⽤CPU多和的能⼒,进⾏数据的并⾏处理parallel(),适合⽐较⼤的⽂件。
// 按⽂件⾏顺序进⾏处理
lines.parallel().forEachOrdered(System.out::println);
也可以把Stream<String>转换成List<String>,但是要注意这意味着你要将所有的数据⼀次性加载到内存,要注意java.lang.OutOfMemoryError
// 转换成List<String>, 要注意java.lang.OutOfMemoryError: Java heap space
List<String> collect = List());
adAllLines
这种⽅法仍然是java8 为我们提供的,如果我们不需要Stream<String>,我们想直接按⾏读取⽂件获取到⼀个List<String>,就采⽤下⾯的⽅法。同样的问题:这意味着你要将所有的数据⼀次性加载到内存,要注意java.lang.OutOfMemoryError
@Test
void testReadFile3() throws IOException {
String fileName = "D:\\data\\test\\";
// 转换成List<String>, 要注意java.lang.OutOfMemoryError: Java heap space
List<String> lines = (fileName),
StandardCharsets.UTF_8);
lines.forEach(System.out::println);
}
adString(JDK 11)
从 java11开始,为我们提供了⼀次性读取⼀个⽂件的⽅法。⽂件不能超过2G,同时要注意你的服务器及JVM内存。这种⽅法适合快速读取⼩⽂本⽂件。
@Test
void testReadFile4() throws IOException {
String fileName = "D:\\data\\test\\";
// java 11 开始提供的⽅法,读取⽂件不能超过2G,与你的内存息息相关
//String s = (fileName));
}
adAllBytes()
如果你没有JDK11(readAllBytes()始于JDK7),仍然想⼀次性的快速读取⼀个⽂件的内容转为String,该怎么办?先将数据读取为⼆进制数组,然后转换成String内容。这种⽅法适合在没有JDK11的请开给你下,快速读取⼩⽂本⽂件。
@Test
void testReadFile5() throws IOException {
String fileName = "D:\\data\\test\\";
//如果是JDK11⽤上⾯的⽅法,如果不是⽤这个⽅法也很容易
byte[] bytes = (fileName));
String content = new String(bytes, StandardCharsets.UTF_8);
System.out.println(content);
}
6.经典管道流的⽅式
最后⼀种就是经典的管道流的⽅式
@Test
void testReadFile6() throws IOException {
String fileName = "D:\\data\\test\\";
// 带缓冲的流读取,默认缓冲区8k
try (BufferedReader br = new BufferedReader(new FileReader(fileName))){
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
//java 8中这样写也可以
try (BufferedReader br = (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)){
}
本⽂转载:。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论