使用Files中返回值为Stream<T>方法的坑

使用Files.find()等方法的坑

在使用Files.find()Files.lines()Files.list()等方法时,他们返回的都是Stream的类型。这时候我们往往为了方便,会直接对流进行业务处理,然后就返回了。例如:

public static <T> List<T> localToListPagination(String p, TypeReference<T> tClass, long page){
        try {
            Path path = Paths.get(p);
            long start = (page-1)*Constants.LOCAL_PAGE;
            long end = Files.lines(path).count();
            if (start > end) {
                return new ArrayList<>();
            }
            return Files.lines(path)
                    .skip(start)
                    .limit(Constants.LOCAL_PAGE)
                    .map(s -> JSON.parseObject(s, tClass))
                    .collect(Collectors.toList());
        } catch (IOException e) {
            log.info("{} 该文件读写异常: {}", p, e.getMessage());
        }
        return new ArrayList<>();
    }

这里会有一个隐含问题,因为这一类方法虽然返回的都是Stream,但是它为了实现对文件的读写,所以内部往往封装了一个Reader或者Writer类似的操作对象,用来对文件流进行读写,所以需要我们在使用完毕之后,对资源进行回收,执行close方法。否则进程就会一直占用对应的资源,导致后续在进行删除的时候,并不会真正的删除文件,从而日积月累之下,导致磁盘空间占满

以下是**Files内部实现lines()**方法中的注释:

The returned stream encapsulates a Reader. If timely disposal of file system resources is required, the try-with-resources construct should be used to ensure that the stream’s close method is invoked after the stream operations are completed.

返回的流封装了一个 Reader。 如果需要及时处理文件系统资源,则应使用 try-with-resources 构造来确保在流操作完成后调用流的 close 方法。

所以我们需要对流进行关闭。正确的使用方式:

public static <T> List<T> localToListPagination(String p, TypeReference<T> tClass, long page){
        try {
            Path path = Paths.get(p);
            long start = (page-1)*Constants.LOCAL_PAGE;
            long end = Files.lines(path).count();
            if (start > end) {
                return new ArrayList<>();
            }

            try(Stream<String> lines = Files.lines(path)){
                return lines
                        .skip(start)
                        .limit(Constants.LOCAL_PAGE)
                        .map(s -> JSON.parseObject(s, tClass))
                        .collect(Collectors.toList());
            }
        } catch (IOException e) {
            log.info("{} 该文件读写异常: {}", p, e.getMessage());
        }
        return new ArrayList<>();
    }

你可能感兴趣的:(Java,Linux,java,开发语言)