黑马程序员15——IO流2

来源:互联网 发布:linux登陆时间 编辑:程序博客网 时间:2024/06/11 15:44

------- android培训、java培训、期待与您交流! ----------


1. 自定义的readerLine

  定义一个自己的类,
  传递一个字符输入流
  class XXXX{
     XXXX(Reader r){
        Reader r = FileReader;
     }
     readLine(){
       r.read();
     }
  }


  main(){
    new XXXX(FileReader);
  }
  实际中,还是传递的Reader子类FileReader去读文件
  XXXX类,增强了原有FileReader的功能
  如果实现读取一行的,\r\n


  r.read() == \r 不需要这个符号,让Read方法再次读一个
  r.read() == \n 结束了,将缓冲区中的字符变成String返回


2. 字节输出流
  OutputStream
  写的方法,write(字节数组)


  父类是抽象的类,找子类
  FileOutputStream 
  构造方法,传递一个字符串的文件名
  字节输出流,写文件,不需要刷新,直接将数据写向目的文件


3. 字节输入流
  InputStream
  读取的方法,read(字节数组)
  父类是抽象的,找子类
  FileInputStream
  构造方法,传递一个字符串的文件名


  字节流读,还写  字节数组转成字符串--读数据
  字符串转成字节数组--写数据


  QQ --> 在吗 --> .getBytes()  字节数组{-53,-34,-65,-100}--> 10101010100101-->网线


  1010101001->十进制 字节数组{-53,-34,-65,-100} new String(字节数组{-53,-34,-65,-100})-->在吗


4. 字节流复制任意文件

  第一种,读一个字节写一个字节

