黑马程序员 IO流 流操作的基本规律

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

1、BufferedWriter
    缓冲区的出现是为了提高系统流的操作效率而出现的
    所以在创建缓冲区之前,必须要先有流对象
    
    该缓冲区中提高了一个夸平台换行
    
    .newLine()

        //创建一个字符写入流
        FileWriter fw=new FileWriter("E:\\java_heima\\buf.txt",true);
        
        //为了提高字符写入流效率。加入了缓冲技术
        //只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可
        BufferedWriter bufw=new BufferedWriter(fw);
        bufw.write("abcd");
        
        bufw.newLine();//换行命令,较通用
        
        //记住,只要用到缓冲区,就要记得刷新
        bufw.flush();
        
        //其实关闭缓冲区,就是在关闭缓冲区中的流对象
        bufw.close();

2、BufferedReader
    该缓冲区提高了一次读一行的方法,方便于对文本数据的获取
    当返回null结束
    .readLine();
    readLine方法返回的时候只返回回车符之前的数据内容,不返回回车符

    readLine()方法的原理
    无论是读一行,还是获取多个字符。其实最终都是在硬盘上一个一个读取
    所以最终使用的还是read方法一次读一个的方法

//创建一个读取流对象和文件相关联
        FileReader fr=new FileReader("E:\\java_heima\\demo3.txt");
        //为了提高效率,加入缓冲区技术,将字符读取流对象作为参数传递给缓冲对象的

构造函数
        
        BufferedReader bufd=new BufferedReader(fr);
        String line=null;
        while ((line=bufd.readLine())!=null) {
            System.out.println(line);
            
        }
        //readLine()  一行一行读取
        //String s1=bufd.readLine();
        
        //System.out.println(s1);
        bufd.close();


3、重写bufferedReader
    明白了bufferedReader类中特有方法readLine的原理,
    可以自定义一个类中包含一个功能和readLine一致的方法。

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

    装饰类通常会通过构造方法接收被装饰的对象
    并基于被装饰的对象的功能,提供更强的功能。

5、装饰类与继承的区别
    装饰模式比继承要灵活,避免了继承体系的臃肿
    而且降低了类与类之间的关系

    装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
    所以装饰类和被装饰类通常是都属于一个体系中的

6、LineNumberReader :行号
    行号获取
FileReader fr=new FileReader("...");
LineNumberReader Inr=new LineNumberReader(fr);

string line=null;
lnr.setLineNumber(100);//表示从di100行开始
while((line=lnr.readLine())!=null)
    s.o.p(lnr.getLineNumber());


7、字节流(FileInputStream,FileOutputStream,BufferedInputStream,BufferedOutputStream)
    InputStream(读) OutputStream(写)  ---》对计算机而言
    
    需求:想要操作图片数据。这时就要用到字节流
        
    available();获取文件中长度,可以用来定义数组长度

    复制一个图片
    1)用字节读取流对象和图片关联
    2)用字节写入流对象创建一个图片文件。用于存储获取到的图片数据
    3)通过循环读写,完成数据的存储。
    4)关闭资源

8、InputStreamReader
    字节流通向字符流的桥梁

        InputStream in=System.in;
        //将字节流转成字符流
        InputStreamReader isr=new InputStreamReader(in);
        //为了提高效率,将字符串进行缓冲区技术高效操作
        BufferedReader bufr=new BufferedReader(isr);
        
        String line=null;
        
        while((line=bufr.readLine())!=null)
        {
            if("over".equals(line))
                break;
            System.out.println(line.toUpperCase());
        }
            
        bufr.close();

9、OutputStreamWriter
    字符流通向字节流的桥梁


