A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贠(yun)靖 高级黑马   /  2012-3-24 00:39  /  1918 人查看  /  1 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

Io(Input Output):
        字节流的抽象基类:
          InputStream  OutputStream
        字符流的抽象基类:
          Reader    Writer
        注:由这四个类派生出来的子类名称都是以其父类名作为
                子类名的后缀的。
                如:InputStream的子类FileInputStream
                        Reader     的子类FileReader
FileWriter  写入流       
        FileWriter fw = new FileWriter("Demo.txt");
        fw.write("fannaocan"); 如果“”后代参数true 表示在末尾续写,没有此文件则新建文件
        //fw.flush();     区别flush刷心后,流可以继续使用,close刷心后,会将流关闭。
fw.close();
读写异常处理
        关闭资源放在finally中要判断关闭对象是否为null
FileReader 读入流     
                第一种读取方式  一次读一个字符
//创建一个文件读取流对象,和指定名称的文件相关联
                        //要保证该文件时已经存在的。如果不存在,会发生异常。FileNotFoundException
                        FileReader fr = new FileReader("Demo.txt");
                        //调用读取流的方法,read方法一次读一个字符,而且会自动往下读。
                        int ch=0;         read返回时int型的数,即返回的是字符的ascII表对应的数字
                        while ((ch=fr.read())!=-1)
                        {
                                sop((char)ch);
                        }
                第二种读取方式
                        //创建一个文件读取流对象,和指定名称的文件相关联
                        //要保证该文件时已经存在的。如果不存在,会发生异常。FileNotFoundException
                        FileReader fr = new FileReader("Demo.txt");   把Demo.txt中的数据读到控制台
                        //定义一个字符数组,用于存储独到的字符该read(char[]) 返回的是读到字符的个数
                        char[] buf = new char[1024];
                        int len=0;
                        while((len=fr.read(buf))!=-1) 把读到的字符暂时存到buf数组中
                        {
                                sop("num="+num+"...."+new String(buf,0,len));
                        }
利用读和写复制文件
复制的原理:
        其实就是讲c盘下的文件数据存储到D盘的一个文件中
