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

时间: 2024-07-30 03:17:25

java中流的注意事项的相关文章

关于java中流的使用--文件以及socket

个人感觉,流是java中不同设备之间交换数据的媒介,例如socket中数据的传输,以及文件的读写操作等,都是通过流来实现的. 流的种类 从处理的数据类型上来看,流主要分为字符流(InputStream, OutputStream)和字节流(Reader, Writer),而从功能上来看,主要分为输入流以及输出流. 文件的读写 File file =newFile(".\\test.txt"); //参数true:表示在文件后边追加内容 FileOutputStream fileOutp

Java向上转型注意事项

继承.接口:Java子类中如果含有父类中不包含的变量与方法,子类对象向上转型时就是丢失这些变量和方法. 1 interface SuperClass{ 2 int i = 2; 3 void f() ; 4 } 5 class SubClass implements SuperClass{ 6 int i = 1 ; 7 int j = 2 ; 8 public void f(){ 9 System.out.println("SubClass.f()"); 10 } 11 public

Java中流的概念和递归算法

文件类: java.io.File 基本方法; geName: 获取文件名称 getPath: 获取文件路径 length: 获取文件大小 isDirectory: 判断这个东西是不是一个目录 isFile: 判断这个东西是不是一个文件 listFiles: 获取当前这个路径下面所有的文件和文件夹 IO流 什么是流 流, 可以看成是一根管道, 用来读取文件的数据 原始的数据都是用过二进制的形式来进行数据的传输, 文件---10111010-->程序 文件<--10111010---程序 流的分

Java中流的概念

http://wapwenku.baidu.com/view/04714847b307e87101f69656.html?ssid=0&from=1086k&uid=0&[email protected],[email protected]_2002,[email protected]_1_8.4_2_6.4&bd_page_type=1&baiduid=56F05653706D3FCEAB383E0A95BFD8DF&tj=wenkuala_2_0_10_

Java中流-----个人总结心得

流 数据流---用于传输数据.IO流---Input/Output流.数据从外部流向程序---输入流:数据从程序流向外部的时候--输出流.读取一个文件---数据从文件流向程序---输入流:向一个文件中写入数据---数据从程序流向文件---输出流 根据数据流动的方向:输入流/输出流 根据数据传输的形式:字节流/字符流 输入流 输出流 字节流 InputStream OutputSteam 字符流 Reader Writer 这四个类是Java中四个流的基本类,但是这四个类都是抽象类,都不能用于直接

Java网络编程注意事项3

如何使用POST请求和GET请求Web网站发送请求,下面的参考代码: import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; public class GetTest { private String url; private String param; /** *

【持续更新】把.net代码转换为java代码的注意事项

国内大多数大学的软件相关专业大多强制学生学习c和Java,但.net 的几个语言可以说是选学的. 由于visual studio在windows平台上使用相对方便,一些同学会在上大学的Java课之前自学.net开发技术. 这一类同学就需要一些代码转换技巧来帮助学习Java. 在这之前我吐槽一下TinyMCE编辑器,它不能正确染色一些vb.net的关键字,比如Async, NameOf, Aggregate .c#的某些关键字也不能正确染色,如__arglist. 由于我这学期才开始上Java课,

Linux(Centos)之安装Java JDK及注意事项

1.准备工作 a.因为Java JDK区分32位和64位系统,所以在安装之前必须先要判断以下我们的Centos系统为多少位系统,命令如下: uname -a 解释:如果有x86_64就是64位的,没有就是32位的.后面是X686或X86_64则内核是64位的,i686或i386则内核是32位的 由此可以判断我的centos为32位系统,故而我需要下载32位系统的JDK. b.下载JDK,地址:http://www.oracle.com/technetwork/java/javase/downlo

java多线程编码注意事项

Sole purpose of using concurrency is to produce scalable and faster program. But always remember, speed comes after correctness. Your Java program must follow its invariant in all conditions, which it would, if executed in sequential manner. If you a