/*
 * 1.
 * 源:键盘录入   System.in
 * 目的:控制台  System.out
 *
 * 2.键盘输入到文件上
 * 源:键盘录入   System.in
 * 目的:文件 new FileOutputStream("E:\\java_heima\\out.txt")
 *
 * 3.把文件打印到控制台上
 * 源:new FileInputStream("E:\\java_heima\\out.txt")
 * 目的: System.out
 *
 *
 */
        BufferedReader bufr=
            new BufferedReader(new InputStreamReader(System.in));//源
        
        BufferedWriter bufw=
            new BufferedWriter(new OutputStreamWriter(new FileOutputStream

("E:\\java_heima\\out.txt")));//目的
        
        String line=null;
        
        while((line=bufr.readLine())!=null)
        {
            if("over".equals(line))
                break;
            bufw.write(line.toUpperCase());
            bufw.newLine();
            bufw.flush();
        }
        bufw.close();
        
10、流操作的基本规律:
    困难:流对象过多,不知道该用哪一个。
    解决:
    1)明确源和目的
        源:输入流:InputStream    Reader
        目的:输出流OutputStream Writer
    2)操作的数据是否是纯文本
        是:字符流
        否:字节流
    3)当体系明确后,在明确要使用哪个具体的对象
        通过设备来进行区分
        源设备:内存、硬盘、键盘
        目的设备:内存、硬盘、控制台
例1:
需求:讲一个文本文件中数据存储到另一个文件中。即复制=文件
源:    1)因为是源,所以使用读取流:
        InputStream    Reader
    2)是不是操作文本文件?
        是!可以选择用Reader (这样体系就明确了)
    3)接下来明确要使用该体系中的哪个对象。
        明确设备:硬盘上一个文件
        Reader体系中可以操作文件的对象是  FileReader

    是否需要提高效率
    是!。加入Reader体系中缓冲区 BufferedReader

    FileReader fr = new FileReader("a.txt")
    BufferedReader bufr=new BufferedReader(fr)


目的:    1)OutputStream Writer

    2)是不是操作文本文件?
        是!可以选择用 Writer

    3)接下来明确要使用该体系中的哪个对象。
        明确设备:硬盘 一个文件
        Writer体系中可以操作文件的对象是  FileWriter

    是否需要提高效率
    是!。加入Reader体系中缓冲区 BufferedWriter

    FileWriter fw = new FileWriter("b.txt")
    BufferedWriter bufw=new BufferedWriter(fw);
-----------------------------------------------
例2:
需求:将键盘录入的数据保存到一个文本中

源:    1)InputStream    Reader

    2)是!可以选择用Reader

    3)明确设备:键盘,对于对象是System.in

    因为Reader字符流,System.in字节流
    所以使用转换流:InputStreamReader
    
    InputStreamReader isr=new InputStreamReader(System.in)
    

    是否需要提高效率
    是!。加入Reader体系中缓冲区 BufferedReader

    BufferedReader bufr=new BufferedReader(isr)

目的    1)OutputStream Writer
    
    2)是!可以选择用 Writer

    3)明确设备:硬盘 一个文件
      Writer体系中可以操作文件的对象是  FileWriter
    
    FileWriter fw = new FileWriter("b.txt")

    是否需要提高效率
    是!。加入Reader体系中缓冲区 BufferedWriter
    
    BufferedWriter bufw=new BufferedWriter(fw);

    
    
11、扩展一下:想要把录入的数据按照指定的编码表(utf-8),将数据存到文本中
    
    目的:  1)OutputStream Writer
        2)是!可以选择用 Writer
        3)明确设备:硬盘 一个文件。 使用  FileWriter

    但是FileWriter是使用的默认编码表(GBK)

    需求:  存储时,按照指定的编码表(utf-8),因此指定的编码表只能转换流可以指定
        所以要使用的对象是OutputStreamWriter.
        而该转换流对象要接收一个字节输入出流,
        而且还可以操作的文件的字节输出流:FileOutputStream

    OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream

("d.txt"),"UTF-8" )
    是否需要提高效率
    是!。加入Reader体系中缓冲区 BufferedWriter
    
    BufferedWriter bufw=new BufferedWriter(osw);


    所以:记住,转换流什么时候使用
    字符与字节之间的桥梁,通常,涉及到字符编码转换时,
    需要用到转换流

12、系统信息获取
    Properties prop=System.getProperties();

    prop.list(new PrintStream("d.txt"));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值