步骤:1 在d盘创建一个文件,用于存c盘文件中的数据
2 定义读取流和c盘文件关联  3 通过不断的读写完成数据存储  4 关闭资源
                        FileWriter fw = new FileWriter("RuntimeDemo18_2_copy_222.txt");
                        FileReader fr = new FileReader("RuntimeDemo18_2.java");
                        char[] buf = new char[1024];
                        int len=0;
                        //把要copy的数据存到流中,再通过fr。read读取流中的数据并存到buf数组中
                        while ((len = fr.read(buf))!=-1)  
                        {//再通过fw。write把数组中的数据写到流中。然后再通过flush或者
                                fw.write(buf,0,len);    //close刷新流  让流中的数据存入目的地
                                fr.close();   fw.close();
        字符读取流缓冲区 BufferedReader
该缓冲区提供了一个一次读一行的方法readLine并返回一个字符串,方便于对文本数据的获取当返回null时表示读到文件末尾       
                        FileReader fr = new FileReader("buf.txt");
                        BufferedReader bufr = new BufferedReader(fr);
                        String  line = null;
                        while((line=bufr.readLine())!=null)   
                                System.out.println(line);
               
        利用缓冲区复制文件,效率高
                        BufferedReader bufr = new BufferedReader(new FileReader("a.java"));
                        BufferedWriter bufw = new BufferedWriter(new FileWriter("a_copy.txt"));
                        String line =null;
                        while ((line=bufr.readLine())!=null)
                        {
                                bufw.write(line);
                                bufw.newLine();
                                bufw.flush();
                        }
                        bufr.close(); bufw.close();
字节流      读                InputStream                   写      OutputStream
        字节流的写入
                FileOutputStream fos = new FileOutputStream("fos.txt");
                fos.write("abcd".getBytes()); // 字符串转换成字节类型
                fos.close();
        字节流的读3中方法
        第一种方式一次读一个字符(需要把ASCII码转成char类型)       
public static void readFile_1()throws IOException
{
        FileInputStream fis = new FileInputStream("fos.txt");
        int ch = 0;
        while ((ch=fis.read())!=-1)
        {
                System.out.println((char)ch);
        }
        fis.close();
}       
第二种方式,穿件一个byte的buf数组,把字符存到buf数组中
        public static void readFile_2() throws IOException
        {
                FileInputStream fis = new FileInputStream("fos.txt");
                byte[] buf = new byte[1024];
                int len = 0;
                while ((len=fis.read(buf))!=-1)
                {
                        System.out.println(new String(buf,0,len));
                }
                fis.close();
        }
        第三种方式,available()方法返回字符的长度,慎用,容易内存溢出
                public static void readFile_3() throws IOException
        {
                FileInputStream fis = new FileInputStream("fos.txt");
                int num = fis.available();
                byte[] buf = new byte[num];//定义一个刚刚好的缓冲区
                fis.read(buf);
                System.out.println(new String(buf));
                fis.close();
                }
利用缓冲技术复制图片
        思路:   
        1 用字节读取流对象和图片关联
        2 用字节写入流对象创建一个图片文件,用于存存储取到的图片数据
        3 通过循环读写,完成数据的存储
        4 关闭资源
                        FileOutputStream fos = new FileOutputStream("1.jpg");
                        FileInputStream fis =new FileInputStream("1111.jpg");
                        byte[] buf = new byte[1024];
                        int len = 0;
                        while ((len=fis.read(buf))!=-1)
                        {
                                fos.write(buf,0,len);
                        }
                        fis.close()   fos close()
装饰设计模式
当想要对已有的对象进行功能增强时,可以定义类,
将已有对象传入,基于已有对象的功能,并提供加强功能
那么自定义的该类称为装饰类

装饰类通常会通过构造方法接受被装饰的对象。
并基于被装饰的对象的功能,提供更强的功能。
装饰设计模式和继承的区别
        MyReader  专门用于读取数据的类。  继承可以看出操作比较麻烦
        |-- MyTextReader
             |--MyBufferedTextReader
        |-- MyMediaReader
         |--MyBufferedMediaReader
        |-- MyDateReader
                 |--MyBufferedDateReader

class MyBufferReader extends MyReader
{
        private MyReader r;
        MyBufferReader(MyReader r)  利用多态 提高扩展性。
        {
                this.r = r;
        }
}
MyReader  装饰设计模式
        |-- MyTextReader
        |-- MyMediaReader
        |-- MyDateReader
        |-- MyBufferReader

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

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

评分

参与人数 1技术分 +2 收起 理由
职业规划-刘倩老师 + 2 赞一个!

查看全部评分

1 个回复

倒序浏览
关于键盘输入与读出
        1, 源  键盘录入
        目的 控制台
2  需求 想把键盘录入的数据存储到一个文件中
源   键盘
目的 文件。

3 需求  想要将一个文件的数据打印在控制台上

源 文件
目的 控制台
流操作的基本规律:
        最痛苦的就是流对象有很多,不知道该用哪一个。
通过三个明确来完成。
        1 明确源和目的。
                源:输入流 InputStream Reader
                目的:输出流 OutputStream writer
        2 明确操作的是否是纯文本。
                是:字符流
                不是: 字节流
        3 当体系明确后再明确要使用哪个具体的对象。
            通过设备来进行区分:
                源设备:内存,硬盘,键盘。
                目的设备:内存,硬盘,控制台。
                FileReader fr = new FileReader("a.txt");
        4 如果需要提高效率,则加入Reader体系中缓冲区 BufferedReader
                BufferedReader bufr = new BufferedReader("fr");
需求
1 将一个文本文件中数据存储到另一个文件中,复制文件
        源:1 因为是原,所以使用读取流InputStream   Reader
                2 是文本文件-->Reader 体系明确
        3 明确设备:硬盘上的文件,Reader体系中可以操作文件
                                        的对象是FileReader
  目的:1 OutputStream Writer
                2 是文本文件--->Writer体系
                3 明确设备:硬盘上的文件。Writer体系中可以操作文件的
                                        对象是FileWriter
                FileWriter fw = new FileWriter("b.txt");
                4 如果需要提高效率,则加入Reader体系中缓冲区 BufferedWriter
                BufferedWriter bufr = new BufferedWriter("fw");
----------------------------------
2 需求:将键盘录入的数据保存到一个文件中
        源:1 InputStream   Reader
                2 是纯文本 Reader
                3 设备:键盘。对应的对象是System.in
                因为System.in对应的是字节流,所以需要转成字符流Reader
                即用Reader体系中的转换流,InputStreamReader
                InputStreamReader isr = new InputStreamReader(System.in)
                4 需要提高效率
                BufferedReader bufr = new BufferedReader(isr);
  目的:1 OutputStream   Writer
        2 是纯文本   Writer
                3 设备:硬盘,一个文件,使用FileWriter
                FileWriter fw = new FileWriter("c.txt");
                4 需要提高效率
                 BufferedWriter bufw = new BufferedWriter(fw);
-------------------------------------------------------------------------------------------------
                //获取键盘录入对象。
                InputStream in = System.in;
                //将字节流对象转成字符流对象,使用转换流InputStreamReader
                InputStreamReader isr = new InputStreamReader(in);
                //为了提高效率将字符串进行缓冲区技术提高效率操作,使用BufferedReader
                BufferedReader bufr = new BufferedReader(isr);           */
                //输出转换
                OutputStream out = System.out;
                OutputStreamWriter osw = new OutputStreamWriter(out);
BufferedWriter bufw = new BufferedWriter(osw);  
-------------------------------------------------------------------------------------------------
从键盘读入数据,从控制台输出数据,如果要换输入和输出值需要用
相应的对象替换System.in和 System.out即可
-------------------------------------------------------------------------------------------------
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in))
                BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
           --------------------------------------------------------------------------------------------------------
                String line = null;
                while ((line=bufr.readLine())!=null)
                {
                        if("over".equals(line))
                                break;
                        bufw.write(line.toUpperCase());
                        bufw.newLine();
                        bufw.flush();
                }
                bufr.close();
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马