一、流的分类

1.输入流和输出流

  按照流的流向来分,可以分为输入流和输出流

  • 输入流:只能从中读取数据,而不能向其写入数据。
  • 输出流:只能向其写入数据,而不能从中读取数据。

  此处的输入、输出涉及一个方向的问题,数据从内存到硬盘,通常称为输出流。(即这里的

输入、输出都是从程序运行所在内存的角度来划分的)。Java的输入流主要由InputStream和

Reader作为基类,而输出流则要由OutputStream和Writer作为基类。它们都是一些抽象基类

,无法直接创建实例。

2.字节流和字符流

  字节流和字符流的用法几乎一样,只是它们所操作的数据单元不同,字节流操作的数据单元

是8位,而字符流操作的数据单元是16位。字节流要由InputStream和OutputStream作为基类

,而字符流则要由Reader和Writer作为基类。

3.节点流和处理流

  按照流的角色来分,可以分为节点流和处理流。

  可以从向一个特定的IO设备读/写数据的流称为节点流,节点流也被称为低级流。当使用节点

流进行输入/输出时,程序直接连接到实际的数据源,和实际的输入/输出节点连接。

  处理流则用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能。处

理流也被称为高级流和包装流。

  使用处理流的一个明显的好处是:只要使用相同的处理流,程序就可以采用完全相同的输入/

输出代码来访问不同的数据源,随着处理流所包装节点流的变化,程序实际所访问的数据源也相应

地发生变化。

二、流的概念模型

  • InputStream/Reader:所有输入流的基类,前者是字节输入流,后者是字符输入流。
  • OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流。

  下面程序示范了使用FileInputStream来读取自身的效果:

 1 package IO;
 2
 3 import java.io.FileInputStream;
 4 import java.io.IOException;
 5
 6 public class FileInputStreamTest {
 7
 8     public static void main(String[] args) throws IOException {
 9
10         //创建字节输入流
11         FileInputStream fis = new FileInputStream("D:\\Java\\adt-bundle-windows-x86_64_20140101\\project\\fsad\\src\\IO\\FileInputStreamTest.java");
12
13         //创建一个长度为1024的字节数组
14         byte[] buf = new byte[1024];
15         int len = 0;
16
17         while ((len = fis.read(buf)) > 0 ) {
18             //取出buf中的字节,将字节数组转换成字符串输入
19             System.out.println(new String(buf, 0, len));
20         }
21         fis.close();
22     }
23
24 }

运行结果:

