基于java洗浴中心管理系统_JavaIO流详解

基于java洗浴中⼼管理系统_JavaIO流详解
流的概念和作⽤
学习Java IO,不得不提到的就是JavaIO流。
流是⼀组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,⽅便更直观的进⾏数据操作。
IO流的分类
根据处理数据类型的不同分为:字符流和字节流
根据数据流向不同分为:输⼊流和输出
字符流和字节流
字符流的由来: 因为数据编码的不同,⽽有了对字符进⾏⾼效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。字节流和字符流的区别:
(1)读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,⼀次可能读多
个字节。
(2)处理对象不同:字节流能处理所有类型的数据(如图⽚、avi等),⽽字符流只能处理字符类型的数据。
(3)字节流在操作的时候本⾝是不会⽤到缓冲区的,是⽂件本⾝的直接操作的;⽽字符流在操作的时候下后是会⽤到缓冲区的,是通过缓冲区来操作⽂件,我们将在下⾯验证这⼀点。
结论:优先选⽤字节流。⾸先因为硬盘上的所有⽂件都是以字节的形式进⾏传输或者保存的,包括图⽚等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使⽤⼴泛。
输⼊流和输出流
对输⼊流只能进⾏读操作,对输出流只能进⾏写操作,程序中需要根据待传输数据的不同特性⽽使⽤不同的流。
Java流类图结构:
Java IO流对象
1. 输⼊字节流InputStream
定义和结构说明:
从输⼊字节流的继承图可以看出:
InputStream 是所有的输⼊字节流的⽗类,它是⼀个抽象类。
ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地⽂件中读取数据。PipedInputStream 是从与其它线程共⽤的管道中读取数据,与Piped 相关的知识后续单独介绍。
ObjectInputStream 和所有FilterInputStream的⼦类都是装饰流(装饰器模式的主⾓)。意思是FileInputStream类可以通过⼀个String路径名创建⼀个对象,FileInputStream(String name)。⽽DataInputStream必须装饰⼀个类才能返回⼀个对
象,DataInputStream(InputStream in)。如下图⽰:
实例操作演⽰:
案例 】读取⽂件内容
注意:该⽰例中由于b字节数组长度为1024,如果⽂件较⼩,则会有⼤量填充空格。我们可以利⽤in.read(b);的返回值来设计程序,如下案例:
【案例】读取⽂件内容
注意:观察上⾯的例⼦可以看出,我们预先申请了⼀个指定⼤⼩的空间,但是有时候这个空间可能太⼩,有时候可能太⼤,我们需要准确的⼤⼩,这样节省空间,那么我们可以这样做:
【案例】读取⽂件内容
【案例】逐字节读
注意:上⾯的⼏个例⼦都是在知道⽂件的内容多⼤,然后才展开的,有时候我们不知道⽂件有多⼤,这种情况下,我们需要判断是否独到⽂件的末尾。
【案例】字节流读取⽂件
注意:当读到⽂件末尾的时候会返回-1.正常情况下是不会返回-1的。
【案例】DataInputStream类
【案例】PushBackInputStream回退流操作
2. 输出字节流OutputStream
定义和结构说明:
IO 中输出字节流的继承图可见上图,可以看出:
OutputStream 是所有的输出字节流的⽗类,它是⼀个抽象类。
ByteArrayOutputStream、FileOutputStream是两种基本的介质流,它们分别向Byte 数组、和本地⽂件中写⼊数据。PipedOutputStream 是向与其它线程共⽤的管道中写⼊数据,
ObjectOutputStream 和所有FilterOutputStream的⼦类都是装饰流。具体例⼦跟InputStream是对应的。
实例操作演⽰:
【案例】向⽂件中写⼊字符串
你也可以⼀个字节⼀个字节的写⼊⽂件:
【案例】逐字节写⼊⽂件
【案例】向⽂件中追加新内容
【案例】复制⽂件
【案例】使⽤内存操作流将⼀个⼤写字母转化为⼩写字母
【案例】验证管道流:进程间通信
【案例】DataOutputStream类⽰例
【案例】ZipOutputStream类
先看⼀下ZipOutputStream类的继承关系
java.lang.Object
java.io.OutputStream
java.io.FilterOutputStream
java.util.zip.DeflaterOutputStream
java.util.zip.ZipOutputStream
【案例】ZipOutputStream类压缩多个⽂件
【案例】ZipFile类展⽰
【案例】解压缩⽂件(压缩⽂件中只有⼀个⽂件的情况)
【案例】ZipInputStream类解压缩⼀个压缩⽂件中包含多个⽂件的情况
3.字节流的输⼊与输出的对应图⽰
图中蓝⾊的为主要的对应部分,红⾊的部分就是不对应部分。紫⾊的虚线部分代表这些流⼀般要搭配
使⽤。从上⾯的图中可以看出Java IO 中的字节流是极其对称的。哲学上讲“存在及合理”,现在我们看看这些字节流中不太对称的⼏个类吧!
4.⼏个特殊的输⼊流类分析
LineNumberInputStream
主要完成从流中读取数据时,会得到相应的⾏号,⾄于什么时候分⾏、在哪⾥分⾏是由改类主动确定的,并不是在原始中有这样⼀个⾏号。在输出部分没有对应的部分,我们完全可以⾃⼰建⽴⼀个LineNumberOutputStream,在最初写⼊时会有⼀个基准的⾏号,以后每次遇到换⾏时会在下⼀⾏添加⼀个⾏号,看起来也是可以的。好像更不⼊流了。
PushbackInputStream
其功能是查看最后⼀个字节,不满意就放⼊缓冲区。主要⽤在编译器的语法、词法分析部分。输出部分的BufferedOutputStream ⼏乎实现相近的功能。
StringBufferInputStream
已经被Deprecated,本⾝就不应该出现在InputStream部分,主要因为String 应该属于字符流的范围。
已经被废弃了,当然输出部分也没有必要需要它了!还允许它存在只是为了保持版本的向下兼容⽽已。
SequenceInputStream
可以认为是⼀个⼯具类,将两个或者多个输⼊流当成⼀个输⼊流依次读取。完全可以从IO 包中去除,还完全不影响IO 包的结构,却让其
更“纯洁”――纯洁的Decorator 模式。
【案例】将两个⽂本⽂件合并为另外⼀个⽂本⽂件
PrintStream
也可以认为是⼀个辅助⼯具。主要可以向其他输出流,或者FileInputStream 写⼊数据,本⾝内部实现还是带缓冲的。本质上是对其它流的综合运⽤的⼀个⼯具⽽已。⼀样可以踢出IO 包!和System.out 就是PrintStream 的实例!
【案例】使⽤PrintStream进⾏输出
【案例】使⽤PrintStream进⾏格式化输出
【案例】使⽤OutputStream向屏幕上输出内容
【案例】输⼊输出重定向
【案例】使⽤重定向
【案例】System.in重定向
5.字符输⼊流Reader
定义和说明:
在上⾯的继承关系图中可以看出:
Reader 是所有的输⼊字符流的⽗类,它是⼀个抽象类。
CharReader、StringReader是两种基本的介质流,它们分别将Char 数组、String中读取数据。PipedReader 是从与其它线程共⽤的管道中读取数据。
BufferedReader 很明显就是⼀个装饰器,它和其⼦类负责装饰其它Reader 对象。
FilterReader 是所有⾃定义具体装饰流的⽗类,其⼦类PushbackReader 对Reader 对象进⾏装饰,会增加⼀个⾏号。
InputStreamReader 是⼀个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader可以说是⼀个达到此功能、常⽤的⼯具类,在其源代码中明显使⽤了将FileInputStream 转变为Reader 的⽅法。我们可以从这个类中得到⼀定的技巧。Reader 中各个类的⽤途和使⽤⽅法基本和InputStream 中的类使⽤⼀致。后⾯会有Reader 与InputStream 的对应关系。
实例操作演⽰:
【案例】从⽂件中读取内容
注意:当然最好采⽤循环读取的⽅式,因为我们有时候不知道⽂件到底有多⼤。
【案例】以循环⽅式从⽂件中读取内容
【案例】BufferedReader的⼩例⼦
注意:BufferedReader只能接受字符流的缓冲区,因为每⼀个中⽂需要占据两个字节,所以需要将System.in这个字节输⼊流变为字符输⼊流,采⽤:
BufferedReader buf = new BufferedReader(newInputStreamReader(System.in));
下⾯是⼀个实例:
【案例】Scanner类实例
【案例】Scanner类从⽂件中读出内容
6.字符输出流Writer
定义和说明:
在上⾯的关系图中可以看出:
Writer 是所有的输出字符流的⽗类,它是⼀个抽象类。
CharArrayWriter、StringWriter 是两种基本的介质流,它们分别向Char 数组、String 中写⼊数据。
PipedWriter 是向与其它线程共⽤的管道中写⼊数据,
BufferedWriter 是⼀个装饰器为Writer 提供缓冲功能。
PrintWriter 和PrintStream 极其类似,功能和使⽤也⾮常相似。
OutputStreamWriter 是OutputStream 到Writer 转换的桥梁,它的⼦类FileWriter 其实就是⼀个实现此功能的具体类(具体可以研究⼀SourceCode)。功能和使⽤和OutputStream 极其类似,后⾯会有它们的对应图。
实例操作演⽰:
【案例】向⽂件中写⼊数据
注意:这个例⼦上之前的例⼦没什么区别,只是你可以直接输⼊字符串,⽽不需要你将字符串转化为字节数组。当你如果想问⽂件中追加内容的时候,可以使⽤将上⾯的声明out的哪⼀⾏换为:
Writer out =new FileWriter(f,true);
这样,当你运⾏程序的时候,会发现⽂件内容变为:hellohello如果想在⽂件中换⾏的话,需要使⽤“\r\n”⽐如将str变为String
str="\r\nhello";这样⽂件追加的str的内容就会换⾏了。
7.字符流的输⼊与输出的对应
8.字符流与字节流转换
转换流的特点:
(1)其是字符流和字节流之间的桥梁

本文发布于:2024-09-21 10:41:24,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/95072.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:字节   字符   部分   案例   输出
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议