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());
            }
        }
    
    }
  • 相关阅读:
    关于闹钟的题
    【历史】- UNIX发展史(BSD,GNU,linux)
    使用EF操作Mysql数据库中文变问号的解决方案
    javascript方法的方法名慎用close
    使用VS2013 + EF6 + .NET4.5 连接Mysql数据库
    ADO.NET生成的数据库连接字符串解析
    在WebBrowser控件使用js调用C#方法
    Mysql数据库之auto_increment
    Visual Studio插件Resharper 2016.1 及以上版本激活方法【亲测有效】
    Windows下Mysql5.7开启binlog步骤及注意事项
  • 原文地址:https://www.cnblogs.com/caiguoxin/p/9067491.html
Copyright © 2011-2022 走看看