总体结构

IO应该是平时项目里最常用到的功能了,无论是简单的文件读取,还是服务器端口监听,都会用到IO;但是,在面对Java IO包里庞杂的IO基础类库时,经常会很头大,是该选择InputStream还是应该选择Reader,应该为InputStream增加一个Buffer吗?如何根据应用场景选择合适的类库是摆在很多代码人员面前的一个难题,这里我将Java IO包里的常用类库做了一个梳理,包括它们的组织结构,功能特性,适用场景等,以方便后续使用时能方便快捷的根据需求选取最合适的IO类

根据解析图,从大的层面可以IO进行两个维度的划分:

  1. 数据类型,即:字符 or 字节,类上对应于Writer/Reader or OutputStream/InputStream
  2. 操作类型,即:读取(输入) or 写入(输出),类上对应于Reader/InputStream or Writer/OutputStream

使用技巧

Java IO的所有操作都无外乎这两种维度四大主类的扩展,大部分比较简单,下面对于稍微难理解以及值得注意的点进行单独说明

  1. Java IO大量使用了Decorator模式,所以,一般在使用IO类库的时候都是采用Decorator的调用方式:
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
  1. 在Java IO中,无论是字符的读与写还是字节的读与写,基本都是一一对应的,换句话说,有一个特定读的类,一般就会有一个特定写的类,把握这一点,可以起到化繁为简的作用,如FileInputStreamFileOutputStream就分别对应于文件的读和写;PipedInputStreamPipedOutputStream分别对应于管道数据的读和写
  2. 如何区分读 or 写,这是一个经常会困扰新手的问题,这里我提供一个简单的区分方式:以你当前运行的程序作为基准(即调用IO的程序),数据从程序传至其它地方则为写(输出),数据从其它地方传至程序则为读(输入);如将程序产生的数据存放至日志文件中,那么就是写,从端口中取得数据并在程序中进行处理,则是读

  1. 根据要执行的动作以及目标数据类型,同时结合使用场景选择合适的IO类进行组装,注意上面一句话其实涉及到三个步骤:

    • 执行的动作,即是要读还是要写
    • 数据类型,即是字节还是字符,有的时候还需要字符与字节的转换(如OutputStreamWriter);如需要在网络上或内存里存储的数据,一般都是以字节的形式;又或者文件的写入,文本类的文件这种本身就是字符编码的一般是字符形式,而对于图片,视频等文件则只能使用字节的形式
    • 使用场景,其实使用场景需要分两步考虑,首先考虑显而易见的场景,如是文件的操作还是字符串的操作,抑或是管道通信;其次需要考虑性能,如对文件的写操作是否会比较频繁,若是,则建议通过BufferedWriter对其进行封装,因为每次都对少量数据进行文件打开并写入是一个效率很低的方式

总结

本文主要对基本的IO类做了简单的梳理,并就IO中的基本概念以及如何使用IO基础类库做了说明,当然,本文并未罗列所有的IO实现类,感兴趣的同学可以自己查看Java的文档或源码,同时本文也未如何自己定制IO类库,其实一般情况下Java提供的基础类库足以满足需求;另外Java在1.4后引入了NIO,即:No Blocking IO,它与原IO的使用场景有一定区别

Java学习交流QQ群:589809992  禁止闲聊,非喜勿进!

