zoukankan      html  css  js  c++  java
  • Java基础 -- IO流

    IO流

    1.概念

    1. 流:数据传输通道

    2. 模型:采用Decorator装饰者模式。依照功能可以对流进行分类。

    2.分类

    1. 按数据流方向:

      • 输入流
      • 输出流
    2. 按传输类型:

      这4种均是抽象流,为所有IO流的超类

      • 字节流(用来处理图像,视频,PPT,Word)
        • Reader
        • Writer
      • 字符流(只能处理纯文本)
        • InputStream
        • OutputStream

      字符字节流区别:

      • 字节输出流没有缓冲区,直接输出,字符流必须经过缓冲区,正常情况下只有调用close()才会输出,否则需要手动调用flush()才可输出

        字节 字符
        读写单位 Byte 字符(根据码表映射)
        处理对象 视频,图片 纯文本(优先考虑
    3. 按功能:

      • 节点流:特定节点读取数据的过程
      • 处理流:连接和封装一个已存在的流,通过该封装流调用实现数据读写。ep:BufferedReader。处理流的构造方法传入一个流对象作参数。
    4. 字符流:Java中采用Unicode标准,字符流指基于字节流读取查询对应的Unicode表。

    3.特性

    1. FIFO,先写入的数据也先被读取
    2. 顺序存取,不可随机访问。(RandomAccessFile可从任意位置访问IO,此类继承自Object)
    3. 只读/只写,流只有一种功能,传输通道同时存在需要两个流。

    4.五类一接口

    Java.io包:

      • File:文件特征与管理,对文件系统中文件以及文件夹进行封装的对象,可通过对象的思想操作文件和文件夹,保存文件或目录的元数据信息,包括文件名,文件大小,最后修改时间,是否可读,获取文件路径,判断文件是否存在,获取当前文件列表,创建/删除文件或目录

      • InputStream

      • OutputStream

      • Reader

      • Writer

        RandomAccessFile:随机文件操作

    • 接口:Serializable

    5.IO流对象

    6.System类

    输入输出 读取方式
    System.out(标准输出) 显示器
    System.err(标准错误输出) 显示器
    System.in(标准输入) 键盘输入

    7.Scanner

    //字节流套接
    Scanner(InputStream source)
    //字符流套接
    Scanner(Readable source)
    

    8.序列化

    1. 序列化:具体对象数据 --> 二进制数据

      • 实现方法:java.io.Serializable
    2. 反序列化:二进制数据 --> 具体对象数据

      • 实现方法:Object readObject()方法从ObjectInputStream读取对象
      • 基本类型和String默认都实现了这个接口,所以不需要处理。

      • 类中的一个属性不参与序列化:transient,表示标记的属性不参与序列化。

        transient关键字:某些属性不需要保存。

        private transient String name;
        
      • static定义的变量也不参与序列化。

    3. 标记接口:Serializable,Cloneable.

      只定义了一种功能,没有具体内容。它的功能由JVM实现。

    优先使用的:

    输入流 输出流
    字节流 Scanner(首选 printStream(打印流)
    字符流 BufferReader(次选,缓冲流) printWriter(打印流)
    Scanner简单不赘述
    BufferedReader
    1. 单字符
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class BRRead {
        //单字符读写
        public static void main(String[] args) throws IOException {
            char c;
            //使用System.in创建BufferedReader
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("输入'q'退出:");
            /*读取:读取一个字符使用read()方法
                int read() throws IOException
             */
            do{
                c = (char)br.read();
                System.out.println("退出");
            }while(c != 'q');
        }
    
    }
    
    1. 字符串

      import java.io.BufferedReader;
      import java.io.IOException;
      import java.io.InputStreamReader;
      
      public class BRReadLine {
          //多字符读取
          public static void main(String[] args) throws IOException {
              String str;
              //System.in创建BufferedReader
              BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
              System.out.println("请输入一行字符如'end'来结束");
              /*读取一行字符
                  String readLine() throws IOException
               */
              do{
                  str = br.readLine();
                  System.out.println("您输入了一行字符,已退出");
              }while(!str.equals("end"));
          }
      }
      
      
    2. FileInputStream

      import java.io.FileInputStream;
      import java.io.FileNotFoundException;
      import java.io.IOException;
      
      public class Fileinputstream {
          public static void main(String[] args) throws IOException {
              int i = 0;
              FileInputStream fi = null;
              try {
                  fi = new FileInputStream("C:\Users\Administrator\Desktop\a.txt");
              } catch (FileNotFoundException e) {
                  System.out.println("找不到文件");
                  System.exit(-1);
              }
      
              try {
                  int num = 0;//计数
                  while((i=fi.read()) != -1){
                      System.out.println((char)i);
                      num++;
                  }
                  fi.close();
                  System.out.println("传输个数:"+num);
              } catch (IOException e) {
                  System.out.println("读取文件错误");
              }
          }
      }
      
    3. FileOutputStream

      import java.io.FileInputStream;
      import java.io.FileOutputStream;
      import java.io.IOException;
      
      public class Fileoutputstream {
          public static void main(String[] args) throws IOException {
              int i = 0;
              FileInputStream fi = null;
              FileOutputStream fo = null;
              try {
                  fi = new FileInputStream("C:\Users\Administrator\Desktop\a.txt");
                  fo = new FileOutputStream("C:\Users\Administrator\Desktop\b.txt");
                  while((i=fi.read())!=-1){
                      fo.write(i);
                      System.out.println((char)i);
                  }
                  fi.close();
                  fo.close();
                  System.out.println("文件已复制");
              } catch (IOException e) {
                  System.out.println("文件复制错误");
                  System.exit(-1);
              }
          }
      }
      
    4. Reader,Writer

      import java.io.FileReader;
      import java.io.FileWriter;
      import java.io.IOException;
      
      public class Filereaderwriter {
          public static void main(String[] args) throws IOException {
              int i = 0;
              try {
                  FileReader fr = new FileReader("C:\Users\Administrator\Desktop\a.txt");
                  FileWriter fw = new FileWriter("C:\Users\Administrator\Desktop\c.txt");
                  while((i=fr.read())!=-1){
                      fw.write(i);
                      System.out.println((char)i);
                  }
                  fr.close();
                  fw.close();
              } catch (IOException e) {
                  System.out.println("文件复制错误");
              }
          }
      }
      
  • 相关阅读:
    IOS Charles(代理服务器软件,可以用来拦截网络请求)
    Javascript中addEventListener和attachEvent的区别
    MVC中实现Area几种方法
    Entity Framework Code First 中使用 Fluent API 笔记。
    自定义JsonResult解决 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
    序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
    An entity object cannot be referenced by multiple instances of IEntityChangeTracker 的解决方案
    Code First :使用Entity. Framework编程(8) ----转发 收藏
    Code First :使用Entity. Framework编程(6) ----转发 收藏
    Code First :使用Entity. Framework编程(5) ----转发 收藏
  • 原文地址:https://www.cnblogs.com/bwxx/p/13174450.html
Copyright © 2011-2022 走看看