c++返回指针时候注意提防

Java8中有一个非常不错的新功能,它使您可以在一个内衬中从文件中获取字符串流。

List lines = Files.lines(path).collect(Collectors.toList());

您可以像处理任何其他Stream一样操作Stream,例如,您可能需要filter()或map()或limit()或skip()等。我开始在代码中使用它,直到遇到异常,

Caused by: java.nio.file.FileSystemException: /tmp/date.txt: Too many open files in systemat sun.nio.fs.UnixException.translateToIOException(UnixException.java:91)at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214)at java.nio.file.Files.newByteChannel(Files.java:361)at java.nio.file.Files.newByteChannel(Files.java:407)at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384)at java.nio.file.Files.newInputStream(Files.java:152)at java.nio.file.Files.newBufferedReader(Files.java:2784)at java.nio.file.Files.lines(Files.java:3744)at java.nio.file.Files.lines(Files.java:3785)

由于某些原因,我打开的文件太多了! 奇怪,Files.lines()是否关闭文件?

请参阅下面的代码( run3() ),其中创建的内容再现了该问题:

package utility;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Date;
import java.util.stream.Stream;public class Test2 {public static void main(String[] args) throws IOException{int times = 100_000;Path path = Paths.get("/tmp", "date.txt");Test2 t2 = new Test2();t2.setDate(path);for (int i = 0; i < times; i++) {t2.run1(path);}for (int i = 0; i < times; i++) {t2.run2(path);}for (int i = 0; i < times; i++) {t2.run3(path);  //throws exception too many files open}System.out.println("finished");}public String run1(Path path){try(BufferedReader br = new BufferedReader(new FileReader(path.toFile()))){return br.readLine();} catch (IOException e) {throw new AssertionError(e);}}public String run2(Path path){try(Stream<String> stream = Files.lines(path)) {return stream.findFirst().get();} catch (IOException e) {throw new AssertionError(e);}}public String run3(Path path) throws IOException{return Files.lines(path).findFirst().get();}public void setDate(Path path) {try (FileWriter writer = new FileWriter(path.toFile())){writer.write(new Date().toString());writer.flush();} catch (IOException e) {throw new AssertionError(e);}}
}

我的代码看起来像run3() ,它产生了异常。 我通过运行unix命令lsof (列出打开的文件)并注意到许多date.txt实例打开来证明这一点。 要检查这个问题确实与Files.lines()我确信,代码跑了run1()使用BufferedReader ,它做到了。 通过阅读Files的源代码,我意识到Stream需要以可自动关闭的方式创建 。 当我在run2()该代码时,代码再次正常运行。

我认为这并不是特别直观。 当您必须使用自动关闭装置时,它确实损坏了一个衬管。 我猜想代码确实需要有关何时关闭文件的信号,但是如果对我们隐藏了,不知何故还是不错的。 至少应该在JavaDoc中突出显示它,而不是:-)

翻译自: https://www.javacodegeeks.com/2015/02/java-8-pitfall-beware-files-lines.html

c++返回指针时候注意提防

c++返回指针时候注意提防_Java 8陷阱–提防Files.lines()相关推荐

  1. c++返回指针时候注意提防_提防Java中的函数式编程!

    c++返回指针时候注意提防 这对函数式编程并不会造成太大的影响,这真棒. 这是关于某些实践的警告,您很可能会将其应用于您的代码,而这是完全错误的! . 高阶函数对于函数式编程是必不可少的,因此,谈论它 ...

  2. c++返回指针时候注意提防_编写干净的测试–提防魔术

    c++返回指针时候注意提防 很难为干净的代码找到一个好的定义,因为我们每个人都有自己的单词clean的定义. 但是,有一个似乎是通用的定义: 简洁的代码易于阅读. 这可能会让您感到有些惊讶,但我认为该 ...

  3. C++ 笔记(14)— 指针(指针声明、取地址、取值、new/delete、NULL指针、指针运算、指针数组、数组指针、指针传递给函数、从函数返回指针)

    1. 声明指针 指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址.就像其他变量或常量一样,您必须在使用指 针存储其他变量地址之前,对其进行声明. 指针变量声明的一般形式为: type * ...

  4. 20返回指针的函数与指向函数的指针

    一.返回指针的函数 指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的. 返回指针的函数的一般形式为:类型名 * 函数名(参数列表) 比如下面这个函数,返回一个指向char类型变 ...

  5. (转)函数指针,指针函数,指向函数的指针,返回指针的函数

    摘要: 在学习C语言时,一个比较容易混淆的概念就是函数指针.指针函数.返回值为指针的函数.本文将对这三个概念进行区分.指针函数就是返回值为指针的函数,两个本质上是同一事物,只是叫法不同.函数指针就是一 ...

  6. 【学习笔记】【C语言】返回指针的函数

    函数如果带*的返回的就是指针 char *test() {  } 1 #include <stdio.h> 2 char *test(); 3 4 /* 5 返回指针的函数 6 */ 7 ...

  7. C语言 返回指针的函数--指针函数 int* max(int a)

    定义 strlong示例代码 代码1: #include<stdio.h> #include<string.h> //返回指针的函数//比较两个字符串,返回更长的字符串 cha ...

  8. 函数指针、函数返回指针、const指针、指向const指针,指向const的const指针。

    ①函数指针 函数指针是指向函数的指针变量. 因而"函数指针"本身首先应是指针变量,只不过该指针变量指向函数.这正如用指针变量可指向整型变量.字符型.数组一样,这里是指向函数.如前所 ...

  9. C语言函数指针和返回指针值的函数

    一.用函数指针变量调用函数 一个函数,在编译的时候 ,系统会给这个函数分配一个入口地址,这个入口地址就称为函数的指针(地址).既然有地址,那么我们可以定义一个指针变量指向该函数,然后,我们就可以通过该 ...

最新文章

  1. 听听阿里老哥对算法工程师技术学习路线的建议
  2. 如何處理不同版本的 Gem 執行檔,以 Rake 0.9.0 地雷為例
  3. 使用Redis 实现消息队列
  4. 在解决计算机主机,电脑主机噪音大怎么办 电脑主机噪音大解决方法【图文】...
  5. 运维工程师绩效考核表_IT运维存在问题及改进
  6. String转换为int类型
  7. 最小生成树——克鲁斯卡尔算法
  8. Android应用程序与SurfaceFlinger服务的连接过程分析
  9. linux docker自动启动命令行,docker容器内服务随容器自启动
  10. linux shell 命令记录,linux常用shell命令记录
  11. openstack mysql配置_《OpenStack云计算实战手册(第2版)》一2.3 用MySQL配置OpenStack镜像服务-阿里云开发者社区...
  12. 菜鸟历程1腾讯云服务器 10元学生套餐购买
  13. AI-语音处理理论与应用-语音处理简介
  14. 用qq的功能进行屏幕录制
  15. RT-Thread Smart上手指南~
  16. PHP开发基于Mirai的QQ机器人
  17. 如何排查CPU 100%的应用
  18. RK3588平台开发系列讲解(Display篇)开机视频的设置
  19. 基于matlab的DOA角度定位估计仿真
  20. 微信小程序java服务_微信小程序访问webService(Java)

热门文章

  1. 欢乐纪中A组赛【2019.8.17】
  2. jzoj4208-线段树什么的最讨厌了【dfs】
  3. POJ1151-Atlantis【线段树,扫描线,离散化】
  4. 【做题记录】 [HEOI2013]SAO
  5. 初一模拟赛(4.20)
  6. Apache Druid(一)简介
  7. 编译原理(四)之解析语言翻译成三地址代码
  8. Java中的6颗语法糖
  9. c语言程序设计--图书管理系统
  10. ‘小会计’的转行之旅