Java IO使用入门的更多相关文章

  1. Java io 入门

    目录 前言 代码演练 字符流 FileReader,FileWriter: BufferedReader,BufferedWriter: InputStreamReader,OutputStreamW ...

  2. Java中的IO流 - 入门篇

    前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的IO流-入门篇>,希望对大家有帮助,谢谢 由于Java的IO类有很多,这就导致我刚开始学的时候,感觉很乱,每次用到都是上网搜,结果 ...

  3. Java IO学习笔记八:Netty入门

    作者:Grey 原文地址:Java IO学习笔记八:Netty入门 多路复用多线程方式还是有点麻烦,Netty帮我们做了封装,大大简化了编码的复杂度,接下来熟悉一下netty的基本使用. Netty+ ...

  4. Java入门系列(十)Java IO

    概述 总体而言,java的读写操作又分为两种:字符流和字节流. 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件. 什么是流? ...

  5. Java入门:Java IO概括

    I/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道.在当今这个数据大爆炸时代,I/O 问题尤其突出,很容易成为一个性 ...

  6. java IO 入门例子

    import java.io.File; /** * File类型基本操作 */ /** * @author Administrator * */ public class FileDemo { /* ...

  7. 关于spark入门报错 java.io.FileNotFoundException: File file:/home/dummy/spark_log/file1.txt does not exist

    不想看废话的可以直接拉到最底看总结 废话开始: master: master主机存在文件,却报 执行spark-shell语句:  ./spark-shell  --master spark://ma ...

  8. Java IO入门

    目录 一. 数据源(流) 二. 数据传输 三. 总结 我们从两个方面来理解Java IO,数据源(流).数据传输,即IO的核心就是对数据源产生的数据进行读写并高效传输的过程. 一. 数据源(流) 数据 ...

  9. java Io流更新文件内容

    package com.hp.io; import java.io.FileOutputStream; import java.io.IOException; public class FileOut ...

随机推荐

  1. js获得时间new Date()整理

    Date对象取得年份有两种方法:getFullYear()和getYear() 经测试var dt = new Date(); //alert(new Date())弹出:Thu Aug 24 201 ...

  2. 面试题1 -- Java 中,怎么在格式化的日期中显示时区?

    使用SimpleDateFormat来实现格式化日期 import java.text.SimpleDateFormat; import java.util.Date; public class Da ...

  3. Mvc分页组件MvcSimplePager代码重构及使用

    1 Mvc分页组件MvcSimplePager代码重构 1.1 Intro 1.2 MvcSimplePager 代码优化 1.3 MvcSimplePager 使用 1.4 End Mvc分页组件M ...

  4. Spring Security学习笔记

    Spring Web Security是Java web开发领域的一个认证(Authentication)/授权(Authorisation)框架,基于Servlet技术,更确切的说是基于Servle ...

  5. PHP字符串和数组

    php常用函数和数组 字符串替换 , 分割字符串(字符串转数组),  拼接数组的值(数组组转字符串) , 格式化输出  查找字符首次出现的位置 , 获取字符串长度 以一个数组作为key另一个数组作为v ...

  6. 帆软的报表系统与泛微OA结合起来,这两个软件麦枫提供了经典的服务。

    一.集成配景泛微OA对企业的代价 泛微协同办公计划能向你供给一个协同的.集成的办公情况,使所有的办公职员都在统一且个性化的信息流派中一路事情, 解脱光阴和地区的限定,实现协同事情与知识治理. Eoco ...

  7. Centos7.2下基于Nginx+Keepalived搭建高可用负载均衡(一.基于Keepalived搭建HA体系)

    说明 本文只为方便日后查阅,不对一些概念再做赘述,网上都有很多明确的解释,也请大家先了解相关概念. 两台搭建HA的服务器是华为云上的ECS(不要忘记开通VPC,保证我们的服务器都处在一个内网环境),由 ...

  8. Adobe Flash Player 因过期而遭遇阻止怎么办

    百度搜索"adobe flash player ppapi "并找到搜索结果中包含www.adobe.com的网址进行在线下载安装即可搞定这个问题[注意要对应你电脑系统中的浏览器, ...

  9. Assert中的静态方法

    junit中的assert方法全部放在Assert类中,总结一下junit类中assert方法的分类. 1.assertTrue/False([String message,]boolean cond ...

  10. 201521123107 《Java程序设计》第6周学习总结

    第6周作业-接口.内部类与Swing 1.本周学习总结 2.书面作业 1.clone方法 1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注 ...