学习过java的小伙伴和将要学习java的小伙伴,都会遇到java中很重要的一块内容,即IO流。翻开java工具书可以发现IO流中有很多类,那么问题来了,就是,开发时该用哪个对象合适呢?或者如何选择使用对象呢?下面笔者根据自己的经验跟各位小伙伴分享下。

第一步,首先,明确IO流中有两个主要的体系,即字节输入流(InputStream)、输出流(OutputStream)和字符输入流(Reader)、输出流(Writer)。其次,明确数据的来源和数据将要到达的目的地。

第二步,明确将要操作的数据是否是纯文本数据。如果数据源是纯文本数据选Reader;数据源不是纯文本数据选择InputStream。如果数据目的地是纯文本数据就选择Writer;如果不是则选择OutputStream。

  • 数据源:
    是纯文本:Reader
    不是纯文本:InputStream
  • 数据目的地:
    是纯文本:Writer
    不是纯文本:OutputStream

第三步,明确具体的设备。即数据源是从哪个设备来的:是硬盘就加File;是键盘用System.in(是一个InputStream对象);是内存用数组;是网络用Socket流。同样目的是哪个设备:是硬盘就加File;是键盘用System.out(是一个OutoutStream对象);是内存用数组;是网络用Socket流。

明确设备:

  • 数据源:

    • 键盘:System.in
    • 硬盘:FileXXX
    • 内存:数组
    • 网络:socket socket.getInputStream();
  • 数据汇:
    • 控制台:System.out
    • 硬盘:FileXXX
    • 内存:数组
    • 网络:socket socket.getOutputStream();

第四步,明确是否还需要其他额外功能呢,例如①是否需要较高的效率,即是否需要使用缓冲区,是就加上Buffered;②是否需要转换,是,就使用转换流,InputStreamReader 和OutputStreamWriter。

明确额外功能:
1. 需要转换?是,使用转换流。InputStreamReader 和 OutputStreamWriter
2. 需要高效?是,使用缓冲区。Buffered

通过上面的四步走基本就可以确定该用哪个类了。如果小伙们看了上面讲解,还是有点似懂非懂,那么,接下来大家可以看看下面的例子。把上面的四步走带入走一遍,应该就可以相当清楚了。例子如图所示。


需求:复制一个文本文件。
1. 明确体系:
源:InputStream,Reader
目的:OutputStream,Writer
2. 明确数据:
源:是纯文本吗?是 Reader
目的:是纯文本吗?是 Writer
3. 明确设备:
源:硬盘上的一个文件。FileReader
目的:硬盘上的一个文件。FileWriter
FileReader fr = new FileReader(“a.txt”);
FileWriter fw = new FileWriter(“b.txt”);
4. 需要额外功能吗?
需要,高效,使用buffer
BufferedReader bufr = new BufferedReader(new FileReader(“a.txt”));
BufferedWriter bufw = new BufferedWriter(new FileWriter(“b.txt”));

读取磁盘录入,将数据存入到一个文件中。
1. 明确体系:
源:InputStream,Reader
目的:OutputStream,Writer
2. 明确数据:
源:是纯文本吗?是 Reader
目的:是纯文本吗?是 Writer
3. 明确设备:
源:键盘,System.in
目的:硬盘,FileWriter
InputStream in =System.in;
FileWriter fw = new FileWriter(“a.txt”);
4. 需要额外功能吗?
需要,英文源明确的体系时Reader,可是源的设备是System.in。
所以为了方便于操作文本数据,将源转成字符流。需要转换流。InputStreamReader
InputStreamReader inr = new InputStreamReader(System.in);
FileWriter fw = new FileWriter(“a.txt”);
需要高效不?需要。Buffer
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new FileWriter(“a.txt”));

注:上面讲的规律适用于IO流中比较常用的类,当然还有其他一些类需要大家个别掌握。

