zoukankan      html  css  js  c++  java
  • JavaFile I/O

    Java流类图结构:

    流的概念和作用:

    流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。及数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将抽象为各种类,方便更直观的进行数据操作。

    IO流的分类:

    • 根据处理数据类型的不同分为:字符流和字节流
    • 根据数据流向不同分为:输入流和输出流

    字符流和字节流:

    字符流的由来:因为数据编码的不同,而又了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查指定的码表。

    字节流和字符流的区别:

    • 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节
    • 处理对象不同:字节流能处理所有类型(如图片,avi等),而字符流只能处理字符类型的数据。
    • 字节流:一次读入或读出8位二进制。
    • 字符流:一次读入或读出是16为进制。

    设备上的数据无论是图片或者视频,文字,它们都以二进制存储的。二进制的最终都是以一个8位为数据单元进行体现,所以计算机中的最小数据单元就是字节。意味着,字节流可以处理设备上的所有数据,所以字节流一样可以处理字符数据。

    结论:只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。

    输入流和输出流:

    输入流只能进行读操作,输出流只能进行写操作,程序中需要根据待传输数据的不同特征而使用不同的流

    输入字节流InputStream:

    • InputStream是所有的输入字节流的父类,他是一个抽象类。
    • ByteArrayInputStream,StringBufferInputStream,FileInputStream三种基本的介质流,它们分别从Byte 数组StringBuffer、和本地文件中读取数据。
    • PipedInputStream 是从与其它线程共用的管道中读取数据,与Piped 相关的知识后续单独介绍。
    • ObjectInputStream 和所有FilterInputStream 的子类都是装饰流(装饰器模式的主角)。

    InputStream示例:输入文件内容

    //流:作用:打通硬盘和内存的通道    创建了一个和硬盘上文件绑定的文件流  
            FileInputStream fis=new FileInputStream("E:\S2230班级.txt");
            //创建缓存区大小是1k  承载1k数据的一个缓冲区    大家:就是内存中的一块区域  。主要是在内存和硬盘之间做数据交换的临时存储区
            byte[] bytes=new byte[1024];
            int data = 0;
            //注释  :有效字节数
            StringBuffer sb=new StringBuffer();
            //由于一个文件的本身物理大小一定要远远大于缓冲区的大小。就是循环读取。
            //无论是那种语言,咱们读取的时候,都用read(byte[]方案) 将一部分数据通过fis流的通道放入缓冲区
            //data:read()返回的是本次读取到缓存区中的有效字节数  
            //拿有效字节数和   -1对比  ,如果是-1 证明  已经读取到了流的末尾 ,循环自动退出,不进行下一次读取操作了
            while((data=fis.read(bytes))!=-1){  //文件没有读取完毕,下次需要继续读取
                //没读取一次,将读取到的字节内容,转成字符串
                //bytes ------> String
                String temp=new String(bytes,0,data);   //读取到缓存区中的有效字节数,转成字符串,因为用户眼睛只能 看到字符串
                sb.append(temp);
                System.out.println("=====有效字节数====="+data);
            }
            System.out.println(sb.toString());
            //读取或者写入完成,一定要关流。。。底层已经做了很多的预置工作。 
            fis.close();//文件 数据库  稀缺资源,别忘了关

    输出字节流 OutputStream:

    • OutputStream 是所有的输出字节流的父类,它是一个抽象类。
    • ByteArrayOutputStreamFileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。
    • PipedOutputStream 是向与其它线程共用的管道中写入数据。
    • ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流。

    总结:

    • 输入流:InputStream或者Reader:从文件中读到程序中;
    • 输出流:OutputStream或者Writer:从程序中输出到文件中

    FileOutputStream示例:输出文件

        public static void main(String[] args) {
            try {
                writeDataToDisk();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        private static void writeDataToDisk() throws Exception {
            FileOutputStream fis=new FileOutputStream("F:\晚自习.txt");
            String temp="今天下雨!!!!!!!!!!!!";
            byte[] bs=temp.getBytes();
            fis.write(bs);
            fis.close();
            System.out.println("成功");
        }
    
    }

    字符输入流Reader类:    Reader类是读取字符流抽象类 我们需要通过子类来实例化使用它

    Reader示例:

        public static void main(String[] args) throws Exception {
            // TODO Auto-generated method stub
       FileReader reader=new FileReader("E:\1.txt");
       char[] cs=new char[1024];
       int data=0;
       /*
        * Vector 线程安全的ArrayList是线程安全的   ---Vector
        * 不要以为集合本身是安全的,你用这个集合存储的数据就一定能保证线程安全
        * 自己控制
        */
       StringBuffer sBuffer=new StringBuffer();
       while ((data=reader.read(cs))!=-1) {
        String temp=new String(cs, 0, data);
        sBuffer.append(temp);
        
    }
       System.out.println(sBuffer.toString());
       reader.close();
        }
    
    }

    字符输入BufferedReader类:

    BufferedReader是缓冲字符输入流,继承于Reader,BufferedReader的作用是为其他字符输入流添加一些缓冲功能。

    public static void main(String[] args) throws Exception {
            Reader reader=new FileReader("F:\晚自习.txt");
            BufferedReader vReader=new BufferedReader(reader);
            String linr=vReader.readLine();

    字符输出流Writer类:

    Writer是一个字符流,它是一个抽象类,所以要使用它,也必须通过其子类来实例化它后才能使用它

    示例1:

    //覆盖
            FileWriter writer=new FileWriter("F:\晚自习.txt");
            writer.write("=====今天下雨!!!=====");
            writer.close();
            System.out.println("成功");

    示例2:

      Writer writer=new FileWriter("F:\晚自习.txt");
           BufferedWriter be=new BufferedWriter(writer);
           be.write("
    我是第三行");
           be.newLine();//换行
           be.write("第四行");
           be.close();
           System.out.println("成功");

    使用字节流类DataInputStream,DataOutputStream读二进制文件:

    示例:

        public static void main(String[] args) throws Exception {
            // TODO Auto-generated method stub
      InputStream stream=new FileInputStream("F:\jhkj.png");
          DataInputStream dStream=new DataInputStream(stream);
          
          OutputStream oStream1=new FileOutputStream("E:\集合框架.png");
        DataOutputStream dStream2=new DataOutputStream(oStream1);
          byte[] in=new byte[1024];
          int data=0;
          while ((data=dStream.read(in))!=-1) {
            dStream2.write(in,0,data);     
            
        }
          dStream2.close();
          oStream1.close();
          dStream.close();
          stream.close();
          System.out.println("adsadasdas");
        }
    
    }

    补充序例化and反序例化:

    序例化:

    public static void main(String[] args) throws IOException {
            OutputStream os=new FileOutputStream("save.bin");
            ObjectOutputStream ob=new ObjectOutputStream(os);
            List<Book> list=new ArrayList<Book>();
            Book b1=new Book("大话设计模式", 52);
            Book b2=new Book("大话数据结构", 62);
            list.add(b1);
            list.add(b2);
            
            ob.writeObject(list);
            System.out.println("serialize success");
        }
    
    }

    反序例化:

        public static void main(String[] args) throws IOException, ClassNotFoundException {
            InputStream iStream=new FileInputStream("save.bin");
              ObjectInputStream oStream=new ObjectInputStream(iStream);
              List<Book> list=(List<Book>)oStream.readObject();
              for (Book book : list) {
                System.out.println(book.getName());
            }
        }
    
    }
  • 相关阅读:
    Atitit.ati orm的设计and架构总结 适用于java c# php版
    Atitit.ati dwr的原理and设计 attilax 总结 java php 版本
    Atitit.ati dwr的原理and设计 attilax 总结 java php 版本
    Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全
    Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全
    Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结
    Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结
    atitit.基于  Commons CLI 的命令行原理与 开发
    atitit.基于  Commons CLI 的命令行原理与 开发
    atitit.js 与c# java交互html5化的原理与总结.doc
  • 原文地址:https://www.cnblogs.com/caiguoxin/p/9067491.html
Copyright © 2011-2022 走看看