• 流 Stream
    • 把数据的读写,抽象成数据在管道中流动.
    • 流是单向的
      • 输入流, 只能用来读取数据
      • 输出流, 只能用来输出数据
    • 流只能顺序读写数据
      • 流只能一次性从头到尾读写数据
      • 流动过的数据,不能反复流动
      • 重复读写数据,只能重新新建流
  • InputStream/OutputStream
    • 字节流的抽象父类
    • 方法
      • write(int b);
      • write(byte[]);
      • write(byte[] , start, length);
      • flush();刷出缓存数据
      • read();
      • read(byte[] buff);批量读取,返回读取的数据数量
      • available(); 剩余可读取的字节数量
  • FileInputStream/FileOutputStream
    • 直接插在文件上, 读写文件数据
    • 创建对象
      • new FileOutputStream(文件);

        • 不管文件是否存在, 都会新建一个空文件
        • 如果文件存在, 空文件会覆盖原文件
      • new FileOutputStream(文件, true);
        • 文件存在,追加数据
    • package day1302;
      
      import java.io.FileOutputStream;
      import java.io.IOException; public class Test1 {
      public static void main(String[] args) throws IOException { // 新建文件输出流
      FileOutputStream outF =
      new FileOutputStream("/Users/dingzhijie/Desktop/file.txt");
      outF.write(97);
      outF.write(98);
      outF.write(99);
      outF.write(356); byte[] a =
      {101,102,103,104,105,106,107,108,109,110};
      outF.write(a); outF.write(a, 2, 4);

      outF.close();

          }
      }
      package day1302;
      
      import java.io.FileInputStream;
      import java.io.IOException;
      import java.util.Arrays; public class Test2 {
      public static void main(String[] args) throws IOException { FileInputStream inputF; // 因为流只能读取一次数据, 所以需要重复创建 inputF =
      new FileInputStream("/Users/dingzhijie/Desktop/file.txt"); // 单字节读取
      int b;
      while ((b = inputF.read()) != -1) {
      System.out.println(b);
      } inputF.close(); inputF =
      new FileInputStream("/Users/dingzhijie/Desktop/file.txt"); // 批量读取
      int c;
      byte[] buff = new byte[5];
      while ((c = inputF.read(buff)) != -1) {
      System.out.println(c+"\t"+Arrays.toString(buff));
      } inputF.close(); }
      }


    • 复制文件
    • package day1302;
      
      import java.io.File;
      import java.io.FileInputStream;
      import java.io.FileOutputStream;
      import java.util.Scanner; public class Test3 {
      public static void main(String[] args) { // 文件复制
      System.out.println("源文件:"); String s1 = new Scanner(System.in).nextLine(); File from = new File(s1); if (!from.isFile()) {
      System.out.println("不是文件");
      return;
      } System.out.println("目标文件");
      String s2 = new Scanner(System.in).nextLine(); File to = new File(s2); if (to.isDirectory()) {
      System.out.println("不能是文件夹");
      return;
      } try {
      copy(from,to);
      System.out.println("复制完成");
      } catch (Exception e) {
      System.out.println("复制失败");
      e.printStackTrace();
      } } // 首先添加异常的抛出管道
      private static void copy(File from, File to) throws Exception { /*
      * 在源文件上插入输入流, 输入数据到内存
      * 在目标文件上插入输出流, 从内存输出数据到目标文件
      *
      */ // 循环批量读取
      // 然后向目标文件输出 FileInputStream in = new FileInputStream(from);
      FileOutputStream out = new FileOutputStream(to); byte[] buff = new byte[8192];
      int n;
      while ((n = in.read(buff)) != -1) {
      out.write(buff, 0, n);
      } in.close();
      out.close(); }
      }
  • 高级流 .  操作流
    • 与其他流相接, 提供特定的数据处理功能
    • 对高级流的操作, 会对相接的流执行相同操作
      • 关闭最后的高级流,会同样关闭相接的其他流 
  • BufferedInputStrwam/BufferedOutputStream
    • 缓冲流
    • 提供内存缓冲数组
    • 用来提高单字节的读写效率
    • 作用
      • 帮助单字节读取批量读写操作
      • 提高单字节读取效率,对批量读取效率提高无效
    • package day1303;
      
      import java.io.BufferedOutputStream;
      import java.io.FileOutputStream;
      import java.io.IOException; public class Test1 {
      public static void main(String[] args) throws IOException { /*
      *
      */
      String path = "/Users/dingzhijie/Desktop/file3.txt";
      BufferedOutputStream bout =
      new BufferedOutputStream(new FileOutputStream(path)); bout.write(97);
      bout.write(98);
      bout.write(99); // 写入数据是,先写入 BufferedOutputStream 内部的缓存数组中
      // 满 8192 (8k) 数量, 会自动触发批量写入操作,不满不会触发 // 此时 三个数据 不会自动触发写入操作
      // 需要手动刷出缓存
      bout.flush(); /*
      * 高级流的 close 方法
      * 会先执行 flush();
      * 然后关闭相接的流
      */
      bout.close(); }
      }


    • 使用 BufferedInputStream / BufferedOutputStream 文件复制

    • package day1302;
      
      import java.io.BufferedInputStream;
      import java.io.BufferedOutputStream;
      import java.io.File;
      import java.io.FileInputStream;
      import java.io.FileOutputStream;
      import java.util.Scanner; public class Test4 {
      public static void main(String[] args) { // 文件复制
      System.out.println("源文件:"); String s1 = new Scanner(System.in).nextLine(); File from = new File(s1); if (!from.isFile()) {
      System.out.println("不是文件");
      return;
      } System.out.println("目标文件");
      String s2 = new Scanner(System.in).nextLine(); File to = new File(s2); if (to.isDirectory()) {
      System.out.println("不能是文件夹");
      return;
      } try {
      copy(from,to);
      System.out.println("复制完成");
      } catch (Exception e) {
      System.out.println("复制失败");
      e.printStackTrace();
      } } // 首先添加异常的抛出管道
      private static void copy(File from, File to) throws Exception { /*
      * 在源文件上插入输入流, 输入数据到内存 input
      * 在目标文件上插入输出流, 从内存输出数据到目标文件 output
      *
      */ // 使用 BufferedInputStream / BufferedOutputStream 单字节读写 FileInputStream in = new FileInputStream(from);
      BufferedInputStream bin = new BufferedInputStream(in); FileOutputStream out = new FileOutputStream(to);
      BufferedOutputStream bout = new BufferedOutputStream(out); int n;
      while ((n = bin.read()) != -1) {
      bout.write(n);
      } bin.close();
      bout.close(); }
      }
  • ObjectInputStream / ObjectOutputStream  对象序列化. 反序列化
    • 序列化
      • 对象的信息,按固定的格式,转成一串字节序列输出
    • ObjectOutputStream 对象序列化
      • writeObject(Object);
        • 把对象序列化输出
    • package day1304;
      
      import java.io.FileOutputStream;
      import java.io.IOException;
      import java.io.ObjectOutputStream; public class Test1 {
      public static void main(String[] args) throws IOException { /*
      *
      * 把Student 对象序列化输出 , 保存到文件
      *
      * ObjectOutputStream FileOutputStream
      *
      */ Student s1 = new Student(12, "张三", "男", 17); String path = "/Users/dingzhijie/Desktop/file4.txt"; FileOutputStream fos = new FileOutputStream(path);
      ObjectOutputStream ofos = new ObjectOutputStream(fos); ofos.writeObject(s1); ofos.close(); // 注意: 被序列化的对象的类 必须 实现 Serializable 接口
      // Serializable 是一个空接口,不需要实现任何抽象方法
      // 只是做一个标识,标识这个类的对象可以被序列化 }
      }
    • ObjectInputStream
      • readObject();
        • 读取对象的序列化数据
        • 反序列化恢复对象
    • package day1304;
      
      import java.io.FileInputStream;
      import java.io.IOException;
      import java.io.ObjectInputStream; public class Test2 {
      public static void main(String[] args) throws IOException, ClassNotFoundException { /*
      * 读取序列化数据
      * 反序列化恢复学生对象
      * 插入文件输入流
      */ String path = "/Users/dingzhijie/Desktop/file4.txt";
      FileInputStream fis = new FileInputStream(path);
      ObjectInputStream bfis = new ObjectInputStream(fis); Object s1 = bfis.readObject();
      Student s = (Student) s1;
      System.out.println(s.toString()); bfis.close();
      }
      }
    • 不序列化的成员
      • static ,属于类, 不随对象被序列化输出
      • transient , 临时,
        • 只在程序运行期间在内存中存在,不会随对象持久的保存
      • 不序列化的成员反序列化时返回默认值
    • 序列化版本号
      • 旧版本的数据, 不允许恢复新版本的类型
      • 如果自己不定义, 编译器编译时,会根据类的定义信息自动生成一个版本号
    •        /**
      * 序列化版本号
      */
      private static final long serialVersionUID = 2018L;
      • 如果类被编译过后, 版本号变化,反序列化以前的旧数据会报错,
      • 可以手动修改以前数据的版本号,执行反序列化

java - day013 - 流, FileInputStream, BufferedInputStream,的更多相关文章

  1. Java IO流学习总结三:缓冲流-BufferedInputStream、BufferedOutputStream

    Java IO流学习总结三:缓冲流-BufferedInputStream.BufferedOutputStream 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/ ...

  2. Java:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

  3. java IO流 之 字节流

    一.file类的常用操作 File file=new File("E:\\test\\javaIo"); System.out.println(file.isDirectory() ...

  4. Java IO流题库

    一.    填空题 Java IO流可以分为   节点流   和处理流两大类,其中前者处于IO操作的第一线,所有操作必须通过他们进行. 输入流的唯一目的是提供通往数据的通道,程序可以通过这个通道读取数 ...

  5. Java IO流总结

    Java IO流分类以及主要使用方式如下: IO流 |--字节流 |--字节输入流 InputStream: int read();//一次读取一个字节 int read(byte[] bys);// ...

  6. Java IO流系统整理

    Java IO流的分类 Java中的流,可以从不同的角度进行分类. 按流向分类: 输入流: 程序可以从中读取数据的流.输出流: 程序能向其中写入数据的流. 按数据传输单位分类: 字节流:以字节(8位二 ...

  7. 文件传输基础——Java IO流

    一.文件的编码 package com.study.io; /** * 测试文件编码 */ public class EncodeDemo { /** * @param args * @throws ...

  8. 【Java基础】Java IO流的总结

    Java IO流分为输入流和输出流,而输入流和输出流中又分字符流和字节流.顾名思义,输入流则是输入到程序中计算,输出流是把程序的结果输出到文件或者设备.而字符流输入输出以字符为单位,字节流则是以字节为 ...

  9. Java IO流以及装饰器模式在其上的运用

    流概述 Java中,流是一种有序的字节序列,可以有任意的长度.从应用流向目的地称为输出流,从目的地流向应用称为输入流. Java的流族谱 Java的 java.io 包中囊括了整个流的家族,输出流和输 ...

随机推荐

  1. Mathjax与LaTex公式简介

    MathJax与LaTex公式简介 (转载) PS: 原文链接写的非常好!!! 博主写这篇文章,一是为了防止原链接失效,二是在cnblogs上测试MathJax; 本文从math.stackexcha ...

  2. JavaScript:学习笔记(10)——XMLHttpRequest对象

    JavaScript:学习笔记(10)——XMLHttpRequest对象 XHR对象 使用XMLHttpRequest (XHR)对象可以与服务器交互.您可以从URL获取数据,而无需让整个的页面刷新 ...

  3. iOS-UIPasteboard的使用

    剪贴板的使用以及自定义剪贴板. 系统剪贴板的直接调用 其实整个过程非常的简单,我就用我写的一个自定义UILable来说明调用系统剪贴板. 首先,因为苹果只放出来了 UITextView,UITextF ...

  4. android基础---->传感器的使用

    现在每部Android 手机里面都会内置有许多的传感器,它们能够监测到各种发生在手机上的物理事件,而我们只要灵活运用这些事件就可以编写出很多好玩的应用程序.今天我们开始简单的传感器使用的学习. 目录导 ...

  5. addEventListener兼容性问题

    参考链接:https://blog.csdn.net/lililiaaa/article/details/83960924

  6. php有关类和对象的相关知识1

    有关类和对象的相关知识 类的自动加载 类的自动加载是指,在外面的页面中,并不需要去“引入”(包含)类文件,但是程序会在需要一个类的时候就自动去“动态加载”该类. 什么叫做“需要一个类”?通常是这样的情 ...

  7. R去掉含有NA的行

    只要数据框中含有NA的行都去掉 final[complete.cases(final),] na.omit(final) 过滤某几列 final[complete.cases(final[,5:6]) ...

  8. 自然语言处理(简称NLP)

    自然语言处理(简称NLP),是研究计算机处理人类语言的一门技术,包括: 1.句法语义分析:对于给定的句子,进行分词.词性标记.命名实体识别和链接.句法分析.语义角色识别和多义词消歧. 2.信息抽取:从 ...

  9. [转帖]14-使用glusterfs做持久化存储

    14-使用glusterfs做持久化存储 https://www.cnblogs.com/guigujun/p/8366558.html 使用glusterfs做持久化存储 我们复用kubernete ...

  10. 如何将生产环境的服务Docker镜像拉取到本地进行调试

    背景 很多时候我们在将开发环境的代码推送到GitLab上面以后,我们在测试的时候发现了问题后无法通过现有的日志输出级别来定位问题,比如我们需要看EFCore生成的SQL语句,在生产环境我们是不可能输出 ...