一、流的分类

1.输入流和输出流

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

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

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

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

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

,无法直接创建实例。

2.字节流和字符流

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

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

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

3.节点流和处理流

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

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

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

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

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

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

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

地发生变化。

二、流的概念模型

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

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

 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[];
int len = ; while ((len = fis.read(buf)) > ) {
//取出buf中的字节,将字节数组转换成字符串输入
System.out.println(new String(buf, , len));
}
fis.close();
} }

运行结果:

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[];
int len = ; while ((len = fis.read(buf)) > ) {
//取出buf中的字节,将字节数组转换成字符串输入
System.out.println(new String(buf, , len));
}
fis.close();
} }

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

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

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

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

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

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

 package IO;

 import java.io.FileReader;
import java.io.IOException; public class FileReaderTest { public static void main(String[] args) { try (
// 创建字符输入流
FileReader fr = new FileReader(
"D:\\Java\\adt-bundle-windows-x86_64_20140101\\project\\fsad\\src\\IO\\FileReaderTest.java")) {
// 创建一个长度为32的字符数组
char[] cbuf = new char[32];
int len = 0; while ((len = fr.read(cbuf)) > 0) {
System.out.println(new String(cbuf, 0, len));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }

运行结果:

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
ock
e.printStackTrace(); }
} }

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

 package IO;

 import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class FileOutputStreamTest { public static void main(String[] args) { try {
// 创建字节输入流
FileInputStream fis = new FileInputStream(
"D:\\Java\\adt-bundle-windows-x86_64_20140101\\project\\fsad\\src\\IO\\FileOutputStreamTest.java");
// 创建字节输出流
FileOutputStream fos = new FileOutputStream("newFile.txt"); byte[] buf = new byte[32];
int len = 0; while ((len = fis.read(buf)) > 0) {
fos.write(buf, 0, len);
}
} catch (IOException e) { e.printStackTrace();
}
System.out.println("写入成功!");
}
}

运行结果:

写入成功!

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

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

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

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

 package IO;

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; public class KeyinTest { public static void main(String[] args) { // 将System.in对象转换成Reader对象,再包装成BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String buffer = null; try {
while ((buffer = br.readLine()) != null) {
//如果读取到的字符串时“exit”,则程序退出
if (buffer.equals("exit")) {
System.exit(1);
}
System.out.println("输入的内容为:" + buffer);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }

运行结果:

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

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

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

Java——(九)IO流的更多相关文章

  1. java的Io流学习

    Java中io流的学习(一)File:https://blog.csdn.net/qq_41061437/article/details/81672859 Java中io流的学习(二)FileInpu ...

  2. java的IO流

    java的IO流继承四大抽象类分别是字节流 inputStream outputStream与字符流 read write.怎么理解记忆很重要. 直接连接读写对象的是结点流,例如对文件读取字节类的名字 ...

  3. Java基础——IO流

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

  4. 【Java】IO流简单分辨

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/5827509.html Java的IO流体系十分庞大,并且体系层次稍复杂,很容易记混或记错.在此,我把平时经常用 ...

  5. Java - 文件(IO流)

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

  6. Java中IO流的总结

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

  7. JAVA中IO流总结

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42119261 我想你对JAVA的IO流有所了解,平时使用的 ...

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

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

  9. Java基础IO流(二)字节流小案例

    JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...

  10. Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream)

    Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我已经分享过很多的J ...

随机推荐

  1. HTML5峰会小记

    5259月228日,在大连理工的伯川图书馆举办了一次HTML5峰会,小记一下这次峰会的内容. 名为HTML5峰会,其本质就是一次各大赞助商的轮番登场,产品介绍间隙插播一下HTML5.但是并不影响这次峰 ...

  2. 常见排序算法(JS版)

    常见排序算法(JS版)包括: 内置排序,冒泡排序,选择排序,插入排序,希尔排序,快速排序(递归 & 堆栈),归并排序,堆排序,以及分析每种排序算法的执行时间. index.html <! ...

  3. 10个WordPress增强型编辑器大检阅

    Wordpress之所以优秀不在于其本身,而在于无数的插件开发者和性能优化人员.使用过Wordpress的人都知道,WP本身的编辑器极其简陋,就连简单的表格编辑也没有,可能吧这篇文章将介绍一些免费的增 ...

  4. jQuery设置按钮被点击状态

    js和jquery如何使按钮失效,很简单,只要设置disabled属性为true即为不可用状态即可 1.JS方法一: document.getElementByIdx("btn") ...

  5. Android的系统架构

    转自Android的系统架构 从上图中可以看出,Android系统架构为四层结构,从上层到下层分别是应用程序层.应用程序框架层.系统运行库层以及Linux内核层,分别介绍如下:     1)应用程序层 ...

  6. PYTHON文本处理指南之日志LOG解析

    处理特定字段的内容,并指指定条件输出. 注意代码中用一个方法列表,并且将方法参数延后传递. GOOGLE作过PYTHON代码的水平,就是不一样呀. 希望能学到这种通用的技巧. 只是,英文PDF看起来有 ...

  7. Android开源项目发现--- 工具类图片缓存篇(持续更新)

    1. Android-Universal-Image-Loader 图片缓存 目前使用最广泛的图片缓存,支持主流图片缓存的绝大多数特性. 项目地址:https://github.com/nostra1 ...

  8. Apache Hadoop RPC Authentication 安全绕过漏洞

    漏洞名称: Apache Hadoop RPC Authentication 安全绕过漏洞 CNNVD编号: CNNVD-201308-425 发布时间: 2013-08-28 更新时间: 2013- ...

  9. Linux Kernel空指针引用本地拒绝服务漏洞(CVE-2013-5634)

    漏洞版本: Linux kernel 漏洞描述: BUGTRAQ ID: 61995 CVE(CAN) ID: CVE-2013-5634 Linux Kernel是Linux操作系统的内核. 适用于 ...

  10. HDU -- 4496

    D-City Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Subm ...