JavaSE学习之IO流使用技巧相关推荐

  1. JavaSE进阶:IO流

    目录 1.流的概念 2.流的分类 3.字节流 1.字节流的父类 2.文件字节流 1.ASCALL码对照表 2.文件字节输入流 3.文件字节输出流 4.文件字节流来实现文件的复制 3.字节缓冲流 1.B ...

  2. java流类图结构_java学习之IO流(学习之旅,一)

    个人在学习IO流的时候看到如下所示java 流类图结构的时候,我的感想是,这么多··处于蒙的状态. Java流类图结构 这么多,没有分类不好学,那我们就慢慢一口一口的吃,这样每天学习一点就好了,其实很 ...

  3. JavaSE进阶26 - IO流概述、字节流、字符流、转换流、缓冲流

    目录 IO概述 FileInputStream的使用 FileOutputStream使用 文件复制 文件的复制原理 代码 FileReader FileWriter 复制普通文本文件 Buffere ...

  4. zipfile中怎么关闭流_深入学习JAVA -IO流详解

    (一)IO流基本概念 Java对数据的操作是通过流的方式,io是java中实现输入输出的基础,它可以很方便的完成数据的输入输出操作,Java把不同的输入输出抽象为流,通过流的方式允许Java程序使用相 ...

  5. JAVA学习笔记—IO流

    I/O 框架 流的概念 内存与存储设备之间传输数据的通道 水(相当于数据)-> 传输水的管道(相当于流)-> 脸盆(相当于内存) 生活用水 -> 流入 家庭废水 -> 流出 流 ...

  6. 【java学习笔记-io流 文件读写和键盘读写】带缓存的输入/输出流和数据输入/输出流

    文章目录 字节流类 带缓存的输入/输出流 BufferedReader与BufferedWriter类 下面的例子程序演示了read()方法,从控制台读取字符直到用户键入"q": ...

  7. Java io流小技巧_选择用流的小规律(java)基本的io流

    选择流的规律 1 首先我们要明确源和目的 源: InputStream Reader 目的::OutputStream Write 2 我们要判断源和目的是不是纯文本 源是纯文本 :Reader 否则 ...

  8. JavaSE学习---I/O流学习分享

    I/O流概述: i:Input,以内存为基准,表示从硬盘中读取数据到内存中. o: Outerput,以内存为基准,表示将内存中的数据写到硬盘中. I/O流体系  原始流 1.原始字节流 FileIn ...

  9. Java学习:IO流篇(多种流的总结)

    一,字节流 主要用到以下两个类: 类名 作用 FileInputStream 从文件系统中的文件获取输入字节 FileOutputStream 用于将数据写入到输出流File或一个FileDescri ...

最新文章

  1. 欧洲打击洗钱 全球联合行动 178名钱骡落网
  2. (转) Java线程同步阻塞, sleep(), suspend(), resume(), yield(), wait(), notify()
  3. rtp h264打包和解包
  4. TensorSpace:超酷炫3D神经网络可视化框架
  5. SQL语句:SQLwhile(0=0)与while @@fetch_status=0.
  6. UVA - 1533Moving Pegs移动小球 (bfs加状态压缩)
  7. PyTorch常用代码段整理合集
  8. 浅谈socket网络编程函数参数(二)
  9. Spring Bean的生命周期及接口回调
  10. VC++中多线程学习(MFC多线程)二(线程的相关操作、线程间的通信)
  11. 【Pytorch】Pytorch常见的坑汇总
  12. 安卓接入高德地图3dmap黑屏问题解决
  13. 济南大学计算机控制系统,杨波-济南大学人工智能研究院
  14. MIT操作系统神课 - 6.828
  15. matlab如何画之字形,matlab怎么画星座图
  16. 前端项目-尚品会-来自b站尚硅谷视频
  17. 珍藏5年的5000款photoshop顶尖字体库,这回不用担心没有好的PS字体了!
  18. HEX编码、Base64编码
  19. Amnesia失忆症攻略(本篇+later+crowd)
  20. Android 无法播放此视频

热门文章

  1. iOS开发之FMDB
  2. 一个IP绑定多个域名(虚拟主机)设置方法
  3. Strtus2工作流程及原理
  4. 诺基亚对塞班的支持将持续到2016年
  5. Linux下的Vsftpd配置篇
  6. 一个wxWidgets判断注册表键值的函数
  7. ubuntu20.04下面matlabR2015b的夜间模式设置
  8. Hbase中的Column Family(转载)
  9. Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since
  10. pg_config executable not found