相关文章推荐
不拘小节的电池  ·  Llama ...·  6 月前    · 
爱旅游的感冒药  ·  MySQL视图、索引·  1 年前    · 
儒雅的饺子  ·  Delphi WinAPI ...·  1 年前    · 

MultipartFile.getInputStream打开流之后,是否需要关闭呢? 因为InputStream继承了AutoCloseable接口。

从AutoCloseable的说明里可知它是为了更好的管理资源,也就是及时释放资源,当一个资源类集成了它并且实现了close方法,在使用try-catch-resources语法创建的资源抛出异常后,JVM会自动调用close 方法进行资源释放,当没有抛出异常正常退出try-block时候也会调用close方法。

有些文章说只要对象销毁时,就会调用close方法释放流资源。下面是一段测试代码:

public static String testMultipartFileStream(MultipartFile file) {
        Tika defaultTika = new Tika();
        String fileType;
            InputStream stream = file.getInputStream()
            fileType = defaultTika.detect(stream);
        catch (IOException ioEx)
            fileType = "Unknown";
        return fileType;

使用ByteCode View工具查看字节码:

 在字节码中可以看到,并没有调用流的close函数。

再将代码改成使用try-catch-resources语法如下:

 public static String testMultipartFileStream(MultipartFile file) {
        Tika defaultTika = new Tika();
        String fileType;
        try (InputStream stream = file.getInputStream())
            fileType = defaultTika.detect(stream);
        catch (IOException ioEx)
            fileType = "Unknown";
        return fileType;

再查看字节码:

 可以看到InputStream的close被调用了,自己再也不用写复杂的代码来关闭流资源了。

综上测试结果,实现了AutoCloseable也不意味着资源的关闭就是自动的,在try-catch-resources里创建的流资源才会自动释放。

MultipartFile.getInputStream打开流之后,是否需要关闭呢? 因为也继承了AutoCloseable接口。从AutoCloseable的说明里可知它是为了更好的管理资源,也就是及时释放资源,当一个资源类集成了它并且实现了close方法,在使用try-catch-resources语法创建的资源抛出异常后,JVM会自动调用close 方法进行资源释放,当没有抛出异常正常退出try-block时候也会调用close方法。有些文章说只要对象销毁时,就会调用close方法释放流资源。
java文件上传的时候发现CommonsMultipartFile的getInputStream方法在文件不同大小的时候返回的对象是不同的,导致InputStream在转换为对应的子类对象是报错,当时很是纠结,然后看了下getInputStream的代码实现 当文件小于10240b(即10kb)的时候,返回的是ByteArrayInputStream 当文件大于10kb的时候,返回的FileI...
一、引言也许大家在使用时因为未关闭、或者未正常关闭引发了很多问题。其实java7引入了自动关闭机制,只是我们未使用而已。二、自动关闭例子public class AutoCloseTest { public static void main(String[] args) throws IOException { //将打开代码放到try中 try (...
从springmvc获取到的文件是MultipartFile类型的,有的时候不能直接用从这种类型获取到的inputstream操作一些事情,比如从中初始化poi的Workbook,这时候要怎么获取到File式的呢? 有一个方法就是把读到的MultipartFile转存到本地,然后再从本地读取这个转存的这个临时文件,从中获取文件。这么写的话可以达到目的但是听起来就很繁琐对不对。还有一个方法,是从
InputStream inputStream = file.getInputStream(); String fileName = file.getOriginalFilename(); byte[] bs = new byte[1024]; int len; Long startTs = System.currentTimeMillis(); String timeStemp = String.valueOf(startTs); // 获得时间戳 File f = new File(path + "
最近在学习GC,接触了一个新概念“内存泄露”,之前也听过这个概念,但是没放在心上。但这一次不一样,看看后果感谢很严重。于内存泄露的一个典型场景就是资源未及时关闭导致的内存泄露,回想一下,之前我写文件上传的代码,没有主动关闭过资源,那会不会也导致内存泄露呢,带着这样的疑问,我开始了今天这篇文章。。。 1 MultipartFile文件上传,是否需主动关闭资源 2 使用FileCopyUtils.copy(in, out)是否需主动关闭资源 从FileCopyUtils的源码可以看出,在方法内部对输
运行Visual Studio code,遇到error while loading shared libraries: libXss.so.1: cannot open shared object 21477