本文转自:http://www.cnblogs.com/zhxiang/archive/2011/10/14/2212496.html
编程语言的I/O类库中常常使用流这个抽象的概念,它代表任何有能力产生数据的数据源对象或时有能力接收数据的接收端对象。“流”概念源于UNIX中的管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等,它屏蔽了实际的I/O设备中处理数据的细节。 一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL。 流的方向是重要的,根据流的方向,流可以分为两类:输入流和输出流。其实输入/输出是想对于内存来说的。 实际上,流的源端和目的端可简单地看成是字节的生产者和消费者,对于输入流,可不必关心它的源端是什么,只要简单地从流中读数据,而对输出流,也可不知道它的目的端,只是简单地往流中写数据。
1: a.流:一组有序的数据序列。
2: b.字节流:数据流中最小的数据单元是字节。
3: c.字符流:数据流中最小的数据单元是字符。
一。 java.io包中的类对应两类流,
一类流直接从指定的位置(如磁盘文件或内存区域)读或写,这类流称为结点流,其他的流则称为过滤流(包装流)
过滤流:一些流可以从文件以及其他地方接收字节,另一些流可以将字节组合成更有用的数据类型。将一个已经存在的流传递给另一个流的构造方法,将这两种流结合起来,结合后的流被称为过滤流。过滤器输入流往往是以其它输入流作为它的输入源,经过过滤或处理后再以新的输入流的形式提供给用户,过滤器输出流也类似。 我们很少用单一的类来创建流对象,而是通过叠合多个对象来提供所期望的功能(即装饰器设计模式)。
java的常用输入、输出流其实都是继承自4个抽象类,分别是
基于单字节的InputStream,OutputStream类(面向字节形式的I/O)
基于双字节的Unicode代码单元的 Reader, Writer类(面向字符形式的I/O)
一旦打开输入流后,程序就可从输入流串行地读数据。从输入流读/写数据的过程一般如下:打开一个流通道-->读取/写信息-->关闭流通道。
在java平台中,有以下两种方式能获得本地平台的字符编码类型:
(a)System.getProperty("file.encoding");
(b) Charset cs=Charset.defaultCharset();
所有的输入流、输出流都可以分为字节(输入、输出)流,字符(输入、输出)流,处理字节的主要是(OutputStream/InputStream) 系列,处理字符的,主要是(Reader/Write)系列
二。以字节(Byte)为导向的输入流(InputStream系列),这几个类都可以与FileInputStream对象相连以提供有用接口:
1) ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
2) StringBufferInputStream(
在java1.1中已经弃用了
):把一个String对象作为InputStream,底层实现使用StringBuffer
3) FileInputStream:把一个文件作为InputStream,实现对文件的读取操作(文件名、文件、FileDescriptor对象)
4) PipedInputStream:实现了pipe的概念,主要在线程中使用(作为多进程中的数据源)
5) SequenceInputStream:把多个InputStream合并为一个InputStream
以字节(Byte)为导向的输出流(OutputStream系列),可以与FilterOutputStream对象相连以提供有用接口:
1) ByteArrayOutputStream:在内存中创建缓冲区,把信息存入内存中的一个缓冲区中,缓冲区初始化尺寸(可选)
2) FileOutputStream:把信息存入文件中(文件名、文件、FileDescriptor)
3) PipedOutputStream:实现了pipe的概念,主要在线程中使用(指定用于多线程的数据的目的地)
三。与之对应的(Reader/Writer)系列:
1: Reader: 与InputStream相对应,适配器InputStreamReader
2: Writer: 与OutputStream相对应,适配器为OutputStreamWriter
3: FileReader: 与FileOutputStream相对应
4: FileWriter: 与FileOurputStream相对应
5: StringReader: 无相对应的类
6: StringWriter: 与ByteArrayInputStream相对应
7: CharArrayReader: 与ByteArrayOutputStream相对应
8: CharArrayWriter: 与ByteArrayOutputStream相对应
9: PipedReader: 与PipedInputStream相对应
10: PipedWriter: 与PipedOutputStream相对应
四。两种不限导向的stream之间的转换(使用适配器类)
InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream。
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集
五。通过FilterInputStream从InputStream读取数据:
1) DataInputStream:从stream中读取基本类型(int、char,long等)数据。
2) BufferedInputStream:使用缓冲区 ,使用它可以防止每次读取都得进行实际的读操作
3) LineNumberInputStream:会记录input stream内的行数,然后可调用getLineNumber()和setLineNumber(int)
4) PushbackInputStream:很少用到,一般用于编译器开发
通过FilterOutputStream向OutputStream写入:
1) DataIOutputStream:可以按照移植方式往stream中输出基本类型(int、char,long等)数据。
2) BufferedOutputStream:使用缓冲区 ,使用它可避免每次发送数据都进行实际的写操作
3) PrintStream:产生格式化输出 ,其中DataOutputStream处理数据的存储,PrintStream处理显示
六。更改流的行为:
尽管BufferedOutputStream是FilterOutputStream的子类,但是BufferedWriter并不是FilterWriter的子类,(FilterWriter是抽象类,没有任何子类)
1) 没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader,否则使用DataInputStream
2) BufferedReader:与BufferedInputStream对应
3) LineNumberReader:与LineNumberInputStream对应
4) PushBackReader:与PushbackInputStream对应
5) BufferedWrite:与BufferedOutStream对应
6) PrintWrite:与 PrintStream对应
七。自我独立的类:RandomAccessFile:
这个类适用于有大小已知的记录组成的文件,RandomAccessFile除了实现了DataInput和DataOutput接口(DataInputStream和DataOutputStream也实现了这两个接口)之外,这个类是个完全独立的类,它拥有和别的I/O类型本质不同的行为,可以在一个文件内向前和向后移动,直接从Object派生而来。
1) 可通过RandomAccessFile对象完成对文件的读写操作
2) 在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw可读写
3) 可以直接跳到文件中指定的位置
RandomAccessFile的大部分功能(不是全部)有nio存储映射文件所取代
八.I/O流的典型使用方式:
1。缓冲输入文件
1: import java.io.BufferedReader;
2: import java.io.FileReader;
3: import java.io.IOException;
4:
5: public class BufferedInputFile {
6: public static String read(String filename) throws IOException{
7: BufferedReader in=new BufferedReader(new FileReader(filename));
8: String s;
9: StringBuilder sb=new StringBuilder();
10: while((s=in.readLine())!=null){
11: sb.append(s+"\n");
12: }
13: in.close();
14: return sb.toString();
15: }
16: public static void main(String[] args) throws IOException {
17: System.out.println(read("C:\\Users\\wubin\\workspace\\Imp\\src\\no9\
18:
19: \BufferedInputFile.java"));
20: }
21: }
2。从内存输入
1: import java.io.IOException;
2: import java.io.StringReader;
3:
4: public class MemoryTest {
5: public static void main(String[] args) throws IOException {
6: StringReader in=new StringReader(BufferedInputFile.read("C:\\Users\\wubin\
7:
8: \workspace\\Imp\\src\\no9\\BufferedInputFile.java"));
9: int c;
10: while((c=in.read())!=-1)
11: System.out.print((char)c);
12: }
13: }
3。格式化的内存输入
1: import java.io.ByteArrayInputStream;
2: import java.io.DataInputStream;
3: import java.io.IOException;
4:
5: public class FormattedMemoryInput {
6: public static void main(String[] args) throws IOException{
7: try{
8: DataInputStream in=new DataInputStream(new ByteArrayInputStream
9:
10: (BufferedInputFile.read("C:\\Users\\wubin\\workspace\\Imp\\src\\no9\
11:
12: \BufferedInputFile.java").getBytes()));
13: while(true)
14: System.out.print((char)in.readByte());
15: }catch(Exception e){
16:
17: }
18: }
19: }
1: import java.io.BufferedInputStream;
2: import java.io.DataInputStream;
3: import java.io.FileInputStream;
4: import java.io.FileNotFoundException;
5: import java.io.IOException;
6:
7: public class TestEOF {
8: public static void main(String[] args) throws IOException {
9: DataInputStream in=new DataInputStream(new BufferedInputStream(new FileInputStream
10:
11: ("C:\\Users\\wubin\\workspace\\Imp\\src\\no9\\BufferedInputFile.java")));
12: while(in.available()!=0)
13: System.out.print((char)in.readByte());
14: }
15: }
16:
4。基本文件输出
1: import java.io.BufferedReader;
2: import java.io.BufferedWriter;
3: import java.io.FileWriter;
4: import java.io.IOException;
5: import java.io.PrintWriter;
6: import java.io.StringReader;
7:
8: public class BasicFileOutput {
9: static String file="E:\\2.txt";
10: public static void main(String[] args) throws IOException {
11: BufferedReader in=new BufferedReader(new StringReader(BufferedInputFile.read("E:\
12:
13: \1.txt")));
14: PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter(file)));
15: int cout=1;
16: String s;
17: while((s=in.readLine())!=null)
18: out.println(cout++ +" "+s);
19: out.close();
20: System.out.println(BufferedInputFile.read(file));
21: }
22: }
5。存储和恢复数据
1: import java.io.BufferedInputStream;
2: import java.io.BufferedOutputStream;
3: import java.io.DataInputStream;
4: import java.io.DataOutputStream;
5: import java.io.FileInputStream;
6: import java.io.FileOutputStream;
7: import java.io.IOException;
8:
9: public class StoringAndRecoveringData {
10: public static void main(String[] args) throws IOException{
11: DataOutputStream out=new DataOutputStream(
12: new BufferedOutputStream(new FileOutputStream("E:\\1.txt")));
13: out.writeUTF("hello");
14: out.writeDouble(1.23);
15: out.writeInt(3);
16: out.close();
17: DataInputStream in=new DataInputStream(
18: new BufferedInputStream(new FileInputStream("E:\\1.txt")));
19: System.out.println(in.readUTF());
20: System.out.println(in.readDouble());
21: System.out.println(in.readInt());
22: }
23: }
6。读写随机访问文件
1: import java.io.IOException;
2: import java.io.RandomAccessFile;
3:
4: public class UsingRandomAccessFile {
5: static String file="E:\\1.txt";
6: static void display() throws IOException{
7: RandomAccessFile rf=new RandomAccessFile(file,"r");
8: for(int i=0;i<7;i++)
9: System.out.println("Value "+i+": "+rf.readDouble());
10: System.out.println(rf.readUTF());
11: rf.close();
12: }
13: public static void main(String[] args) throws IOException{
14: RandomAccessFile rf=new RandomAccessFile(file,"rw");
15: for(int i=0;i<7;i++)
16: rf.writeDouble(i*1.414);
17: rf.writeUTF("The end of the file");
18: rf.close();
19: display();
20: rf=new RandomAccessFile(file,"rw");
21: rf.seek(5*8);
22: rf.writeDouble(42.0001);
23: rf.close();
24: display();
25: }
26: }
PipedInputStream,PipedOutputStream,PipedReader和PipedWriter的价值体现在多线程上(管道流用于任务之间的通信)
分享到:
相关推荐
编程语言的I/O类库中常常使用流这个抽象的概念,它代表任何有能力产生数据的数据源对象或时有能力接收数据的接收端对象,本文为大家介绍Java中I/O系统基础知识
算法: 剑指 Offer 题解 ...Java I/O 系统设计: 系统设计基础 分布式 集群 攻击技术 缓存 消息队列 面向对象: 面向对象思想 设计模式 工具: Git Docker 构建工具 正则表达式 编码实践: 代码可读性 代码风格规范
《Java程序设计》系统地介绍了Java程序语言的知识,全书分为13章,包括Java集成开发环境,语法基础,对象和类的基本概念,数组,JavaI/O体系,Java多线程机制,图形用户界面、容器等。在介绍基础知识的同时,《Java...
几乎涵盖了 Java 基础面向对象,封装继承多态,I/O 流,多线程,网络,数据库的所有知识 项目用到的主要技术 利用阿里云的短信API服务提供登录注册时的短信发送 利用 Java Mail 实现发送邮件 用户密码采用 MD5 加盐...
第2篇为核心篇,包括字符串处理、集合类、使用异常处理机制、掌握Java的I/O技术、精通多线程技术、枚举与泛型;第3篇为高级篇,包括Swing基础知识、JDBC技术、Swing高级组件、GUI事件处理机制、网络程序设计;第4篇...
主要包括JDK和Jcreator的安装与初步使用,Java语言基础知识的运用,程序流程控制,数组,面向对象的编程,接口与包,Java图形用户界面设计与事件处理,Java I/O系统,异常处理,多线程程序设计等20多个实验的程序...
其实大部分语言的基础知识都是大同小异,如果之前已经学习过其他语言如C、C++,那学习这部分会更快。 这部分主要学习的内容有:基本程序结构,类与对象,接口,泛型,反射,集合,异常与调试, Java 网络编程, ...
JavaGuide 【Java学习+面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。 介绍 对于 Java 初学者来说: 本文档倾向于给你提供一个比较详细的学习路径,让你对于Java整体的知识体系...Java 基础知识疑难点/
Java基础知识:数据类型、关键字、面向对象、集合框架、异常处理等 Java核心技术:I/O、多线程、网络编程、反射、泛型等 Java虚拟机:内存模型、垃圾收集器、类加载机制等 Java企业级开发:Spring、Hibernate、MyBatis等...
有经验的开发者,希望重温Java基础知识或参考韩顺平的教学风格。 使用场景及目标 初学者入门:为无编程背景的学员提供Java语言的基础知识。 课程学习:作为计算机科学课程的辅助教材,帮助学生深入理解Java。 技能...
本书全面、系统、循序渐进地讲述了Java语言的基础知识,涵盖了用来编写、编译、测试和调试Java程序以及提高编程技巧所需的全部内容。书中包含了Java 2, 版本1.3中新增的特征,其中最重要的是assert关键字、基于通道...
与此相反,像java所使用的这种并发系统会共享内存或I/O这样的资源,因此编程编写多线程程序最基本的困难在于,协调不同线程驱动的任务之间这些资源的使用,以便使得这些资源不会同时被多个任务访问。
leetcode题库 ...I/O :light_bulb: 系统设计 系统设计基础 分布式 集群 攻击技术 缓存 消息队列 :wrench: 工具 Git Docker 构建工具 正则表达式 :watermelon: 编码实践 代码可读性 代码风格规范 :memo: 后记
本书以Java语言面向对象的编程理念为出发点,循序渐进地介绍Java语言...通过融入Java面向对象的编程思想,使读者在学习理论知识的同时,初步掌握面向对象的系统分析、设计与开发能力,为大型软件的设计和开发奠定基础。
有服务端和客户端,可以进行实时的通信,主要用到的是JavaS的基础知识,包括Swing,线程,I/O流等,通信采用XML文档传输技术,开发量较小,也只能算是一个简单的聊天系统,后续的更多功能还在开发中!
J2SE平台Java程序设计 Java AWT图形界面程序开发,Swing图形程序设计, Socket网络应用程序设计,对象序列化,Java 常用数据结构,Applet,高级I/O流和文件编程,多线程程序设计 熟练掌握J2SE平台的Java程序设计技能 ...
第十四章 标准I/O流与文件.............84 第十五章 网络编程.89 Tiger学习笔记..................94 第一章 Java5.0新特性.......................94 第二章 基础知识.....96 第三章 泛型...........101 第四章 ...
第2篇为提高篇(第9章~第14章),主要介绍异常处理、I/O处理技术、线程技术、JDBC技术、Java Swing等一些高级开发技术,在本篇的最后还通过一个进销存管理系统对前面章节的内容进行了实践;第3篇为实例篇(第15章~第...
2. 一 基础知识 2.1. 配置环境 2.2. Java中基本概念 3. 二 定义,关键字和类型 3.1. 注释的三种形式 3.2. Java代码中的“;”、“{}”、“ ” 3.3. 标识符 3.4. 数据类型 3.5. 命名规则 4. 三 表达式和控制流 ...
4.3 I/O及网络相关优化 4.4 数据应用优化 4.5 其他优化 4.6 本章小结 第5章 Java并行程序优化建议 5.1 并行程序优化概述 5.2 锁机制对比 5.3 增加程序并行性 5.4 JDK类库使用 5.5 本章小结 第6章 JVM性能...