学习I/O流的学习总结

什么是流:内存与存储设备之间传输数据的通道,数据借助流传输
《-------------按方向分类--------------》
输入流:将<存储设备>中的内容读入到<内存>z中。input
输出流:将<内存>中的内容写入到<存储设备>中。output
《-------------按单位分类--------------》
字节流:以字节为单位,可以读写所有数据
字符流:以字符为单位,只能读写文本数据
《-------------按功能分类--------------》
节点流:具有实际传输数据的读写功能
过滤流:在节点流的基础之上增强功能
<------------------------------------------------------------------------------>
字节流的父类(抽象类):{
    InputStream:字节输入流
    OutputStream:字节输出流
文件字节流
    FileInputStream; 
    public int read (byte[ ] b)//从流中读取多个字节,将读到内容存入b数组,返回实际读到的字节数;如果达到文件尾部,则返回-1;
     FileInputStream fileInputStream = new FileInputStream("E:\\ch1\\之上.txt");//创建FileInputStream,并指定文件路径,*抛出异常
            byte a[]=new byte[3];
            int count = 0 ;
            while ((count=fileInputStream.read(a))!=-1){
                System.out.println(new String(a,0,count));//把字符数组a的0到最后的数编程数组输出出来
    }//最后别忘了fileInputStream.close关闭流
    FileOutputStream;
    public void write(byte[ ] b)//一次写多个字节,将b数组中所有字节,写入输出流
<---------------------------------------------------------------------------------------------------------->
字节缓冲流:BufferedInputStream/BufferedOutputStream(提高IO效率,减少访问磁盘的次数;数据存储在缓冲区,flush是将缓存区的内容写入文件中,也可直接close)
BufferedInputStream:首先创建底层流  FileInputStream fileInputStream = new FileInputStream("E:\\ch1\\之上.txt");
                     BufferedInputStream buffer = new BufferedInputStream(fileInputStream);//填装底层流
            buffer.close();//别忘了关闭流
        输出方式于底层流类似//可以不用自定义缓冲区,因为BufferedInputStream自带缓冲区,也可自行创建,和底层流类似
BufferedOutputStream:首先创建底层溜 FileOutputStream fileoutputstraem =new FileOutputStream("E:\\ch1\\之上.txt");
                      BufferedOutputStream  buffer =  = new BufferedOutputStream(fileoutputstraem);//填装底层流
                buffer.write("xxx".getBytes());//写入缓冲区中,不直写硬盘
                buffer.flush();//刷新到硬盘的操作
                buffer.colse;//关闭流
<---------------------------------------------------------------------------------------------------------->
对象流:ObjectOutputStream/(序列化,对象转换为字节)ObjectInputStream/(反序列化,字节重构为对象)  (增强了缓冲区的功能,增强了读写8种基本数据类型和字符串功能,增强了读写对象的功能)
readObject()从流中读取一个对象;writeObject(Object obj)向流中写入一个对象
使用流传输对象的过程称为序列化,反序列化。
(序列化)使用ObjectOutputStream实现对象的序列化,*序列化的类必须要实现Serializable【序列化】接口(该接口无任何方法)
    1.创建底层流 fos;2.创建ObjectOutputStream流oos
    3.序列化:Person p1 = new Person("XX",20);
    oos.writeObject(p1);//把对象写入硬盘  别忘了关闭流
(反序列化)使用ObjectInputStream实现对象的反序列化,
    1,创建底层流fos;2,创建ObjectInputStream流ois
    3,反序列化:Persion p2 = (Persion)ois.readObject(p1);//ois.readObject()出来的是对象,转一下类型
##注意事项:在使用ObjectOutputStream实现对象的序列化时,序列化对象属性要求Serializable接口
       反序列化ID会影响反序列化(serialVersionUID),静态属性不能序列化 ,使用transient修饰属性,可以让属性不能序列化
        序列化多个对象,可以用集合解决。 
<----------------------------------------------------------------------------------------------------------------------->
字符编码{
ISO-8859-1收录除ASCII外,还包括西欧,希腊语,泰语,阿拉伯语,希伯来语对应的文字符号。
UTF-8:针对Unicode码表的可变长度字符编码
GB3212:简体中文//GBK:简体中文,扩充//BIG5:台湾,繁体中文}
字符流{
字符流的父类(抽象类):Reader字符输入流,Writer字符输出流。
文件字符流:FlieReader: public int read(char[ ] c)从流中读取多个字符,将内容存入c数组,返回实际读到的字符数;如果达到文件的尾部,返回-1,使用方式和文件字节输入流类似
    FileWriter:public void write(String str) 一次写多个字符,将b数组中所有字符,写入输出流//E://xxx//xx.txt
    文件复制:与文件字节流相似,但是文件字符流不能复制图片和二进制文件
字符缓冲流BufferedReader/BufferdeWriter:高效读写,支持输入换行符,可一次写一行,读一行。
BufferedReader 使用字节缓冲流读取文件:基本操作与上边的类似,但是多了一个read.Line()方法,一次读一行
         String str= null;
        while ((str=bufferedReader.readLine())!=null){
            System.out.println(str);
        }
BufferedWriter 使用字节缓冲流写入文件:基本操作与上边的类似,但是多了一个new.Line()方法,自动换行省去了\r\n
<--------------------------------------------------------------------------------------------------------------->
打印流PrintWriter:封装了print()/println()方法,支持写入后换行;支持数据原样打印类似于基础流
    PrintWriter pw = new PrintWriter("E://xx//xxx.txt");
    pw.println();pw.print()//向文件里面打印
<--------------------------------------------------------------------------------------------------------------->
转换流:桥转换流:InputStreamReader/OutputStreamWriter——可将字节流转换为字符流。可设置字符的编码方式
    首先创建基础的字节流,在创建桥转换流并且声明编码方式
        FileInputStream fileInputStream = new FileInputStream("E:\\ch2\\new.txt");
        InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"utf-8");
    输出方式:和上面类似,由于是变成字符流,所以用char强转型(OutputStreamWriter类似)
<--------------------------------------------------------------------------------------------------------------->
File类:代表物理盘符中的一个文件或者文件夹。
方法(文件操作):
          createNewFile()//创建一个新文件
          mkdir()//创建一个新目录
          delete()//删除文件或空目录     deleteOnExit()//jvm退出时自动删除
          exists()//判断File对象所代表的对象是否存在
          getAbsolutePath()//获取文件的绝对路径           Thread.sleep()//休眠
          getName()//取得名字           getParent()//获取文件/目录所在的目录       
          isDirectory()//是否是目录      isFile()//是否是文件     lengh()//获取文件的的长度
          listFiles()//列出目录中的所有内容       renameTo()//修改文件名为 
          can.Write()//判断是否能读        isFile()//判断是否是文件      isHidde()//是否隐藏
          lastModified()//返回文件创建时间long类型的         (new Date(file.lastModified()).toLocaleString())转换成Date类型并且变成字符串
          exists()函数是Java中File类的一部分。此函数确定是否存在以抽象文件名表示的文件或目录。如果抽象文件路径存在,则该函数返回true,否则返回false
方法(文件夹操作)
           getAbsolutePath()//获取文件夹的绝对路径    getPath()//获取路径        getName()//获取最底层的文件夹名字
            getParent()//获取文件/目录所在的目录          mkdir()//创建单级目录           mkdirs()//创建多层文件夹
            delete()//删除空目录的底层文件夹                 deleteOnExit()//使用jvm删除空目录的底层文件夹 
            lastModified()//返回文件夹创建时间long类型的         (new Date(dir.lastModified()).toLocaleString())转换成Date类型并且变成字符串
            isDirectory()//判断是否为文件夹               isHidden()//判断文件夹是否隐藏
便利文件夹:  File dir = new File("d:\\xxx");
                       String[] files = dir.list();// 用list()方法返回字符串数组
         for(String str:files){sout(string);}// 用for each循环便利
FileFilter接口的使用
    File [] file = dir.ListFiles(new FileFilter(){};) 匿名内部类实现方法         pathname.getName().endWith(".jpg")过滤文件尾名为.jpg
    foreach便利file数组
递归遍历

import java.io.File;

public class Demo10 {
    public static void main(String[] args) {
        add(new File("E:\\ch2"));
        pdd(new File("E:\\ch2"));
    }
    public static  void add(File dir){//递归方法查看文件夹内部
        File[] file = dir.listFiles();
        System.out.println(dir.getAbsolutePath());
        if (file!=null&&file.length>0){
            for (File file1:file){
                if (file1.isDirectory()){//如果是文件夹重新调用add方法
                    add(file1);
                }
                else {//不是文件夹直接获取文件名
                    System.out.println(file1.getAbsolutePath());
                }
            }
        }

    }
    public static  void  pdd(File dir){//递归方法删除文件夹
        File[] file = dir.listFiles();
        if (file!=null&&file.length>0){
            for (File file1:file) {
                if (file1.isDirectory()){
                    pdd(file1);//如果是文件夹直接再次调用pdd方法
                }
                else {//不是文件夹直接删除文件
                    System.out.println("删除"+file1.delete());
                }
            }
            dir.delete();//删除文件夹
            }
        }
    }


    }
      }
}
补充:Properties 属于集合(存储属性名和属性值,属性名和属性值都是字符串类型,没有泛型,和流有关)
    Properties p = new Properties();//类似于键值对
               p.setProperty();//添加属性
遍历      keySet--------entrySet  ;
     Set<String> propertyNames   = p.stringPropertyNames();//独特的遍历
     for (String pro:propertyNames){
         System.out.println(pro+"="+p.getProperty(pro));
和流有关的方法    list方法    properties.list(pw)//pw为打印流
                                store方法(保存)     properties.store(fos,"注释");fos为字节输出或字符输出流
        load方法(加载)        properties2.load(fis);//用新的 properties2去接受,fis为字节输入或字符输入流
     }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值