package IO;import java.io.FileInputStream;
import java.io.IOException;public class FileInputStreamTest {public static void main(String[] args) throws IOException {//创建字节输入流FileInputStream fis = new FileInputStream("D:\\Java\\adt-bundle-windows-x86_64_20140101\\project\\fsad\\src\\IO\\FileInputStreamTest.java");//创建一个长度为1024的字节数组byte[] buf = new byte[1024];int len = 0;while ((len = fis.read(buf)) > 0 ) {//取出buf中的字节,将字节数组转换成字符串输入System.out.println(new String(buf, 0, len));}fis.close();}}

  上面程序创建了一个长度为1024的字节数组来读取该文件,实际上该Java源文件的长度还不到1024

字节,也就是说,程序只需执行一次read()方法可读取全部内容。但如果创建较小长度的字节数组,程序

运行时在输出中文注释时就可能出现乱码,这是因为文件保存时采用GBK编码方式,在这种方式下,每个

中文字符占2个字节,如果read()方法读取时只读到了半个中文字符,这将导致乱码。

  Java7改写了所有的IO资源类,它们都实现了AutoCloseable接口,因此都可以通过自动关闭资源

的try语句来关闭这些IO流。下面程序使用了FileReader来读取文件本身。

 1 package IO;
 2
 3 import java.io.FileReader;
 4 import java.io.IOException;
 5
 6 public class FileReaderTest {
 7
 8     public static void main(String[] args) {
 9
10         try (
11         // 创建字符输入流
12         FileReader fr = new FileReader(
13                 "D:\\Java\\adt-bundle-windows-x86_64_20140101\\project\\fsad\\src\\IO\\FileReaderTest.java")) {
14             // 创建一个长度为32的字符数组
15             char[] cbuf = new char[32];
16             int len = 0;
17
18             while ((len = fr.read(cbuf)) > 0) {
19                 System.out.println(new String(cbuf, 0, len));
20             }
21         } catch (IOException e) {
22             // TODO Auto-generated catch block
23             e.printStackTrace();
24         }
25     }
26
27 }

运行结果:

package IO;import java.io.Fi
leReader;
import java.io.IOExce
ption;public class FileReade
rTest {public static void m
ain(String[] args) {try (// 创建字符输入流FileReader fr =new FileReader("D:\\Java\
\adt-bundle-windows-x86_64_20140
101\\project\\fsad\\src\\IO\\Fil
eReaderTest.java")) {// 创建一
个长度为32的字符数组char[] cbuf = ne
w char[32];int len = 0;while ((len = fr.read(cbuf))
> 0) {System.out.println(n
ew String(cbuf, 0, len));}} catch (IOException e) {// TODO Auto-generated catch bl
ocke.printStackTrace();}}}

  下面程序使用FileInputStream来执行输入,并使用FileOutputStream来执行输出。

 1 package IO;
 2
 3 import java.io.FileInputStream;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6
 7 public class FileOutputStreamTest {
 8
 9     public static void main(String[] args) {
10
11         try {
12             // 创建字节输入流
13             FileInputStream fis = new FileInputStream(
14                     "D:\\Java\\adt-bundle-windows-x86_64_20140101\\project\\fsad\\src\\IO\\FileOutputStreamTest.java");
15             // 创建字节输出流
16             FileOutputStream fos = new FileOutputStream("newFile.txt");
17
18             byte[] buf = new byte[32];
19             int len = 0;
20
21             while ((len = fis.read(buf)) > 0) {
22                 fos.write(buf, 0, len);
23             }
24         } catch (IOException e) {
25
26             e.printStackTrace();
27         }
28         System.out.println("写入成功!");
29     }
30 }

运行结果:

写入成功!

  下面以获取键盘输入为例来介绍转换流。Java使用System.in代表标准输入,即键盘输入,但这个标准输

入流是InputStream类的实例,使用不太方便,而且键盘输入的内容都是文本,所以可以使用InputStreamReader

将其转换成字符输入流Reader,再将普通的Reader包装成BufferedReader,利用BufferedReader的readLine()方法

可以一次读取一行内容。程序如下:

 1 package IO;
 2
 3 import java.io.BufferedReader;
 4 import java.io.IOException;
 5 import java.io.InputStreamReader;
 6
 7 public class KeyinTest {
 8
 9     public static void main(String[] args) {
10
11         // 将System.in对象转换成Reader对象,再包装成BufferedReader
12         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
13
14         String buffer = null;
15
16         try {
17             while ((buffer = br.readLine()) != null) {
18                 //如果读取到的字符串时“exit”,则程序退出
19                 if (buffer.equals("exit")) {
20                     System.exit(1);
21                 }
22                 System.out.println("输入的内容为:" + buffer);
23             }
24         } catch (IOException e) {
25             // TODO Auto-generated catch block
26             e.printStackTrace();
27         }
28     }
29
30 }

运行结果:

黑马程序员
输入的内容为:黑马程序员
exit

  BufferedReader流具有缓冲功能,它可以一次读取一行文本——以换行符为标志,如果没有读到

换行符则程序阻塞,等到读到换行符为止。

转载于:https://www.cnblogs.com/xiongxuesong/p/4577215.html

Java——(九)IO流相关推荐

  1. Java入门——IO流

    一.File类的使用 1.1 File类的实例化 java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关 File 能新建.删除.重命名文件和目录,但File 不能访问文件内容本身. ...

  2. JAVA基础 IO流技术学习笔记

    目录 一.IO 流技术介绍 1.1  什么是IO? 1.2  流的概念 1.3  数据源 1.3.1 什么是数据源? 1.3.2数据源的分类 二.第一个简单的IO流程序 三.IO流经典写法(适用于任何 ...

  3. Java基础—IO流

    第一讲   IO概述 1. 流的概念 IO流即InputOutput的缩写,在Java中IO流用来处理设备之间的数据传输,Java对数据的操作是通过IO流的方式, 我们可以把IO流抽象的当作一根管道, ...

  4. java数据通道抽象为流_【java】IO流

    对于java的IO流的理解很长时间来都是很乱,包括学习其他的语言对这一块知识也都算是一个盲点.更多的时候一提到读取保存数据就是使用数据库.这一次学习了IO流,自己又解决了一个很大的盲点. IO流为我们 ...

  5. 第15章-输入/输出 --- 理解Java的IO流

    (一)理解Java的IO流 JAVA的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作,在Java中把不同的输入/输出(键盘.文件.网络连接等)抽象表述为"流"( ...

  6. Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)

    Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...

  7. Java中IO流的总结

    有关Java中IO流总结图 流分类 按方向分 输入流 输出流 按单位分 字节流 字符流 按功能分 节点流 处理流(过滤流) 其他 所有的流继承与这四类流:InputSteam.OutputStream ...

  8. Java 的 IO 流

    接着上一篇的 "Java 的 File 类" 的随笔,在File类的基础上,我们就走进Java的IO流吧. 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的 ...

  9. java中io流是类吗_Java中的IO流

    今天刚刚看完java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬板.内存.键盘等处理 ...

  10. Java - 文件(IO流)

    Java - 文件 (IO) 流的分类:     > 文件流:FileInputStream | FileOutputStream | FileReader | FileWriter     & ...

最新文章

  1. 智能合约重构社会契约(7)以太坊总结
  2. 一个基于xml的超级orm框架-世界是由懒人创造的。
  3. 嵌入式系统笔录(1)-嵌入式系统内核
  4. 【原创】Windows下使用 Eclipse 管理 RabbitMQ 源码之问题解决
  5. 【博客话题】技术生涯中的出与入
  6. mysql显错注入,SQL注入:显错注入
  7. php 字符符转整数
  8. select、bash函数初识及rpm命令详解
  9. 2013下半年(11月)信息系统项目管理师考试题型分析(综合知识、案例分析、论文)...
  10. NSURLErrorDomain 对照
  11. Oracle中查询树结构start with...connect by prior子句用法
  12. 在SharePoint 2013中显示“以其他用户身份登录”
  13. Pyqt5_QPushButton
  14. Java知识点总结(JavaIO-File类)
  15. 空间相关分析(一) 空间权重矩阵
  16. 【Red5流媒体服务器搭建】
  17. 信安从业者认证一览【建议收藏】
  18. 视觉/视觉惯性SLAM最新综述:领域进展、方法分类与实验对比
  19. Volatility3内存取证工具使用详解
  20. Axis1.4 远程命令执行(CVE-2019-0227)复现

热门文章

  1. YDOOK:ANSYS 进行电磁场仿真的第三步:施加边界条件和载荷
  2. ftp 报错 227 Entering Passive Mode (192,168,169,141,213,232)
  3. QtWebApp的使用【在Qt中搭建HTTP服务器】(一)
  4. 超详细的Latex快速基础入门 (第二节)【关于latex命令的一些知识】
  5. Rust本地化实现 —— fluent
  6. pci 1751 java_PCI-1751快速安装使用手册.PDF
  7. 20个Mac软件下载常用的经典网站
  8. Serialize Your Deck with Positron [XML Serialization, XSD, C#]
  9. 求职过程中展示您的社交技巧
  10. 解决笔记本WIFI共享网络给黑群晖