package cn.itcast.iostream;/* * 字节流,复制一个视频文件 * 数据源C:\\a.avi * 数据目的d:\\a.avi */import java.io.*;public class CopyFile {public static void main(String[] args) {long start = System.currentTimeMillis();//声明2个字节流对象FileInputStream fis = null;FileOutputStream fos = null;try{fis = new FileInputStream("C:\\A.avi");fos = new FileOutputStream("d:\\a.avi");int len = 0 ;while((len = fis.read())!=-1){fos.write(len);}}catch(IOException e){e.printStackTrace();throw new RuntimeException("复制失败");}finally{try{if(fos!=null)fos.close();}catch(IOException e){throw new RuntimeException("写入文件关闭失败");}finally{  try{if(fis!=null)fis.close();  }catch(IOException e){  throw new RuntimeException("读取文件关闭失败");  }}}long end = System.currentTimeMillis();System.out.println(end - start);}}


  第二种,读一个字节数组,写一个字节数组

package cn.itcast.iostream;/* * 字节流复制任意文件 * 读写字节数组 */import java.io.*;public class CopyFile2 {public static void main(String[] args) {long start = System.currentTimeMillis();//声明2个字节流对象FileInputStream fis = null;FileOutputStream fos = null;try{fis = new FileInputStream("C:\\A.avi");fos = new FileOutputStream("d:\\aaa.avi");//获取到字节输入流对象封装的文件的字节数,不推荐使用System.out.println(fis.available());//System.exit(0);int len = 0 ;byte[] bytes =new byte[1024*10];while((len = fis.read(bytes))!=-1){fos.write(bytes,0,len);}}catch(IOException e){e.printStackTrace();throw new RuntimeException("复制失败");}finally{try{if(fos!=null)fos.close();}catch(IOException e){throw new RuntimeException("写入文件关闭失败");}finally{  try{if(fis!=null)fis.close();  }catch(IOException e){  throw new RuntimeException("读取文件关闭失败");  }}}long end = System.currentTimeMillis();System.out.println(end - start);}}


  第三种,利用字节流的缓冲区读写

package cn.itcast.iostream;/* * 字节流的缓冲区对象复制文件,任意文件 */import java.io.*;public class CopyFile3 {public static void main(String[] args) {long start = System.currentTimeMillis();//定义两个缓冲区对象BufferedInputStream bis = null;BufferedOutputStream bos = null;try{bis = new BufferedInputStream(new FileInputStream("c:\\a.avi"));bos = new BufferedOutputStream(new FileOutputStream("d:\\a.avi"));int len = 0 ;while((len = bis.read())!=-1){bos.write(len);}}catch(IOException e){e.printStackTrace();throw new RuntimeException("复制失败");}finally{try{if(bos!=null)bos.close();}catch(IOException e){throw new RuntimeException("写入文件关闭失败");}finally{  try{if(bis!=null)bis.close();  }catch(IOException e){  throw new RuntimeException("读取文件关闭失败");  }}}long end = System.currentTimeMillis();System.out.println(end - start);}}





5. 字节流的缓冲区
  BufferedInputStream 传递字节输入流
  BufferedOutputStream  传递字节输出流


  读和写,只能是读写字节数组或者是单个字节


6. 键盘输入
    new Scanner(System.in)
    System.in  System类的静态的成员变量
    静态成员变量in 数据类型是字节输入流的最高类类型,InputStream
    既然使用System.in可以获取到InputStream的类,这个类中有很多read方法


    在读取键盘输入的时候,停止程序,结束while循环
    read()读取不到-1的
    只能约定一个结束的标记,标记是over
    读取到over后,结束循环了


    写的键盘输入,读取一行的程序,写完后,发现这个程序和上午写的readLine方法很相似
    readLine读取一行,判断行的结束\r\n 能不能让readLine方法直接读取键盘输入
    readLine方法字符输入流缓冲区对象的方法


    System.in字节输入流     如何能被一个字符输入流读取呢,按行读
    while((len = in.read())!=-1){
   if(len == '\r')
    continue;
   if(len == '\n'){
    if(builder.toString().equals("over"))
    break;
    //一行结束了,将缓冲区中的内容打印出来,打印完毕后,清空缓冲区
    System.out.println(builder.toString().toUpperCase());
    builder.delete(0, builder.length());
   }else{
   builder.append((char)len);
   }
   替换为 BufferedReader readLine()


   readLine 和 System.in 不是同一个流对象
   Sun公司工程师,开发出了转换流对象,让你的字节输入流,转成字符输入流
   我就可以使用BufferedReader中的readLine读取了


7. 转换流对象
   第一个转换流对象,InputStreamReader  字符流
   作用,将字节流转成字符流:是字节流向字符的桥梁
   使用InputStreamReader类的时候,构造方法专递字节输入流对象
   转成字符输入流


   InputStreamReader-->FileReader
   日后使用键盘,按照行读,推荐使用转换流对象实现功能
   代码简单,安全可靠


   使用转换流,完成了键盘输入的按行读取
   将读取到的字符串,转成大写,打印到控制台
   控制台输入,不允许使用sop来实现


   System.out 返回一个PrintStream类型对象
   System.out 静态的成员变量,返回一个OutputStream类型的对象
   OutputStream是一个字节流对象


   就是我们要输出的数据目的


   String line = bfr.readLine();
   字符输入流读取的,数据是字符流




   输出的目的是System.out字节流


   将字符流转成字节流,才能把数据输出到字节流中
   第二个转换流,字符转成字节流
   OutputStreamWriter 字符流对象


   构造方法中,传递字节输出流
   OutputStreamWriter(字节输出流 System.out)


   InputStreamReader(System.in)


   String line = bfr.readLine();


   BufferedWriter bfw - new BufferedWriter(oow);
   OutputStreamWriter oow = OutputStreamWriter(System.out)
   bfw.write(line)


   转换流特点
     InputStreamReader
     OutputStreamWriter
     都是字符流
     对于程序人员来说,你是在用字符流操作字节流
     为什么要使用字符流操作字节流,读,写行  ,前提是字节流中的数据是文本


     两个转换流中,构造方法传递的参数都是字节流
     InputStreamReader(InputStream)
       BufferReader 读取行


     OutputStreamWriter(OutputStream)
       BufferedWriter写行
     
     分别使用两个字符流缓冲区实现行操作,目的就是方便读取和写入!


     由于数据源,和数据目的,不是固定的
    InputStream System.in  OutputStream Sytstem.out


8. 转换流的编码效应
  转换流也是字符流,默认查询GBK
  转换流的构造方法中,指定编码表
  
  ASCII  字母,数字,符号


  GBK 
    GB2312  中文编码表 4000个汉字
    每个汉字2个字节,都是负数


    GBK 中文编码表20000个汉字


    GB18030
  
  ISO8859-1 拉丁文


  国际标准化组织,做一个码表,兼容世界上所有的语言
  unicode 万国码
  
  UTF-8
    在UTF-8码表中,汉字是三个字节


  两个转换流的构造方法中,可指定编码表的名字
  确保,读取的文件,和指定的码表保持一致


9. 字符的编码和解码
  将一个字符串,转成字节数组--编码   String类的getBytes方法,指定编码表名
  字节数组转成字符串--解码  String类的构造方法,指定编码表名


  String类有关系
0 0
原创粉丝点击