zoukankan      html  css  js  c++  java
  • Java IO流

    IO流
      处理设备之间的数据传输
      按照方向分:输入流,输出流(相对于内存)
      按照操作的数据分:字节流,字符流
      按照角色分:节点流,处理流
    
      字节流:
        可以处理任何类型的数据,音频,视频,图片,文本
        编码:ASCII,ISO8859-1(欧洲编码),GBK,UTF-8
        以Stream结尾
        字节输入流父类:InputStream
        字节输出流父类:OutputStream
      字符流:
        基于字节流,在字节流的基础上融入了编码
        专门处理文本的
        字符输入流父类:Reader
        字符输出流父类:Writer
        根据设备选取对应的子类
      节点流:    
        向一个特定的IO设备读写数据的流     
        程序直接连接到实际的程序源,和实际的输入输出节点连接
      
      处理流:     
        对一个已存在的流进行连接或封装,通过封装后的流来实现读写功能
     

    Writer:

      1 创建文件输出流对象,并绑定文件
        文件不存在会自动创建
        文件存在会被覆盖
      2 使用文件输出流对象向文件写入数据
        write()
         此时没有写入到文件,写入到流中,流内部有一个字节数组,因为要查表
        flush()把流中的数据刷到文件中
          刷完之后可以继续写入
      3 关闭输入流,同时会刷新流中的数据到文件中
        close()
    
      文件续写:
     
        FileWriter(fileName, isAppend)//是否在fileName中追加数据     System.getProperty("line.separator");//获得系统换行的关键词

    Reader:  

       1 创建文件输入流对象,并绑定文件
        被读取的文件必须事先存在
      2 读取
        read()读取单个字符
          一次读一个,返回字符编码
          读到文件末尾,返回-1
      3 关流
      文件复制:
        读取被复制的文件     把读出来的数据写入到一个新的文件

    缓冲流:

    缓冲流:
      缓冲流不具备读或写的功能
      只是提高了数据读或写效率
      使用缓冲流必须结合读流或写流
      将被提高效率的写入流对象作为参数传递给缓冲流的构造方法
    
    BufferedWriter:
      
    write():写入到缓冲流的内部缓冲区 newLine():添加一个行分隔符,跨平台的写入换行的功能 BufferedReader:   readLine():一次读取一行   不包含最后的换行符 String line = null; while((line = br.readLine()) != null) {   System.out.println(line); }

    装饰设计模式:

    基于已经存在的功能提供增强功能
    解决某一类问题最便捷的方式
    
    装饰设计模式的好处:
      1 简化了原有体系
      2 装饰类还属于原体系
      eg: 
        BufferedReader
        LineNumberReader
    FileWriter:    writer()
    FileReader:    int read()    int read(char[])
    
    BufferedWriter:    newLine()
    BufferedReader:    readLine()

    InputStream:

    getBytes():编码
    available():返回文件总大小
      文件小时创建的数组和文件大小相同,可以只读一次,不需要循环
      文件过大时不适合
    
    FileInputStream fis = new FileInputStream("ss.txt");
    //创建一个长度为1024的容器
    byte[] arr = new byte[fis.available()];
    //实际读取的字节数
    int num = 0;
    while((num = fis.read(arr)) != -1)
    {
      System.out.print(new String(arr, 0, num));
    }    

    OutputStream:

    System.in:标准的输入
    InputStream in = System.in;
      和键盘设备关联在一起的字节输入流对象
    int num = in.read();//阻塞式方法 System.out:标准的输出

    转换流:

    指定编码
      InputStreamReader:将字节流转成字符流
      OutputStreamWriter:
    
    System.setIn():改变标准的输入
    System.setOut():改变标准的输出

    File:

    把文件或文件夹封装成对象的方式

    文件过滤器:

    FilenameFilter接口:
      重写accept(File dir, String name)方法
      对指定的dir进行迭代

    Properties:

    是一个map集合
    存储的是属性
    属性名和属性值必须都是字符串类型
    所以没有使用泛型
    
    可以和流使用的集合
    
    Properties pro = System.getProperties();
    
    //System.out.prinln(p);
    
    pro.list(System.out);

    打印流:

    字节打印流:printStream
      可以使用OutputStream的功能,增加了打印功能
      可以操作的目的:
        字符串类型的文件名
        File类型的文件
        字节输出流
    
    字符打印流:printWriter
      可以使用Writer的基本功能,增加了打印功能
      可以操作的目的:
        字符串类型的文件名
        File类型的文件
        字节输出流(可以自动刷新)
        字符输出流(可以自动刷新)

    合并流:(序列流)

    SequenceInputStream 

    序列化和反序列化:(对象流)

    序列化:存储对象
      ObjectOutputStream:
      标记接口:Serializable
        实现该接口无需实现任何方法,它只是表明该类的实例是可序列化的
      序列化的时候同时生成一个serialVersionUID来标记进行序列化的类
    反序列化:读取对象
      ObjectInputStream:
      ClassNotFoundException异常:
        找不到序列化对象的类
      InvalisClassException异常:
        即类的serialVersionUID不同
        建议自己声明serialVersionUID
    
    transient:瞬态
    修饰的成员不参与序列化

    如果文件中有若干个对象,使用对象读取流ois.readObject()时如何判读到结尾?
      

      1.将若干对象装入一个容器,然后将容器送入一个对象写入即可,读取时,只要读取一个对象即可
     
      2.可以直接使用EOFException来判断结束
        public static void main(String[] args) throws IOException, ClassNotFoundException
        {
            CompareByAge com = new CompareByAge(); 
            
            TreeSet<Person> set = new TreeSet<>(com);
            
            set.add(new Person("张三",90));
            set.add(new Person("李四",19));
            set.add(new Person("王五",93));
            set.add(new Person("赵六",92));
            set.add(new Person("分期",19));
            
            Iterator<Person> ite = set.iterator();
            while(ite.hasNext())
            {
                System.out.println(ite.next());
            }
            
            writeToFile(set);
        }
        public static void writeToFile(TreeSet<Person> set) throws IOException, ClassNotFoundException
        {
            //使用对象流将集合写入test.txt文件中
            FileOutputStream fos = new FileOutputStream(new File("D:\Test\test.txt"));
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            
            Iterator<Person> ite = set.iterator();
            while(ite.hasNext())
            {    
                oos.writeObject(ite.next());
            }
            oos.close();
            
            FileInputStream fis = new FileInputStream(new File("D:\Test\test.txt"));
            ObjectInputStream ois = new ObjectInputStream(fis);
            
            try{
                while(true)
                {
                    Person person = (Person)ois.readObject();
                    System.out.println("******:"+person);
                }
            }catch(EOFException e)
            {
                //已从流中读完
            }finally
            {
                ois.close();
            }        
        }

    RandomAccessFile:

    随机访问文件
      不属于io体系,只能访问文件
      内部既有字节输入流,也有字节输出流(既可以读也可以写)
      内部有一个字节数组,使用指针操作该数组,从而实现的随机访问

    数据流:

    操作基本数据类型:
      DataOutputStream:
      DataInputStream:

    内存流:

    ByteArrayOutputStream:
      向内存中写
    ByteAarrayInputStream:
      从内存中读
      内存流不需要close()

    编码和解码:

    编码:
    byte[] getBytes():
      使用平台的默认字符集将此String编码为byte序列,并将结果存入一个新的byte数组中
    byte[] getBytes(CharSet chaeser):
      使用给定的charset将此String编码到byte序列,并将结果存储到新的byte数组中
    
    解码:
    String(byte[] bytes):
      通过平台的默认字符集解码指定的byte数组,构造一个新的String
    String(byte[] bytes, Charset charset):
      通过指定的charset解码指定的byte数组,构造一个新的String
    
    编码编对了,解码肯定能解对
    编码编错了,不能解对了
  • 相关阅读:
    好用的镜头站下载工具
    300+Jquery, CSS, MooTools 和 JS的导航菜单资源
    股票入门2
    MEF学习笔记(6):出口和元数据
    MEF学习笔记(5):迟延加载导出部件
    WinForm控件复杂数据绑定常用数据源(如:Dictionary)(对Combobox,DataGridView等控件DataSource赋值的多种方法)
    wpf 多线程绑定控件
    HTTP 错误 404.2 Not Found 由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面
    ADODB.Stream 错误 '800a0bbc' 写入文件失败。
    'System.Windows.StaticResourceExtension' threw an exception
  • 原文地址:https://www.cnblogs.com/roxy/p/7300693.html
Copyright © 2011-2022 走看看