【优雅编程之道】之IO流,序列化的4点建议

开心一笑

【妈妈:“宝宝,你已经四岁了,你可以自己睡了。”
孩子:“爸爸都那么大了,为什么不自己睡?”】

视频教程

大家好,我录制的视频《Java之优雅编程之道》已经在CSDN学院发布了,有兴趣的同学可以购买观看,相信大家一定会收获到很多知识的。谢谢大家的支持……

视频地址:http://edu.csdn.net/lecturer/994


唯美图片

提出问题

项目中IO流,序列化需要注意的几点???


解决问题

前言

在工作中,写IO流的代码比较少,一般是在文件上传,下载,excel文件导入导出等等才会使用到。但是一旦系统在IO流出现问题,后果是不堪设想的,可能会造成整个系统直接挂掉。因此,写好IO流,序列号和反序列话就显的尤为重要。

1.序列化类新增属性时,请不要修改serialVersionUID字段避免反序列失败

2.及时关闭流,先开后关,后开先关

我们在io操作完成后,需要及时关闭流释放资源,因为这样的对象不主动关闭,将会占用系统资源,会增大系统的开销。

@Override
public void downloadAttachment(SysAttachment sysAttachment, HttpServletRequest request, HttpServletResponse response) throws Exception {
    //sysAttachmentService.download(attachmentId,request,response);
    String fileName = sysAttachment.getName() + "." + sysAttachment.getType();
    String dfileName = new String(fileName.getBytes("gb2312"), "iso8859-1");
    String fullPath = sysAttachment.getPath();
    //先开后关
    OutputStream out = response.getOutputStream();
    File file = new File(fullPath);
    if (file.exists()) {
        if(sysAttachment.getSubModule().equals("android")){
            response.setContentType("application/vnd.androi3d.package-archive");
        }
        else {
            response.setContentType("APPLICATION/OCTET-STREAM");
        }
        response.addHeader("Content-Disposition", "attachment;filename=" + dfileName);
        //后开先关
        FileInputStream in = null;
        try {
            out = response.getOutputStream();
            in = new FileInputStream(fullPath);
            byte[] b = new byte[1024];
            int i = 0;
            while ((i = in.read(b)) > 0) {
                out.write(b, 0, i);
            }
            out.flush();
        } finally {
            if (in != null) {
                in.close();
                in = null;
            }
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    logger.error(e.getMessage(), e);
                }
                out = null;
                response.flushBuffer();
            }
        }
    } else {
        throw new ResourceNotFoundException("文件: \"" + fileName + "\"不存在!");
    }

**3.文件中的分隔符使用类中常量 **

在window和linux中的分隔符等可能会不同,使用类中的分割常量将会根据系统自动生成。如File.pathSeparator、File.separator等

4.尽量使用缓存流

在软件系统中,IO速度比内存速度慢,IO读写在很多情况下会是系统的瓶颈。
在java标准IO操作中,InputStream和OutputStream提供基于流的IO操作,以字节为处理单位;Reader和Writer实现了Buffered缓存,以字符为处理单位。
从Java1.4开始,增加NIO(New IO),增加缓存Buffer和通道Channel,以块为处理单位,是双向通道(可读可写,类似RandomAccessFile),支持锁和内存映射文件访问接口,大大提升了IO速度。

java缓冲流本身不具IO功能,只是在别的流上加上缓冲提高效率,像是为别的流装上一种包装。当对文件或其他目标频繁读写或操作效率低,效能差。这时使用缓冲流能够更高效的读写信息。因为缓冲流先将数据缓存起来,然后一起写入或读取出来。所以说,缓冲流还是很重要的,在IO操作时记得加上缓冲流提升性能。

缓冲流分为字节和字符缓冲流

  • 字节缓冲流为:

BufferedInputStream—字节输入缓冲流
BufferedOutputStream—字节输出缓冲流

  • 字符缓冲流为:

BufferedReader—字符输入缓冲流
BufferedWriter—字符输出缓冲流

下面主要介绍这四种缓冲流的使用。

一. 字节缓冲流

1.BufferedOutputStream—字节输出缓冲流

BufferedOutputStream类实现缓冲的输出了,通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必每一个字节写入都调用底层系统。

示例代码:

public static void main(String[] args) { 
    try { 
         //创建字节输出流实例 
         OutputStream out=new FileOutputStream("L:\\test.txt"); 
         //根据字节输出流构建字节缓冲流 
         BufferedOutputStream buf=new BufferedOutputStream(out); 
         String data="好好学习,天天向上"; 
         buf.write(data.getBytes());//写入缓冲区 
         buf.flush();//刷新缓冲区,即把内容写入 
         //关闭流 
         buf.close();//关闭缓冲流时,也会刷新一次缓冲区 
         out.close(); 
    } catch (IOException e) { 
        e.printStackTrace(); 
    } 
}

结束语

IO流 和 序列化反序列化的课程,我们今天就讲到这里。跟多深入的知识,大家可以查阅书籍等资料去学习。


读书感悟

来自七堇年《被窝是青春的坟墓》

  • 被窝是青春的坟墓。
  • 我生命中的温暖就那么多,全部给了你,叫我以后怎么再对别人微笑。
  • 我们要有最朴素的生活,与最遥远的梦想 。即使明日天寒地冻,路远马亡。
  • 生命若给我无数张脸,我永远选择最疼痛的一张去触摸。
  • 我知道有些人是无法忘记的,即使在你成长之初他们就已经消失。但是他们被镌刻在你的生命线上,无法磨灭。让我们终其一生为了这些印记做两件事情:怀念,或者寻找。
  • 无奈的是,语言这东西,在表达爱意的时候如此无力;在表达伤害的时候,却又如此锋利。
  • 寂寞,就是你有话说的时候没人听,有人听的时候你却无话可说。

经典故事

【有一个欧巴桑在首饰店里看到二只一模一样的手环。
  一个标价五百五十元,另一个却只标价二百五十元。
  她大为心喜,立刻买下二百五十元的手环,得意洋洋的走出店门。
  临出去前,听到里面的店员悄悄对另一个店员说:「看吧,这一招屡试不爽。
  (学习啦:试探如饵,可以轻而易举的使许多人显露出贪婪的本性,然而那常常是吃亏受骗的开始。)】


大神文章


其他

如果有带给你一丝丝小快乐,就让快乐继续传递下去,欢迎点赞、顶、欢迎留下宝贵的意见、多谢支持!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,013评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,205评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,370评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,168评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,153评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,954评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,271评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,916评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,382评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,877评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,989评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,624评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,209评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,199评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,418评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,401评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,700评论 2 345

推荐阅读更多精彩内容