亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

深入springMVC源碼------文件上傳源碼解析(下篇)

2019-11-06 06:06:11
字體:
來源:轉載
供稿:網友

在上篇《深入sPRingMVC------文件上傳源碼解析(上篇) 》中,介紹了springmvc文件上傳相關。那么本篇呢,將進一步介紹springmvc 上傳文件的效率問題。

相信大部分人在處理文件上傳邏輯的時候會直接獲取輸入流直接進行操作,偽代碼類似這樣:

@RequestMapping(value = "/upload", method = RequestMethod.POST)public ResultView upload(@RequestParam("file") MultipartFile file) {    Inputstream in = file.getInputStream();    ...         }

但是,出于效率,其實我個人更推薦使用 MultipartFile 的 transferTo 方法進行操作,類似這樣:

@RequestMapping(value = "/upload", method = RequestMethod.POST)public ResultView upload(@RequestParam("file") MultipartFile file) {    file.transferTo(new File(destFile));    ...         }

為什么呢?這個就得從源碼說起,廢話不多說,咱們直接去看源碼吧:

1. 先看 MultipartFile(其實現類CommonsMultipartFile) 的getInputStream方法:

CommonsMultipartFile:

復制代碼
public InputStream getInputStream() throws IOException {        if (!isAvailable()) {            throw new IllegalStateException("File has been moved - cannot be read again");        }        InputStream inputStream = this.fileItem.getInputStream();        return (inputStream != null ? inputStream : new ByteArrayInputStream(new byte[0]));    }復制代碼

通過源碼可以看到,spring是通過commons-fileupload 中的FileItem對象去獲取輸入流,那么就去看看FileItem(其實現類DiskFileItem)的對應方法:

DiskFileItem:

復制代碼
public InputStream getInputStream()        throws IOException {        if (!isInMemory()) {            return new FileInputStream(dfos.getFile());        }        if (cachedContent == null) {            cachedContent = dfos.getData();        }        return new ByteArrayInputStream(cachedContent);    }復制代碼

通過源碼可以看到:先去查看是否存在于內存中,如果存在,就將內存中的file對象包裝為文件流, 如果不存在,那么就去看緩存,如果緩存存在就從緩存中獲取字節數組并包裝為輸入流。

 

接下來,咱們再看看 CommonsMultipartFile 的 transferTo 方法,以便形成比較:

CommonsMultipartFile:

復制代碼
@Override    public void transferTo(File dest) throws IOException, IllegalStateException {        if (!isAvailable()) {            throw new IllegalStateException("File has already been moved - cannot be transferred again");        }        if (dest.exists() && !dest.delete()) {            throw new IOException(                    "Destination file [" + dest.getAbsolutePath() + "] already exists and could not be deleted");        }        try {            this.fileItem.write(dest);            if (logger.isDebugEnabled()) {                String action = "transferred";                if (!this.fileItem.isInMemory()) {                    action = isAvailable() ? "copied" : "moved";                }                logger.debug("Multipart file '" + getName() + "' with original filename [" +                        getOriginalFilename() + "], stored " + getStorageDescription() + ": " +                        action + " to [" + dest.getAbsolutePath() + "]");            }        }        catch (FileUploadException ex) {            throw new IllegalStateException(ex.getMessage());        }        catch (IOException ex) {            throw ex;        }        catch (Exception ex) {            logger.error("Could not transfer to file", ex);            throw new IOException("Could not transfer to file: " + ex.getMessage());        }    }復制代碼

不多說,主要看 this.fileItem.write(dest) 這一句,利用commons-fileupload 中的相關方法:

DiskFileItem:

