zoukankan      html  css  js  c++  java
  • JAVA基础IO流(二)


    一、字节流

        字节流是通过字节来进行读写操作的,他的使用对象相比于字符流来说更加的广泛。这主要是因为他们读写文件的方
    式而决定的。字符流读写文件时是将读取到的字节通过默认编码表转换成字符,在通过默认编码表将字符转换成字节存储
    到文件里,在这个过程中虽然提高了文本文档的读写效率,但是在面对非文本文件时 - 字节转换成字符的这个操作因为编
    码表的原因可能会造成丢失字节,导致文件的缺失。所以在对非文本文档进行操作时要使用字节流。

    二、InputStream类

        此抽象类是字节输入流的所有类的超类(读),其常用子类有 FileInputStream、 ObjectInputStream 。
    而此类的常用方法与Reader类相似,其常用方法有:
    (1)关闭此输入流并释放与该流关联的所有系统资源、close()

    (2)从输入流中读取数据的下一个字节、 read()

    (3)从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中、read(byte[] b)

    (4)将输入流中最多 len 个数据字节读入 byte 数组、read(byte[] b, int off, int len)

    1、FileInputStream类

        FileInputStream类为InputStream抽象类的常用实现类,他可以用于读取视频、音频、图片等非文本文件,也可以
    读取文本文件(读取文本文件推荐使用FileReader类),其构造方法与FileReader类似,可以传递路径名或File对象为
    参数。它继承了InputStream类的全部方法。

    2、ObjectInputStream类

        ObjectInputStream类主要用于对象的读取,继承了InputStream类的全部方法。他的构造方法为:
    (1)创建从指定 InputStream 读取的 ObjectInputStream

            ObjectInputStream(InputStream in)

        因其读取对象的特性,他有一些自己独有的自己独有的方法:
    (1)从 ObjectInputStream 读取对象、readObject()

        两种遍历方式的举例:

     1 //抛出异常
     2 private static void method2() throws IOException, FileNotFoundException, ClassNotFoundException {
     3 //根据传入的FileInputStream对象创建ObjectInputStream对象
     4 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("aa.txt"));
     5 //遍历文件直到无文件可读,捕获抛出的异常,结束循环
     6 try {
     7 while (true) {
     8 //读取文件
     9 Object readObject = ois.readObject();
    10 System.out.println(readObject);
    11 }
    12 //捕获异常结束循环
    13 } catch (EOFException e) {
    14 System.out.println("已经输出完毕");
    15 //一定会执行,一般用于关闭流
    16 } finally {
    17 //关闭资源
    18 ois.close();
    19 }
    20 }

        将对象传入到集合中,将集合写入文件,读取集合

     1 public static void main(String[] args) throws Exception, IOException {
     2 // method();
     3 // method2();
     4 // 创建学生对象
     5 Student student = new Student("张三", 18);
     6 Student student2 = new Student("白洁", 19);
     7 Student student3 = new Student("赵四", 39);
     8 // 创建集合
     9 ArrayList<Student> lists = new ArrayList<>();
    10 // 将学生丢向加入到集合中
    11 lists.add(student);
    12 lists.add(student2);
    13 lists.add(student3);
    14 // 根据传入的FileOutputStream对象创建ObjectOutputStream对象
    15 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("bb.txt"));
    16 // 将集合写入
    17 oos.writeObject(lists);
    18 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("bb.txt"));
    19 // 从文件中读取集合
    20 Object readObject = ois.readObject();
    21 // 向下转型
    22 ArrayList<Student> re = (ArrayList<Student>) readObject;
    23 // 遍历集合
    24 for (Student student4 : re) {
    25 System.out.println(student4);
    26 }
    27 // 关闭资源
    28 ois.close();
    29 oos.close();

    三、OutputStream类

        此抽象类是表示输出字节流的所有类的超类(写),其常用子类有 FileInputStream、 ObjectInputStream。
    此类的常用方法与Reader类相似,其常用的实现类有:
    (1)FileOutputStream类

    (2)ObjectOutputStream类
        而此类的常用方法与Writer类相似,其常用方法有:
    (1)关闭此输出流并释放与此流有关的所有系统资源、close()

    (2)刷新此输出流并强制写出所有缓冲的输出字节、flush()

    (3)将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流、write(byte[] b, int off, int len)

    1、FileOutputStream类

        FileOutputStream类为OutputStream抽象类的常用实现类,其构造方法与FileWriter类似,可以传递路径名或
    File对象为参数。它继承了OutputStream类的全部方法。

        用字符流拷贝文件举例:

     1 //创建File对象
     2 File file = new File("D:\\songs\\小苹果.mp4");
     3 //根据file创建FileInputStream对象
     4 FileInputStream fi=new FileInputStream(file);
     5 //定义int用来存数组长度
     6 int i;
     7 //定义byte数组
     8 byte[] b=new byte[1024];
     9 //根据给定路径创建FileOutputStream对象
    10 FileOutputStream fo=new FileOutputStream("D:\\aa\\小苹果.mp4");
    11 //循环读取
    12 while ((i=fi.read(b))!=-1) {
    13 //写入文件
    14 fo.write(b, 0, i);
    15 }
    16 //关闭资源
    17 fo.close();
    18 fi.close();

    2、ObjectOutputStream类

        可以用ObjectOutputStream类将对象写入到文件中,要注意的是被写入的对象的类要进行序列化,否则你在对类进行
    修改时会报异常。
        对类序列化举例:

     1 class Student implements Serializable {
     2 /**
     3 * 序列号如果不生成系统会自动生成,但是你更改类的成员变量序列号也会变,就会报错所以要重写
     4 */
     5 //实现Serializable接口进行序列化
     6 private static final long serialVersionUID = 4123259833120003092L;
     7 private String name;
     8 private int age;
     9 
    10 public Student() {
    11 super();
    12 // TODO Auto-generated constructor stub
    13 }
    14 
    15 public Student(String name, int age) {
    16 super();
    17 this.name = name;
    18 this.age = age;
    19 }
    20 
    21 @Override
    22 public String toString() {
    23 return "Student [name=" + name + ", age=" + age + "]";
    24 }
    25 }

        写入对象举例:

     1 //创建ObjectOutputStream对象
     2 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("aa.txt"));
     3 //创建学生类
     4 Student student = new Student("张三", 18);
     5 Student student2 = new Student("白洁", 19);
     6 //写入数据
     7 oos.writeObject(student);
     8 oos.writeObject(student2);
     9 //关闭资源
    10 oos.close();

    四、转换流的使用

        转换流不属于字节流的子类,而是Writer和Reader的子类,因为它涉及到了字节流和字符流的转换所以在这里说。

    1、InputStreamReader(字符输入流)

        字符输入流是字节流通向字符流的桥梁。它可以将节符流对象转化成字符流对象,因为是输入,所以字节数据会被转
    换成字符数据。其常用的构造方法为:InputStreamReader(InputStream in) 。

    2、OutputStreamWriter(字符输出流)

        他是字符流通向字节流的桥梁。它可以将字节流对象转换成字符流对象,因为是输出,所以字符数据会被转换成字节
    数据。其常用的构造方法为:创建使用默认字符编码的 - OutputStreamWriter(OutputStream out)。

        举例:

     1 public static void main(String[] args) throws IOException {
     2 // 标准输入流
     3 InputStream in = System.in;
     4 // 转换流
     5 InputStreamReader inputStreamReader = new InputStreamReader(in);
     6 // 创建FileWriter对象
     7 FileWriter fw = new FileWriter("a.txt");
     8 // 存储数组长度
     9 int i;
    10 char[] c = new char[1024];
    11 // 循环读取
    12 while ((i = inputStreamReader.read(c)) != -1) {
    13 // 将数组写入到指定文件,从0一直写到i,目的是为了防止出现重复数据
    14 fw.write(c, 0, i);
    15 //
    16 fw.flush();
    17 
    18 }
    19 // 关闭资源
    20 fw.close();
    21 inputStreamReader.close();
    22 } 
    23 }
    我们在键盘上留下的余温,也将随时代传递到更远的将来~
  • 相关阅读:
    HTML5 学习笔记(三)——本地存储(LocalStorage、SessionStorage、Web SQL Database)
    HTML5 学习笔记(二)——HTML5新增属性与表单元素
    apache 运行一段时间出现错误
    先验算法(Apriori algorithm)
    Opera官网打不开 下载Opera最新版本的实际地址
    网址查看浏览器内核版本
    小鸟云四个数据中心介绍
    nilcms file类 简单文件缓存实现
    小鸟云优惠券 云服务器介绍
    PHP中测试in_array、isset、array_key_exists性能
  • 原文地址:https://www.cnblogs.com/0813lichenyu/p/7589446.html
Copyright © 2011-2022 走看看