`

Java输入输出流详解

 
阅读更多
http://blog.sina.com.cn/s/blog_4bc179a80100w84t.html
stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO中,所有的stream(包括Inputstream和Out stream)都包括两种类型:
  (1)字节流
  表示以字节为单位从stream中读取或往stream中写入信息,即io包中的inputstream类和outputstream类的派生类。通常用来读取二进制数据,如图象和声音。
  (2)字符流
  以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。
  区别:
  Reader和Writer要解决的,最主要的问题就是国际化。原先的I/O类库只支持8位的字节流,因此不可能很好地处理16位的Unicode字符流。Unicode是国际化的字符集(更何况Java内置的char就是16位的Unicode字符),这样加了Reader和Writer之后,所有的I/O就都支持Unicode了。此外新类库的性能也比旧的好。
  但是,Read和Write并不是取代InputStream和OutputStream,有时,你还必须同时使用"基于byte的类"和"基于字符的类"。为此,它还提供了两个"适配器(adapter)"类。InputStreamReader负责将InputStream转化成Reader,而OutputStreamWriter则将OutputStream转化成Writer。

    一.流的层次结构
  定义:
  (1)java将读取数据对象成为输入流,能向其写入的对象叫输出流。结构图如下:
        

         

    二.InputStream类
  inputstream类和outputstream类都为抽象类,不能创建对象,可以通过子类来实例化。
  InputStream是输入字节数据用的类,所以InputStream类提供了3种重载的read方法.Inputstream类中的常用方法:
  (1)       public abstract int read( ):读取一个byte的数据,返回值是高位补0的int类型值。
  (2)       public int read(byte b[ ]):读取b.length个字节的数据放到b数组中。返回值是读取的字节数。该方法实际上是调用下一个方法实现的
  (3)       public int read(byte b[ ], int off, int len):从输入流中最多读取len个字节的数据,存放到偏移量为off的b数组中。
  (4)       public int available( ):返回输入流中可以读取的字节数。注意:若输入阻塞,当前线程将被挂起,如果InputStream对象调用这个方法的话,它只会返回0,这个方法必须由继承InputStream类的子类对象调用才有用,
  (5)       public long skip(long n):忽略输入流中的n个字节,返回值是实际忽略的字节数, 跳过一些字节来读取
  (6)       public int close( ) :我们在使用完后,必须对我们打开的流进行关闭.
  三.OutputStream类
  OutputStream提供了3个write方法来做数据的输出,这个是和InputStream是相对应的。
  1. public void write(byte b[ ]):将参数b中的字节写到输出流。
  2. public void write(byte b[ ], int off, int len) :将参数b的从偏移量off开始的len个字节写到输出流。
  3. public abstract void write(int b) :先将int转换为byte类型,把低字节写入到输出流中。
  4. public void flush( ) : 将数据缓冲区中数据全部输出,并清空缓冲区。
  5. public void close( ) : 关闭输出流并释放与流相关的系统资源。
  注意:
  1. 上述各方法都有可能引起异常。
  2. InputStream和OutputStream都是抽象类,不能创建这种类型的对象。
  四.FileInputStream类
  FileInputStream类是InputStream类的子类,用来处理以文件作为数据输入源的数据流。使用方法:
  方式1:
  File fin=new File("d:/abc.txt");
  FileInputStream in=new FileInputStream(fin);
  方式2:
  FileInputStream in=new
  FileInputStream("d: /abc.txt");
  方式3:
  构造函数将 FileDescriptor()对象作为其参数。
  FileDescriptor() fd=new FileDescriptor();
  FileInputStream f2=new FileInputStream(fd);
  五.FileOutputStream类
  FileOutputStream类用来处理以文件作为数据输出目的数据流;一个表示文件名的字符串,也可以是File或FileDescriptor对象。
  创建一个文件流对象有两种方法:
  方式1:
  File f=new File("d:/abc.txt");
  FileOutputStream out=new FileOutputStream (f);
  方式2:
  FileOutputStream out=new
  FileOutputStream("d:/abc.txt");
  方式3:构造函数将 FileDescriptor()对象作为其参数。
  FileDescriptor() fd=new FileDescriptor();
  FileOutputStream f2=new FileOutputStream(fd);
方式4:构造函数将文件名作为其第一参数,将布尔值作为第二参数。
  FileOutputStream f=new FileOutputStream("d:/abc.txt",true);
  注意:
  (1)文件中写数据时,若文件已经存在,则覆盖存在的文件;(2)的读/写操作结束时,应调用close方法关闭流。
  举例:2-1
  六.File类
  File类与InputStream / OutputStream类同属于一个包,它不允许访问文件内容。
  File类主要用于命名文件、查询文件属性和处理文件目录。
  举例:2-2
  七.从一个流构造另一个流
  java的流类提供了结构化方法,如,底层流和高层过滤流。
  而高层流不是从输入设备读取,而是从其他流读取。同样高层输出流也不是写入输出设备,而是写入其他流。
  使用"分层对象(layered objects)",为单个对象动态地,透明地添加功能的做法,被称为Decorator Pattern。Decorator模式要求所有包覆在原始对象之外的对象,都必须具有与之完全相同的接口。这使得decorator的用法变得非常的透明--无论对象是否被decorate过,传给它的消息总是相同的。这也是Java I/O类库要有"filter(过滤器)"类的原因:抽象的"filter"类是所有decorator的基类。Decorator模式常用于如下的情形:如果用继承来解决各种需求的话,类的数量会多到不切实际的地步。Java的I/O类库需要提供很多功能的组合,于是decorator模式就有了用武之地。
  为InputStream和OutputStream定义decorator类接口的类,分别是FilterInputStream和FilterOutputStream。

FilterInputStream的种类



功能

构造函数的参数


用法


DataInputStream

与DataOutputStream配合使用,这样你就能以一种"可携带的方式(portable fashion)"从流里读取primitives了(int,char,long等)

InputStream


包含了一整套读取primitive数据的接口。


BufferedInputStream

用这个类来解决"每次要用数据的时候都要进行物理读取"的问题。你的意思是"用缓冲区。"

InputStream,以及可选的缓冲区的容量


它本身并不提供接口,只是提供一个缓冲区。需要连到一个"有接口的对象(interface object)"。


LineNumberInputStream

跟踪输入流的行号;有getLineNumber( )和setLineNumber(int)方法

InputStream


只是加一个行号,所以还得连一个"有接口的对象"。


PushbackInputStream

有一个"弹压单字节"的缓冲区(has a one byte push-back buffer),这样你就能把最后读到的那个字节再压回去了。

InputStream


主要用于编译器的扫描程序。可能是为支持Java的编译器而设计的。用的机会不多。






FilterOutputStream的种类



功能

构造函数的参数


用法


DataOutputStream

与DataInputStream配合使用,这样你就可以用一种"可携带的方式(portable fashion)"往流里写primitive了(int, char, long,等)

OutputStream


包括写入primitive数据的全套接口。


PrintStream

负责生成带格式的输出(formatted output)。DataOutputStrem负责数据的存储,而PrintStream负责数据的显示。

一个OutputStream以及一个可选的boolean值。这个boolean值表示,要不要清空换行符后面的缓冲区。


应该是OutputStream对象的最终包覆层。用的机会很多。


BufferedOutputStream

用 这个类解决"每次往流里写数据,都要进行物理操作"的问题。也就是说"用缓冲区"。用flush( )清空缓冲区。

OutputStream, 以及一个可选的缓冲区大小


本身并不提供接口,只是加了一个缓冲区。需要链接一个有接口的对象。
  DataInputStream类对象可以读取各种类型的数据。
  DataOutputStream类对象可以写各种类型的数据;
  创建这两类对象时,必须使新建立的对象指向构造函数中的参数对象。例如:
  FileInputStream in=new FileInputStream("d:/abc.txt");
  DataInputStream din=new DataInputStream(in);
  7.2BufferInputStream和bufferOutputStream
  允许程序在不降低系统性能的情况下一次一个字节的从流中读取数据。
  BufferInputstream定义了两种构造函数
  (1)       BufferInputStream b= new BufferInputstream(in);
  (2)       BufferInputStream b=new BufferInputStream(in,size)
  第二个参数表示指定缓冲器的大小。
  同样BufferOutputStream也有两种构造函数。一次一个字节的向流中写数据。
  7.3printstream
  用于写入文本或基本类型
  两种构造函数方法:
  PrintStream ps=new PrintStream(out);
  PrintStream ps=new PrintStream(out, autoflush)
  第二个参数为布尔值,控制每次输出换行符时java是否刷新输出流。
  八.字符流的读取和写入
  java.io.Reader 和 java.io.InputStream 组成了 Java 输入类。Reader 用于读入16位字符,也就是 Unicode 编码的字符;而 InputStream 用于读入 ASCII 字符和二进制数据。


(1)       FileReader
  FileReader主要用来读取字符文件,使用缺省的字符编码,有三种构造函数:
  --将文件名作为字符串
  FileReader f=new FileReader(“c:/temp.txt”);
  --构造函数将File对象作为其参数。
  File f=new file(“c:/temp.txt”);
  FileReader f1=new FileReader(f);
  --构造函数将FileDescriptor对象作为参数
  FileDescriptor() fd=new FileDescriptor()
  FileReader f2=new FileReader(fd);
  (2)    charArrayReader
  将字符数组作为输入流,构造函数为:
  public CharArrayReader(char[] ch);
  (3)    StringReader
  读取字符串,构造函数如下:
  public StringReader(String s);
  (4)    InputStreamReader
  从输入流读取字节,在将它们转换成字符。
  Public inputstreamReader(inputstream is);
  (5)    FilterReader
  允许过滤字符流
  protected filterReader(Reader r);
    (6)    BufferReader
  接受Reader对象作为参数,并对其添加字符缓冲器,使用readline()方法可以读取一行。
  Public BufferReader(Reader r);
(1)       FileWrite
  将字符类型数据写入文件,使用缺省字符编码和缓冲器大小。
  Public FileWrite(file f);
  (2)chararrayWrite()
  将字符缓冲器用作输出。
  Public CharArrayWrite();
  (3)    PrintWrite
  生成格式化输出
  public PrintWriter(outputstream os);
  (4)    filterWriter
  用于写入过滤字符流
  protected FilterWriter(Writer w);

FilterOutputStream的种类



功能

构造函数的参数


用法


DataOutputStream

与DataInputStream配合使用,这样你就可以用一种"可携带的方式(portable fashion)"往流里写primitive了(int, char, long,等)

OutputStream


包括写入primitive数据的全套接口。


PrintStream

负责生成带格式的输出(formatted output)。DataOutputStrem负责数据的存储,而PrintStream负责数据的显示。

一个OutputStream以及一个可选的boolean值。这个boolean值表示,要不要清空换行符后面的缓冲区。


应该是OutputStream对象的最终包覆层。用的机会很多。


BufferedOutputStream

用 这个类解决"每次往流里写数据,都要进行物理操作"的问题。也就是说"用缓冲区"。用flush( )清空缓冲区。

OutputStream, 以及一个可选的缓冲区大小


本身并不提供接口,只是加了一个缓冲区。需要链接一个有接口的对象。
  DataInputStream类对象可以读取各种类型的数据。
  DataOutputStream类对象可以写各种类型的数据;
  创建这两类对象时,必须使新建立的对象指向构造函数中的参数对象。例如:
  FileInputStream in=new FileInputStream("d:/abc.txt");
  DataInputStream din=new DataInputStream(in);
  7.2BufferInputStream和bufferOutputStream
  允许程序在不降低系统性能的情况下一次一个字节的从流中读取数据。
  BufferInputstream定义了两种构造函数
  (1)       BufferInputStream b= new BufferInputstream(in);
  (2)       BufferInputStream b=new BufferInputStream(in,size)
  第二个参数表示指定缓冲器的大小。
  同样BufferOutputStream也有两种构造函数。一次一个字节的向流中写数据。
  7.3printstream
  用于写入文本或基本类型
  两种构造函数方法:
  PrintStream ps=new PrintStream(out);
  PrintStream ps=new PrintStream(out, autoflush)
  第二个参数为布尔值,控制每次输出换行符时java是否刷新输出流
分享到:
评论

相关推荐

    java输入输出流详解.doc

    ### Java 输入输出流详解 #### 一、I/O流概述 在Java中,输入输出流是处理文件读写、网络通信等数据交换的基础。Java提供了丰富的API来支持这些操作,主要包括`java.io`包下的各类流对象。这些流对象按照处理的...

    java输入输出流 流式输入与输出

    【Java输入输出流详解】 Java输入输出流(Input/Output Stream)是Java平台核心API的重要组成部分,主要用于处理数据的输入和输出。Java的I/O机制是基于流的,即数据以流的形式从一个地方传输到另一个地方。Java的I...

    Java文件的输入输出流实例详解

    Java 文件的输入输出流实例详解 Java 文件的输入输出流实例详解是指在 Java 中对文件的输入输出操作的详细介绍。输入输出流是一个通道,程序可以通过这个通道读取源中的数据或将数据传送到目的地。 概念部分: ...

    Java输入输出流及文件读写详解

    ### Java 输入输出流及文件读写详解 #### I/O 类体系结构 在Java开发中,输入输出(I/O)操作是非常重要的部分,特别是在处理文件、网络通信等方面。Java的I/O类体系主要位于`java.io`包中,此外还有一些新实现的I...

    java中的标准输入输出流

    ### Java中的标准输入输出流知识点详解 #### 一、Java标准I/O介绍 Java提供了丰富的I/O处理机制,包括标准输入输出流、字节流、字符流等多种方式来处理数据的读取和写入。标准输入输出流是Java中非常基础且重要的...

    Java_输入输出流及文件读写详解

    Java 输入输出流(I/O 流)是Java平台的核心特性之一,用于处理数据的传输,包括文件读写、网络通信等。在Java API中,I/O流被组织为一系列类和接口,主要位于`java.io`包。在JDK 1.0中引入了字节流(byte stream)...

    第6章(输入输出流).ppt

    【Java输入输出流详解】 Java中的输入/输出流(I/O流)是处理程序与外部交互数据的关键组件。第6章主要围绕Java的I/O流展开,包括输入流、输出流以及文件读写操作。 6.1 输入/输出流 在Java中,I/O流是一个抽象...

    Java_输入输出流及文件读写详解.docx

    "Java 输入输出流及文件读写详解" 本文档对 Java 中的输入输出流和文件读写进行了详细的介绍。从 I/O 类的体系结构开始,讲解了 Java 中的输入输出流的分类,包括字节流和字符流,以及它们之间的区别。然后,着重...

    Java输入输出流实例详解

    Java 输入输出流实例详解 Java 输入输出流是一种基本的数据交换方式,用于在程序之间或程序与外部设备之间交换数据。在 Java 中,输入输出流主要分为两大类:字节流和字符流。字节流用于处理二进制数据,而字符流...

    浅谈Java的输入输出流

    ### Java输入输出流基础知识 #### 一、引言 Java作为一种广泛应用的编程语言,其强大的输入输出(IO)处理能力是其重要的特性之一。通过Java IO库,开发者能够轻松地处理各种类型的输入输出操作,包括但不限于文件...

    Java输入数据流详解

    Java IO包提供了丰富的输入输出类,不仅限于字节流和字符流,还包括对象流(用于序列化和反序列化)、转换流(将字节流与字符流相互转换)以及过滤流(提供额外的功能,如缓冲、字符编码转换等)。这些类和接口共同...

    Java输入/输出流体系详解

    Java输入/输出流体系详解 Java输入/输出流体系是Java语言中非常重要的一部分,它涉及到字节流和字符流、输入输出体系、转换流,以及文件的读写等相关内容。下面将对Java输入/输出流体系进行详细的解释和分析。 ...

    java 输入输出

    ### Java 输入输出流详解 #### 一、Java IO 概述 Java的输入输出功能非常强大且灵活,但实现起来可能会因为需要处理多种类型的对象而显得不够简洁。Java IO库覆盖了广泛的领域,如标准输入输出、文件操作、网络数据...

    Java_IO流详解

    Java 中 IO 是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。在项目开发中,IO 是非常基础的部分,在面试当中经常出现。对于初学者而言,IO 部分是容易忽略的内容,求职者一定要掌握该...

    JAVA实验报告三java输入输出.docx

    实验报告三:Java输入输出 本实验主要涵盖了Java中输入输出的基本操作,旨在让学生深入理解数据流的概念,熟悉Java流的层次结构,并掌握文件的读写操作。实验内容包括从键盘接收用户输入并在屏幕上显示,读取并显示...

    java中的io流详解

    Java 中的 IO 流详解 Java 中的 IO 流是指在 Java 语言中对输入输出操作的抽象,主要用于实现程序与外部设备和其他计算机之间的交流,尤其是对磁盘文件的操作。IO 流的概念是在 1984 年由 C 语言第一次引入的,后来...

    corejava输入输出流学习总结.pdf

    根据提供的文档信息,本文将对Java中的输入输出流(I/O)进行详细的总结与解析,主要涵盖以下几个方面: 1. **文件操作与File类的基本使用**; 2. **输入输出流的基本概念及其分类**; 3. **字节流的具体实现与应用...

Global site tag (gtag.js) - Google Analytics