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