復制代碼
public void write(File file) throws Exception {        if (isInMemory()) {            FileOutputStream fout = null;            try {                fout = new FileOutputStream(file);                fout.write(get());            } finally {                if (fout != null) {                    fout.close();                }            }        } else {            File outputFile = getStoreLocation();            if (outputFile != null) {                // Save the length of the file                size = outputFile.length();........復制代碼

通過源碼可以看到 transfoTo 方法很干凈利落,直接去將內存中的文件通過輸出流寫出到指定的file 。 等等,跟上面的 getInputStream方法相比,是不是省了點步驟? 是的,再來一張圖,清晰地表示兩個方法地不同之處:

圖中:

紅色線表示使用的是transferTo方法,黑色線代表getInputStream方法, 可見,transferTo直接將內存中的文件緩存直接寫入到磁盤的物理文件, 而getInputStream方法會中轉一次(先通過getInputStream從內存中獲取流,再通過outputStream輸出到磁盤物理文件)。兩者相比,即使從步驟來看,你也能看出來transferTo效率更高了吧。

好啦,本篇就到此結束啦!

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品久久久久久久久久另类| 亚洲字幕在线观看| 亚洲精品视频中文字幕| 亚洲一级黄色片| 7777kkkk成人观看| 亚洲xxxxx性| 久久亚洲综合国产精品99麻豆精品福利| 2018中文字幕一区二区三区| 亚洲欧美日韩综合| 午夜精品福利在线观看| 国产福利成人在线| 欧美又大又硬又粗bbbbb| 亚洲精品中文字| 国产在线观看精品一区二区三区| xxx成人少妇69| 久久久久久亚洲| 日韩a**站在线观看| 亚洲爱爱爱爱爱| 亚洲色无码播放| 国外日韩电影在线观看| 亚州欧美日韩中文视频| 午夜剧场成人观在线视频免费观看| 伊人av综合网| 国产一区二区丝袜| 日韩欧美国产黄色| 亚洲国产精品yw在线观看| 欧美激情免费看| 国产婷婷成人久久av免费高清| 久久国产精品偷| 亚洲欧美综合图区| 欧美日本高清视频| 欧洲中文字幕国产精品| 一本色道久久88亚洲综合88| 中国人与牲禽动交精品| 2021久久精品国产99国产精品| 欧美另类在线观看| 中文字幕日韩av综合精品| 国产视频观看一区| 国产精品pans私拍| 亚洲国产精品成人一区二区| 国产裸体写真av一区二区| 色噜噜狠狠狠综合曰曰曰| 国内精品视频久久| 日韩电影在线观看中文字幕| 欧美激情精品久久久久久蜜臀| 亚洲最大成人网色| 亚洲精品v欧美精品v日韩精品| 成人免费在线视频网站| 国产91露脸中文字幕在线| 亚洲精品av在线| 国产亚洲精品久久久久久| 91日本视频在线| 亚洲精品综合久久中文字幕| 亚洲第一视频网站| 亚洲97在线观看| 国产精品第8页| 久久精品国产v日韩v亚洲| 国产精品女人久久久久久| 久久精品久久久久久| 亚洲一区二区黄| 日韩高清av一区二区三区| 欧美福利视频在线| 青青草99啪国产免费| 91老司机在线| 成人黄色av免费在线观看| 亚洲www在线观看| 色偷偷偷亚洲综合网另类| 热门国产精品亚洲第一区在线| 亚洲毛茸茸少妇高潮呻吟| 精品久久久中文| 4438全国成人免费| 亚洲色图50p| 亚洲精品国产成人| 在线观看视频99| 国产成人激情视频| 欧美精品在线播放| 久久精品国产欧美激情| 韩国v欧美v日本v亚洲| 亚洲精品av在线| 97av在线视频| 日韩va亚洲va欧洲va国产| 韩国国内大量揄拍精品视频| 在线日韩欧美视频| 欧美天天综合色影久久精品| 日韩在线精品视频| 精品动漫一区二区三区| 日韩欧美视频一区二区三区| 久久久人成影片一区二区三区观看| 欧美激情视频免费观看| 久热精品在线视频| 久久久久久久一| 欧美黄色小视频| 精品自拍视频在线观看| 亚洲精品久久久久中文字幕欢迎你| 国产精品网址在线| 亲爱的老师9免费观看全集电视剧| 日本道色综合久久影院| 疯狂做受xxxx高潮欧美日本| 91久久久久久久久| 国产精品久久久久久av下载红粉| 日韩精品中文字| 97色在线播放视频| 国产一区二区日韩| 性色av一区二区三区| 欧美激情18p| 亚洲成人av在线| 欧美美女操人视频| 国产欧美在线播放| 久久久国产精品x99av| 美女av一区二区| 91伊人影院在线播放| 日韩欧美亚洲范冰冰与中字| 91欧美精品午夜性色福利在线| 国产69精品99久久久久久宅男| 91av视频在线播放| 久久久久日韩精品久久久男男| 亚洲欧美日韩天堂一区二区| 91网站在线免费观看| 一区二区三区四区精品| 国产日韩在线亚洲字幕中文| 亚洲精品在线看| 午夜精品久久久久久久99热浪潮| 亚洲理论在线a中文字幕| www.亚洲男人天堂| 亚洲网站在线播放| 午夜精品在线视频| 亚洲精品美女视频| 久久全球大尺度高清视频| 久久精品成人欧美大片| 在线观看欧美www| 精品国产一区二区三区久久久| 96pao国产成视频永久免费| 欧美制服第一页| 8x拔播拔播x8国产精品| 亚洲图片欧美日产| 欧美日韩爱爱视频| 国产在线久久久| 亚洲天堂av在线播放| 欧美午夜精品久久久久久浪潮| 欧美在线视频一区| 国产精品久久中文| 91chinesevideo永久地址| 国产精品久久久久久久天堂| 日韩精品中文字幕在线播放| 中文字幕国产亚洲| 97国产精品视频人人做人人爱| 亚洲精品成人av| 国产成人一区二区三区| 88国产精品欧美一区二区三区| 日韩欧美高清视频| 国产91精品在线播放| 91免费在线视频网站| 中文字幕在线国产精品| 精品无人区乱码1区2区3区在线| 成人激情av在线| 久久国产精品偷| 亚洲一区二区在线| 丝袜亚洲欧美日韩综合| 日韩精品高清在线观看| 国产精品久久av| 日韩中文字幕不卡视频| 久久乐国产精品| 亚洲精品女av网站| 中文字幕日韩综合av|