黑马程序员_温习 IO流一 (个人笔记) 简要(IO介绍。。字符流。。字符流缓冲区..装饰设计模式)

---------------------- <a href="http://edu.youkuaiyun.com"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训</a>、期待与您交流! ----------------------


简要(IO介绍。。字符流。。字符流缓冲区..装饰设计模式)



IO(Input Output)流:处理设备之间的数据传输

JAVA对于数据的操作时通过流的方式,用于操作流的对象都在IO包中





流按操作数据分两中   按流向分
|--字节流 |--输入流
|--字符流 |--输出流


IO流常用基本数据类型
|--字节流的抽象基类
|--输入:InputStream
|--输出:OutputStream


|--字符流的抽象基类
|--输入:Reader

|--输出:Writer()




字符流:
|--输出流:Writer -->FileWriter:用于输出字符文件的便捷类


例:


class Demo2
{
public static void main(String[] args)throws IOException //操作字符输出流必须声明异常或者 try  catch
{
FileWriter fw = new FileWriter("Demo.txt");//创建一个FileWriter对象,且一初始化就明确要操作的文件,若无指定地址
//则创建在当前目录下,如有同名文件,则覆盖,且一建立必须声明异常或者try  catch
fw.write("abcderf");//调用write方法,将字符串写入到输出流中
fw.flush();//刷新流,将流中数据刷到文件中
fw.close();//关闭流,关闭前会刷新一次
}
}


IO异常的处理方式:


例:


class Demo2
{
public static void main(String[] args)
{
FileWriter fw = null;
try
{
fw = new FileWriter("Demo.txt");
fw.write("abdffd");
}
catch (IOException e)
{
throw new RuntimeException("写入有误");
}
finally
{
try
{
if(fw!=null)  ///有几个IO流就要写几个关闭且每个关闭都要分别try catch和判断,引用是否指向NULL,
fw.close();  //因为,如果指向空,就不存在close方法了则fw.flose()会报错
}
catch (IOException e)
{
System.out.println(e.toString());
}
}
}
}


文件的续写:因为每编译一遍JAVA文件FileWriter fw = new FileWriter("Demo.txt")
都会覆盖原文件,所以要解决之


例:


class Demo2
{
public static void main(String[] args)throws IOException //操作字符输出流必须声明异常或者 try  catch
{
FileWriter fw = new FileWriter("Demo.txt",true);//传递一个参数true,代表不覆盖文件,并在文件末尾处进行数据续写
fw.write("nihao \r\n xiexie");// "\r\n"在记事本中实现换行,若只写\n记事本不识别会用黑色方框表示
fw.close();
}
}




读取方式:Reader(输入流)-->FileReader(文件输入流)


读取方式一 read():一次读一个字符,且自动往下读


例:


FileReader fr = new FileReader("Demo.txt");//建一个FileReader对象,并指定要读取(输入)的对象
int num = 0;//建一个装字符的容器
while ((num = fr.read())!=-1)//当read读完内容时,会返回-1表示,已经没有内容
{
System.out.println((char)num);//(char)num将数组num强转会字符
}


读取方式二 read(char[]) (返回值为字符个数)一次读一个存入char[]再操作(常用)


例:


FileReader fr = new FileReader("Demo.txt");
char[] buf = new char[1024];//建一个数组,1024位规定,可以改
int num = 0; //建计数器,记录read(char[])的返回值:字符个数,若到头,则返回-1
while ((num = fr.read(buf))!=-1)
{
System.out.println(new String(buf,0,num));//打印成字符串,规定长度,否则若1024没用完,则大一堆null浪费资源
}




练习:拷贝文本文件(两种方法:一次拷贝一个字符  一次拷贝一个字符数组 )用第二种


FileWriter fw = null;
FileReader fr = null;
try
{
fw = new FileWriter("Demo_Copy.txt");//指定输出文件
fr = new FileReader("Demo.txt");//指定输入文件
char[] buf = new char[1024];
int len = 0;
while ((len = fr.read(buf))!=-1)
{
fw.write(buf,0,len);//一组一组写入,规定长度,避免1024没用完,写一堆null
}
}
catch (IOException e)
{
throw new RuntimeException("读写失败");
}
finally    //有几个流就要写几个try catch 和 if 
{
try
{
if(fw!=null)
fw.close();
}
catch (IOException e)
{
throw new RuntimeException("关闭输出流失败");
}
try
{
if(fr!=null)
fr.close();
}
catch (IOException e)
{
throw new RuntimeException("关闭输入流失败");
}
}




字符流缓冲区:缓冲字符,提高输入,输出效率,创建前必须有流对象


|--输出流缓冲区:BufferedWriter


|--输入流缓冲区:BufferedReader


输出流缓冲区:BufferedWriter


例:


FileWriter fw = new FileWriter("Demo.txt");
BufferedWriter  bufw = new BufferedWriter(fw); //建缓冲器,并指定要缓冲的流对象
bufw.write("acbxs"); //通过缓冲区方法,把字符写入缓冲区
bufw.flush();  //缓冲区刷新
for(int x=1;x<5;x++)
{
bufw.write("abcd"+x);
bufw.newLine(); //newLine(),跨平台换行操作
bufw.flush();
}
bufw.close(); //关闭缓冲区,其实就是 fw.close()




输入流缓冲区:BufferedReader
|--readLine()方法:一次读取一行,若到结尾则返回null


图例:






例:


FileReader fr = new FileReader("Demo.txt");
BufferedReader bufr = new BufferedReader(fr); //建缓冲区,并指定要缓冲的流对象
String line = null; //建一个容器接收readLine方法返回的字符串
while ((line = bufr.readLine())!=null)//readLine()方法,自动读取一行数据,若到结尾则返回null
{
System.out.println(line);
}
bufr.close(); //关流




练习:通过缓冲区复制文本文件


BufferedWriter  bufw = null;
BufferedReader  bufr = null;
try
{
bufw = new BufferedWriter(new Writer("Demo_copy.txt")); //缓冲区内,直接new 流对象
bufr = new BufferedReader(new Reader("Demo_copy.txt")); //缓冲区内,直接new 流对象
String line = null; //容器
while ((line=bufr.readLine())!=null)//一行一行读
{
bufw.write(line);//一行一行写
bufw.newLine();//每行都换行
bufw.flush();//每行都刷新
}
}
catch (IOException e)
{
........
}
finally  //有几个流就写几个try catch  和 if 
{
try
{
if(bufw!=null)....
}
catch ()
{
.......
}
try
{
if(bufr!=null)....
}
catch ()
{
.......
}
}




装饰设计模式:当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入基于其已有的功能,提供加强功能
那么自定义的类称为”装饰类“


如:BufferedReader就是FileReader的装饰类,是基于其现有对象的read方法,给与其增强方法readLine的


装饰和继承的区别:
|--装饰模式比继承要灵活,避免了继承体系的臃肿,而且降低了类与类的关系
|--装饰类因为增强已有对象,所以其具备的功能和对象是一样的,只不过提供了

更强的功能,所以装饰类和被装饰类通常都属于一个体系


---------------------- <a href="http://edu.youkuaiyun.com"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值