黑马程序员 java基础24天 字符流

---------------------- 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值