码迷,mamicode.com
首页 > 编程语言 > 详细

java中流的注意事项

时间:2017-08-24 00:04:35      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:zab   stat   输入   不用   过滤   取出   system   static   aio   

缓冲流

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

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 关键字。

java中流的注意事项

标签:zab   stat   输入   不用   过滤   取出   system   static   aio   

原文地址:http://www.cnblogs.com/weimore/p/7253240.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!