1.3.4 Java I/O系统

1.3.4 Java I/O系统

IO(输入/输出)指的是计算机与外部世界,或者一个程序与计算机的其余部分之间的接口,它对于任何计算机系统都非常关键。

1.3.4.1 概述

流(Stream)

只能以事先规定好的顺序被读取一次的数据的一个序列

流的特性
  1. 含有流质—在计算机中,流质就是数据
  2. 方向性—方向就是读或写

1.3.4.2 流的分类

  1. 按照数据流的方向
    • 输入流—继承抽象类InputStreamReader
    • 输出流—继承抽象类OutputStreamWriter
  2. 按照处理数据的最小单元
    1. 字节流— 以byte为最小单位
    2. 字符流—以char为最小单位
  3. 按照功能
    1. 节点流(低级流)—节点流是直接可以从/向一个特定的数据源读/写数据的流
    2. 操作流(高级流)—操作流不直接连接到设备,而是连接到已存在的流之上,通过对数据的处理为程序提供更强大的读写功能

1.3.4.3 I/O操作步骤

  1. 选择流
  2. 建立流(new)
  3. 操作流
  4. 关闭流

    操作示例

    1. 输出流

      
          String str = "窗前明月光,疑是地上霜。";//要输出的字符串
          FileWriter fw = null;//选择流,这里是输出流,所以是Writer,
          //输出目标是文件,所以用FileWriter
          try {
              fw = new FileWriter("e:/poem.txt");//建立流
              fw.write(str);//操作流,这里调用wirite方法将字符串写到文件中
          } catch (IOException e) {
              e.printStackTrace();
          } finally {
              if (fw!=null) {
                  try {
                      fw.close();//关闭流
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
          }
    2. 输入流

      
          String poemStr = "";
          FileReader fr = null;//选择流,输入流选择Reader
          //数据来源是File所以是FileReader
          try {
              fr = new FileReader("poem.txt");//建立流
              int c = 0;//FileReader的read()方法返回的是int类型
              //不返回char的原因是用int作为返回类型可以用-1表示已读完数据
              while ((c=fr.read())!=-1) {
                  poemStr += (char)c;//将读出的字符转换并进行拼接
              }
              System.out.println(poemStr);//控制台打印验证
          } catch (FileNotFoundException e) {
              e.printStackTrace();
          } catch (IOException e) {
              e.printStackTrace();
          } finally {
              if (fr!=null) {
                  try {
                      fr.close();//关闭流
                  } catch (IOException e) {
                      e.printStackTrace();
                  }
              }
          }
    3. 字节文件拷贝

        FileInputStream fin = null;//选择流
        FileOutputStream fou = null;//选择流
        try {
            fin = new FileInputStream("e:/poem.txt");//建立流
            fou = new FileOutputStream("d:/poemCopy.txt");//建立流
            byte[] b = new byte[1024];//做缓存
            int len = 0;//记录每次有效读取多少个字节(关键是最后一次)
            while ((len=fin.read(b))!=-1) {
                fou.write(b,0,len);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (fin!=null) {
                try {
                    fin.close();//关闭流
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if (fou!=null) {
                try {
                    fou.close();//关闭流
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
4. 对象的序列化
//前置条件要序列化的对象必须实现Serializable接口,这也是JavaBean的规范之一
        StudentBean stu = new StudentBean("Coder_Watson");
        //这里随便写了一个实现Serializable接口的类
        ObjectOutputStream oos = null;//选择流
        try {
            oos = new ObjectOutputStream(
            new FileOutputStream("student.data"));
            //建立流,这里进行了流的对接
            oos.writeObject(stu);//操作流,调用writeObject(Object o)方法写入
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (oos!=null) {
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
5. 对象的反序列化
        StudentBean theStu = null;//用这个来接反序列化的对象
        ObjectInputStream ois = null;//选择流
        try {
            ois = new ObjectInputStream(
            new FileInputStream("student.data"));//建立流,这里也进行了流的对接
            theStu = (StudentBean) ois.readObject();
            //操作流,调用readObject()方法
            System.out.println(theStu.getName());
            //验证反序列化是否成功,控制台应打印出Coder_Watson
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (ois!=null) {
                try {
                    ois.close();//关闭流
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值