Java IO流

来源:互联网 发布:外贸邮件群发软件 编辑:程序博客网 时间:2024/06/05 09:17

      Java的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作,在Java中把不同的输入/输出源(键盘、文件、网络连接等)抽象表述为“流”(stream),通过流的方式允许Java程序使用相同的方式来访问不同的输入/输出源。


流的分类  

        按照不同的分类方式将流分为不同的类型

1.输入流和输出流

   按照流的流向来分,可以分为输入流和输出流。

   输入流:只能从中读取数据,而不能向其写入数据。

   输出流:只能向其写入数据,而不能从中读取数据。

        Java的输入流主要由InputStream和Reader作为基类,而输出流则主要由OutputStream和Writer作为基类。它们都是一些抽象基类,无法直接创建实例。


2.字节流和字符流

        字节流和字符流的用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同——字节流操作的数据单元是8位的字节,而字符流的数据单元是16位的字符。

       字节流主要由InputStream和OutputStream作为基类,而字符流则主要由Reader和Writer作为基类。


3.节点流和处理流

     节点流:可以从/向一个特定的IO设备(如磁盘、网络)读/写数据的流。称为节点流,节点流也被称为低级流。

      处理流:用于一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能。处理流也被称为高级流。


        实际上,Java使用处理流来包装节点是一种典型的装饰器设计模式,通过使用处理流来包装不同的节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入/输出功能。因为此处理流也被称为包装流。


字节流和字符流

        InputStream和Reader是所有输入流的抽象基类,本身并不能创建实例来执行输入,但它们将成为所有输入流的模板,它们的方法是所有输入流都可使用的方法。而FileInputStream和FileReader是专门用来读取文件的输入流,它们都是节点流——会直接和指定文件关联。下面程序示范了使用FileInputStream来读取自身的效果。

int read(byte[] b):从输入流中最多读取b.length个字节的数据,并将其存储在字节数组b中


      上面程序创建了一个长度为1024的字节数组来读取该文件,实际上该Java源文件的长度还不到1024字节,程序只需要执行一次read()方法即可读取全部内容。


下面程序使用FileReader来读取文件本身。


该程序中字符数组的长度为32,这意味着程序需要多次调用read()方法才可以完全读取输入流的全部数据。


OutputStream和Writer

void write(byte[]/char[] buf):将字节数组/字符数组中的数据输出到指定输出流中。

void write(String str):将str字符串里包含的字符输出到指定输出流中。

下面程序使用FileInputStream来执行输入,并使用FileOutputStream来执行输出,用以实现复制FileOutputStreamTest.java文件的功能。



      运行上面程序,将看到系统当前路径下多了一个文件:newFile.txt,该文件的内容和FileOutputStream.java文件的内容完全相同。


     如果希望直接输出字符串内容,则使用Writer会有更好的效果,如下程序所示。


       运行上面程序,将会在当前目录下输出一个poem.txt文件,文件内容就是程序中输出的内容。