java IO 从文件中读取数据的6种方法

  1. 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);
		      }
		   }
	}
  1. 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());
  1. 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);
	}
  1. 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));
	}
  1. 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);
	}
  1. 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();
} 
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值