• java中流的注意事项


    缓冲流

    缓冲流继承自过滤流,使用缓冲流时一些要注意的知识点:

    1.如果在缓冲流对象创建时使用了其他流,最后关闭时只需关闭缓冲流就可以了,其他流会跟着自动关闭。

    2.缓冲字符输入流(BufferedReader)可以直接 readLine() 一次读取一行,BufferedInputStream没有此方法。

    3.用BufferedInputStream读取文件结束时返回的是-1,这和File流相同,不过如果使用BufferedReader的ReadLine()方法,读取到最后,返回的是null。

    3.在使用缓冲输出流(BufferedOutputStream)(BufferedWriter)后,最好调用 out.flush() 方法,来强制写出剩余数据,清空缓冲区。

    4.其实 BufferedInputStream 内部就是对一个 byte 数组的封装,这和我们自己创建 byte 数组作为缓冲区的效果是相同的。它们的特点都是不用每读一个字节就输出一次,而是一次性读了一点量的数据,再一个一个的输出,减少了IO与系统的交互次数,提高了效率。

    5.可以用BufferedReader(字符缓冲流)结合InputStreamReader(转换流)对字节流进行读取,可以大幅提高效率。

    6.如果使用buffererReader和BufferedWriter结合使用,在读写文件时,一次读取一行再写入,这时要手动设置换行,可以调用bw.newLine()方法换行(不要忘记flush)。更方便的做法是使用PrinterWriter(打印输出流)来输出,它可以直接使用pw.println(line)方法自动换行。

    数据流

    数据流一般都是用来对文件流进行包装,使得在写一些数据时可以节省使用的字节空间,在读取这些数据时也避免了一些繁琐的转换操作。比如我们要向文件中写一个 double 型的数据,一个 int 型的数据和一个 String 型的数据,然后再读取出来。那么就可以这样写

    public class DataIODemo {
    
        public static void main(String[] args) {
                int i=100;
                double pi=Math.PI;  //这个是圆周率
                String s="java";
                DataOutputStream out=null;
                DataInputStream in=null;
                try {
                    out=new DataOutputStream(new FileOutputStream("test.dat"));
                    out.writeInt(i);     //写入int型数据
                    out.writeDouble(pi);  //写入double型数据
                    out.writeUTF(s);      //写入字符串
                    
                    in=new DataInputStream(new FileInputStream("test.dat"));
                    int j=in.readInt();      //从文件中读取int型数据
                    double db=in.readDouble();    //从文件中读取double型数据
                    String str=in.readUTF();      //从文件中读取字符串
                    System.out.println(j+" "+db+" "+str);
                } catch (IOException e) {
                    e.printStackTrace();
                }finally {
                    try {
                        in.close();
                        out.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
        }
    
    }

    读出的结果为

    100 3.141592653589793 java

    使用数据流进行数据存储时,都是将数据转换成2进制存储的,不过不同数据类型存储的字节大小不同,所以取出数据时,要用不同的read方法来读取。比如我这里存储的顺序是先存储一位int型,再存储一个double型,最后存储一个字符串,读出的时候必须也按照同样的顺序来读,不然会 出现错误,这是因为每次read后,它的指针位置都会向后移动一定位数,如果用readInt(),它会读取四个字节的数据,然后指针移动到四个字节之后,然后使用readDouble()再读取,指针再移动,一直这样读。如果把读的顺序改变,就会变成用读String字符串的方法来读double型数据,产生错误。

    对象流

    1.使用对象流可以将一个对象进行序列化,然后进行传输 或者 存储到文件中,同样对象流可以对对象反序列化进行还原。

    2.对象流只有ObjectInputStream 和ObjectOutputStream两种,因为数据在硬盘中都是以字节方式存储的,故对象想要在底层传输,就必须转换为字节。

    3.对象想要进行序列换和反序列化,必须实现Serializable接口,Serializable接口为一个空接口,主要是起到标识作用。此外,对象还要进行构造函数的创建,以及实现toString()方法等一系列操作。

    4.如果对象中的某个成员变量不想进行序列化,可以在变量的类型前加上 transient 关键字。

  • 相关阅读:
    2020暑假项目-车辆派遣管理系统开发记录#8
    2020暑假项目-车辆派遣管理系统开发记录#7
    2020暑假项目-车辆派遣管理系统开发记录#6
    2020暑假项目-车辆派遣管理系统开发记录#5
    2020暑假项目-车辆派遣管理系统开发记录#4
    2020暑假项目-车辆派遣管理系统开发记录#3
    持续交付工具ThoughtWorks Go部署step by step
    mysql千万级大数据SQL查询优化
    分享MYSQL中的各种高可用技术(源自姜承尧大牛)
    我的MYSQL学习心得(十七) 复制
  • 原文地址:https://www.cnblogs.com/weimore/p/7253240.html
Copyright © 2020-2023  润新知