新手入门的I/O简单基础知识

1.流是文件(磁盘)与内存之间建立的一个通道,在Java API中,可以从其中读入一个字节序列的对象称为输入流,可以向其中写入一个字节序列的对象称为输出流。字节序列可以来自文件,网络连接,甚至内存块。 

2.以内存作为参考,流可以分为输入流(InputStream,Reader<读入>)和输出流(OutputStream,Writer<写出>).
3.又分为字节流(InputStream,OutputStream)和字符流(Reader,Writer).
    可以认为二进制数据为字节流,文本数据为字符流(只是能用记事本能够打开的文本文件)。
     从抽象类Reader和Writer中继承出来的类拥有读与写的操作都是基于两字节的Unicode码元的,不是基于单字节的字符。
4.      ①     InputSream(抽象类,输入字节流的超类)
                    a.FileInputStream和FilterInputStream继承了InputStream
                    b.BufferedInputStream继承了FilterInputStream
         ②     OutputStream(抽象类,输出字节流的超类 )
                    a.FileOutputStream和FilterInputStream继承了OutputStream
                    b.BufferedInputStream继承了FilterOutputStream
         ③     Reader(抽象类,读取字符流的类)
                    a.BufferedReader和FilterReader和InputStreamReader继承了Reader
                    b.FileReader继承了InputStreamReader
          ④     Writer(抽象流,写出字符流的类)
                    a.BufferedWriter和FilterWriter和InputStreamWriter继承了Writer
                    b.FileWriter继承了InputStreamWriter
5.FileInputStream(文件字节流)
     ①单字节读入

     public void demo1() throws IOException{
          InputStream is=new FileInputStream(new File("e:/aa.txt"));
          int i;
          while((i=is.read())!=-1){
              System.out.println((char)i); 
          }
          is.close();
     }
     ②字节组读入(java中一个汉字占两个字节)

     public void demo2() throws IOException{
          InputStream is=new FileInputStream(new File("e:/aa.txt"));
          byte buff[]=new byte[2];
          int i;
          while((i=is.read(buff))!=-1){
              String s=new String(buff);
               System.out.println(s); 
          }
     } 

6.FileOutputStream
     ①单字节写出(文件系统会自动创建)
  
     public void demo3() throws IOException{
          OutputStream os=new FileOutputStream(new File("e:/aa.txt"),true);//这里的true是为了                   下次写出时不会覆盖原文件,而是跟在后面
          String str="Hello World!"  
          for(int i=0;i<str.length();i++){
              char c=str.charAt(i);
              os.write(); 
          }
          os.flush();//保证缓冲区的清空
          os.close();
     }
     ②汉字写出

     public void demo4(){
          OutputStream os=new FileOutputStream(new File("e:/aa.txt"),true);
          String str="你好,java!"
          os.write(str.getBytes());  //将字符串转为byte数组
          os.flush();
          os.close();
     }
7.缓冲流
     缓冲流要“套”在相应的节点流上,对于读写数据提供了缓冲功能,能提高读写的效率。
     (从磁盘整块拿到缓冲区,再分个流向内存,比一个一个从磁盘区流到内存的速度要快,从内存流向磁盘方向类似)
     BufferedInputStream和BufferedOutputStream对于字节流而言,加速了文件读取与存入的速度,提高了复制效率。
     BufferedReader和BufferedWriter对于字符流而言,提高了输入写出的速度。
8.利用缓冲流和字节流进行文件复制(任何java文件,不限于txt)
     
     public void copy1() throws IOException{
          BufferedInputStream bis=null;
          BufferedOutputStream bos=null;
          bis=new BufferedInputStream(new FileInputStream(new File("e:/aa.txt")),1024); // 1024 设置缓冲流的大小
          bos=new BufferedOutputStream(new FileOutStream(new File("e:/bb.txt")),1024);
          byte[] buff=new byte[1024];
          int i;
          while((i=bis.read(buff))!=-1){
              bos.write(buff); 
          }
          System.out.println("复制完成!");
          bos.flush();     //清空缓冲区
          bos.close();     //先关闭输出流
          bis.close();     //后关闭输入流
     }
9.利用缓冲流和字符流进行文本复制

     public void copy2() throws IOException{
          BufferedReader br=null;  
          BufferedWriter bw=null;
          br=new BufferedReader(new FileReader(new File("e/:aa.txt")));
          bw=new BufferedWriter(new FileWriter(new File("e/:bb.txt")));
          String line;
          while((line=br.readLine())!=null){
              bw.write(line);
              bw.newLine();     //换行 
          }
          bw.flush();
          bw.close();
          br.close();
     }
10.InputStreamReader和OutputStreamWriter
      InputStreamReader 是字节流通往字符流的桥梁
     OutputStreamWriter是字符流通往字节流的桥梁
例:
     
     public void demo5(){
         BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(new File("e:/aa.txt"))));
          String line;
          while((line=br.readLine())!=null){
              System.out,pritln(line); 
          } 
     }
(上例可与5①比较理解)
11.java的流组合机制
     FileInputStream和FileOutputStream只支持在字节级别上的读写。也就是只能从其对象中读取字节和字节数组。
     DataInputStream只能读入数值类型
     Java使用了一种灵巧的机制来分离这两种职责,某些流()可以从文件和其他外部的位置上获取字节,而其他流可以将字节组装成更有用的数据类型,Java可以将其进行组合。
     例
     
     FileInputStream fin=new FileInputStream("employee.dat");
     DataInputStream din=new DataInputStream(fin);
     double s=din.readDouble();
     例

     DataInputStream din=new DataInputStream(new BufferedInputStream(new FileInputStream(new File("e:/aa.txt"))));
12.从控制台输入
     
     InputStreamReader in=new InputStreamReader(System.in); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值