zoukankan      html  css  js  c++  java
  • JAVA 中的IO流

    Java中的IO流是用来处理设备与设备之前的数据传输,在java中以流的形式传输。流分为两类:字节流和字符流。

    字节流:InputStream,OutPutSteam.(计算机内的数据都是以字节存储的,字节流可以操作任意数据)

    字符流:Reader,Writer.(字符流只能操作字符,但是在实际应用中字符流比较方便)

    从操作来看又可以分为:输入流和输出流。

    在进行IO流操作的时候分为以下几步:1.导入IO流的包,2.进行IO流的异常处理,3.关闭IO流释放资源。

                                                                                                

    字节流

    ————————————————————————————————————————————————————————————————————————————————————————————————————————————

    FileInputStream:

    1 FileInputStream fis =new FileInputStram("xxx.text");
    2 int b;
    //读取标准写法
    3 while((b=fis.read)!=-1){ 4 System.out.println(b); 5 } 6 fis.close();

    FileOutputSteam:

    FileOutputStream fos=new FileOutputStream("xxx.text",true);//FileOutputStream默认每次回重新生成一个“xxx.text”,如果想要追加,应该加一个true
    fos.write();
    fos.close();
     

    Java中的缓冲区:

    在读写数据的时候,一次读写一个数组明显比一个一个字节的读取速度要快的多,所以考虑到这种设计思想,引入了缓冲区。实际上就是对流进行包装。(装饰设计思想)

    BufferInputStream和BufferOutputStream:

    
    
    BufferedInputStream bis=new BufferedInputStream(new FileInputStrean("xxx.txt"));
    BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("yyy.txt")
    byte[]by=new byte[1024]
    int len
    while((len=bis.read(by))!=-1){
    
    bos.write(arr,0,len);
    }
    bis.close();//只需要关闭BufferInputStream
    bos.close();
    
    
    

    JDK 1.7以下流的异常处理:

    需要注意的是在做IO流的异常处理的时候,不能进行try catch.因为IO流是用来操作底层的数据,如果进行了try catch相当于把IO问题隐藏了,无法向上暴露,真确的做法是将IO异常抛出。

    try{BufferedInputStream bis=new BufferedInputStream(new FileInputStrean("xxx.txt"));
    BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("yyy.txt")
    byte[]by=new byte[1024]
    int len
    while((len=bis.read(by))!=-1){
    
    bos.write(arr,0,len);
    }
    }finally{
    if(bis!=null){
    bis.close();//只需要关闭Buffer
    }
    if(bos!=null){
    bos.close();
    }
    }

    JDK 1.7以上流的异常处理:

    不需要手动关闭,程序自动关闭。

    try(
    BufferInputStream bis=new BufferInputStream(new FileInputStrean("xxx.txt"));
    BufferOutputStream bos=new BufferOutputStream(new FileOutputStream("yyy.txt")
    )
    {
    byte[]by=new byte[1024]
    int len
    while((len=bis.read(by))!=-1){
    
    bos.write(arr,0,len);
    }
    }

    字符流

    ————————————————————————————————————————————————————————————————————————————————————  FileReader:

    FileReader fr=new FileReader("xxx.txt")
    int c;
    while((c=fr.read())!=-1){   //read()方法按照字符大小读取
    System.out.print((char)c);
    }
    c.close();

    FileWriter:

    FileWriter fw=new FileWriter("xxx.txt")
    fw.wrire("你好");  write()方法自动将字符装字节写入
    fw.close();

    字符流的拷贝:

    FileReader fr=new FileReader("xxx.txt");
    FileWriter fw=new FileWriter("zzz,txt");
    int c;
    while((c=fr.read())!=-1){
    
    fw.writer(c);
    }
    fr.close();
    fw.close();

    字符流和字节流都可以拷贝文件,但是不推荐使用字符就拷贝文件,因为读取的时候要将字节流转换为字符流,写入的时候要将字符流转换位字节流,太过耗时!

    当程序需要读写一段文本时,推荐使用字符流,因为它是按码读取,不会出现半个中文的情况,更加准确!写出时也不用转换为字节流。需要注意的是,使用字符流拷贝时,只能拷纯文本。在读的时候将字符转换为字节的时候可能找不到对应的字节,出现字节丢失。

    自定义字节数组拷贝:

    FileReader fr=new FileReader("xxx.txt");
    FileWriter fw=new FileWriter("zzz.txt");
    char[]by=new char[1024];
    int len;
    while((len=fr.read(by))!=-1){//将文件上的数据转到字符数组中
    
    fw.write(by,0,len);//字符数组中的字符转到文件中
    }
    fr.close();
    fw.close();

    带缓冲的字节数组拷贝:

    BufferedReader br=new BufferReader(new FileReader ("xxx.txt"));
    BufferedWriter bw=new BufferWriter(new BufferWriter("zzz.txt"));
    int c
    while((c=br.read())!=-1){
    bw.writer(c);
    }
    br.close();
    bw.close();

    BufferReader和BufferWriter:

    BufferedReader br=new BufferReader(new FileReader("xxx.txt"));
    BufferedWriter bw=new BufferWriter(new FileWriter("zzz.txt")) String line;
    while((line=br.readLine())!=null){读取一行字符 bw.write(line);
    bw.nextLine();//换行 } br.close();
    bw.close();

    简单应用实现文本反转:

    BufferedReader br=new BufferReader(new FileReader("xxx.txt"));
    
    String line;
    ArrayList<String>list=new ArrayList<>();
    while((line=br.readLine())!=null){
    
    list.add(line);
    
    }
    br.close();

    BufferedWriter br=new BufferReader(new FileWriter("zzz.txt"));
    for(int i=line.size();i>=0;i--){ bw.write(list.get(i)); bw.nextLine(); }
    bw.close();

    IO流中的装饰设计模式————————————————————————————————————————————————————————————————————————————————————————

    设计模式的来源:设计模式最早来源于建筑行业,为了让对象更加容进行推广,进行程序化操作。

    装饰设计模式的实质就是对对象进行包装,让他更加具有操作性,在IO流中,Buffer就是一种装饰。装饰设计模式的好处是:耦合性不强,装饰类与被装饰类的变化无关。

                                                  

  • 相关阅读:
    快速排序
    冒泡排序算法
    设计模式之工厂方法模式
    调用存储过程修改
    取出字符串中的回车空格
    调用存储过程实例
    C++左值
    cocos2d-x 不规则形状按钮的点击判定
    C/C++
    字符函数库 cctype
  • 原文地址:https://www.cnblogs.com/lovelyYakir/p/5587345.html
Copyright © 2011-2022 走看看