---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
一.IO(Input Output)流
IO流用来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中
流按操作数据分为两种:字节流和字符流(在IO内设置码表)
流按流向分为:输入流,输出流
二.IO流常用基类
字节流的抽象基类
InputStream,OutputStream
字符流的抽象基类
Reader,Writer
注:有这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
如:InputStream的子类FileInputStream
如:Reader的子类FileReader
三.FileWriter和FileReader
(1)既然IO流是用于操作数据的,那么数据的最常见体现形式是:文件
那么先以操作文件为主来演示
找到一个专门用于操作文件的Writer子类对象:FileWriter,
后缀名为父类名,前缀名是该流对象的功能
代码示例:
import java.io.*;
class FileWriterDemo
{
publicstatic void main(String[] args) throws IOException
{
show_1();
}
publicstatic void show_1() throws IOException
{
//创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件
//而该文件会被创建到指定文件目录下,如果该目录下已有同名文件,将被覆盖
FileWriterfw = new FileWriter("1.txt");
//调用write方法,将字符串写入流中。
fw.write("我爱你");
//刷新流中的数据
//将数据刷新到指定文件中。
fw.flush();
//关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据
//将数据刷新到指定文件中
//和flush区别:flush刷新后,流还可以用;close刷新后,将会关闭流
fw.close();
}
}
(2)文件的续写
FileWriter(String fileName, boolean append)
根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
append - 一个 boolean 值,如果为 true,则将数据写入文件末尾处,而不是写入文件开始处。
Window中的换行是’\r\n’,在linx中的换行是’\n’.
(3)读取数据的两种方式
//第一种方式:读一个写一个
intch = 0;
while((ch= fr.read())!=-1)
{
sop((char)ch);
}
//第二中方法:先读入数组中再输出
char[]arr = new char[1024];
int num = 0;
while((num= fr.read(arr))!=-1)
{
sop(newString(arr,0,num));
}
四.IO异常处理方式
try catch finally 方式来处理
import java.io.*;
class FileWriter2
{
publicstatic void main(String[] args) {
show();
}
publicstatic void sop(Object obj){
System.out.println(obj);
}
publicstatic void show(){
FileWriter fw = null;
//闭合代码块中的,其他的代码块是不能访问的,所以要在外创建应用
try{
fw= new FileWriter("e:\\Demo.txt");
//在window系统中,目录分隔符需要用\\,
fw.write("abc");
}
catch(IOException e){
sop(e.toString());
}
finally{
try{
if(fw!=null)//如果不为空,则关闭这个流
fw.close();//只要是涉及到底层资源的调用,都是要处理异常的
}
catch(IOException e){
sop("写入关闭失败!");
}
}
}
}
五.字符流的缓冲区
(1)缓冲区的出现了对数据的读写效率
对应类
BufferedWriter
BufferedReader
缓冲区要结合流才可以使用
在流的基础上对流的功能进行了增强
跨平台换行符:newLine()
【readLine的原理】
无论是读一行,获取读取对个字符其实最终都是在硬盘上一个一个读取,最终使用的还是read方法一次读一个的方法,当读到\r\n时就读完了。
代码示例:
import java.io.*;
class BufferedDemo
{
publicstatic void main(String[] args) throws IOException{
//bufWri();
bufRea();
}
publicstatic void bufWri() throwsIOException{
//创建一个字符写入流对象
FileWriterfw = new FileWriter("E:\\1.txt");
//为了提高字符写入流效率,加入了缓冲技术
//只要将所需要被提高效率的流对象作为参数传递给缓冲区中的构造函数中
BufferedWriterbufw = new BufferedWriter(fw);
for(int x = 0;x<10;x++){
bufw.write("sdaaaf");
bufw.newLine();//换行,跨平台的
bufw.flush();
}
}
publicstatic void bufRea() throws IOException{
//创建一个字符写入流对象
FileReaderfr = new FileReader("E:\\1.txt");
//为了提高字符写入流效率,加入了缓冲技术
//只要将所需要被提高效率的流对象作为参数传递给缓冲区中的构造函数
BufferedReaderbufr = new BufferedReader(fr);
Stringline = null;
//该缓冲区提供了一个一次读一行的方法readLine,方便与对文本
//数据的获取,当换回null时,表示读到文件末尾。
while((line = bufr.readLine()) != null){
sop(line);
}
}
publicstatic void sop(Object obj){
System.out.println(obj);
}
}
(2)LineNumberReader类
是BufferedReader的子类,和其父类的功能类似,只是增加了行号功能
主要方法:
int getLineNumber() 获得当前行号。
Void setLineNumber(int lineNumber) 设置当前行号。
六.装饰设计模式
(1)当想要对已有的对象进行功能增强时,可以定义一个类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类称为装饰类
装饰类通常会通过构造方法接受被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。
比如所学习到的BufferedReader和BufferedWriter都是装饰类。
(2)装饰和继承的区别
当在某一继承体系中有一些并列相似的事物(类),它们的某一种功能使用了相同的增强技术,我们是可以创建该类的子类来继承父类,在通过子类复写父类的方法,达到功能增强的效果,但是,这样会导致每一个事物都需要创建相应的子类来完成增强功能,这样就会导致整个继承体系过于臃肿。
因为都使用了一样的技术,那么我们就将该增强技术封装对象,形成一个装饰类,当那个类需要功能增强时,就就将给类的对象传递(那么装饰类的构造方法,就需要接受各种类型事物的对象,需要使用构造方法重载,多态了,提高了类的扩展性)给装饰类,这样就实现了增强效果,同时,也是的继承体系简化。
装饰类因为增强已有对象,具备的功能和已有对象是相同的,只不过是提供了更强的功能。所以装饰类和被装饰类通常都是属于一个体系中
--------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com