四、字符流
java提供了Reader和Writer两个专门操作字符流的类。
①Reader使用字符的方式从文件中读取数据。常用方法有:
Reader是一个抽象类,具体可以完成的功能有其子类完成,如下:
CharArrayReader:直接从内存中以“字符”的形式读取数据。每次读取一个字符,存放到缓存区中。
FileReader:从文本文件中读取字符的字符输入流,该字符输入流使用系统默认的字符集编码和缓存区大小,不能更改。如果需要重新调整输入流的编码,必须使用InputStreamReader。
StringReader:从一个字符串中读取内容
BufferedReader:为其它的基于字符的输入流提供缓冲功能以提高效率。通常情况下,对于底层输入流的任何一次read或者readLine请求都将导致直接的磁盘访问,这将导致效率非常地下。
当使用缓存的字符输入流时,读取请求将被缓存,在合适的时候一次性读入批量数据,再进行编码转换。以此显著提高效率。这个缓存输入流的缓冲区大小是可以指定的。
LineNumberReader:可以跟踪读入的“行数据”的字符输入流。该输入流内置一个指示器,用于跟踪读入的数据的行数。默认情况下行号从0开始。用户可以通过setLineNumber和getLineNumber来设置/或者行号。一个行可以由“换行符”,“回车符”,“回车换行符”标识。当遇到其中任意一个符号时,指示器的值将增加1。
注意的是:setLineNumber方法并不会真正地改变数据在文件中的物理位置,而是简单地修改了指示器的数值而已。
②Writer是一个字符输出类。常用方法有:
writer也是一个抽象类,他的子类有:
PrintWriter:将对象数据以恰当的格式输出到文本输出流,和PrintOutputStream类不同,后者当碰到换行符的时候会清空缓冲区。但是PrintWriter不会,它只在print方法被调用时才会清空缓存。所以理论上来说它要比PrintOutputStream更加高效,因为只要缓冲区允许,它可以接纳更多的内容而一次性写入到文件。
这个类使用系统默认的行分割符来代替“换行符"n”,因为不是所有的系统都是通过“"n”来换行的。
BufferedWriter:为其它字符输出流提供缓冲功能,该输出流的缓冲区大小可以设置,否则将使用默认的缓冲区大小。这个类有一个newLine方法,用于返回一个基于系统的行分割符,而非一定是“"n”。这个类会缓存写请求,当要写出的字符达到一定程度时就一次性地写出到底层的文件输出流。
CharArrayWriter:类似于ByteArrayOutputStream,向内存中写字符。其中内置一个缓冲区,大小可以动态增长。如果要得到写入的字符可以使用toCharArray方法,如果要构造出字符串则可以使用toString方法。
FileWriter:以基于字符的方式向文件中写数据。该输出流使用系统平台默认的字符集编码方式和缓存区大小,不能设置改变。如果需要的话可以使用OutputStreamWriter。
五、两种不同导向的 stream 之间的转换
InputStreamReader 和 OutputStreamReader :把一个以字节为导向的 stream 转换成一个以字符为导向的 stream 。
InputStreamReader 类是从字节流到字符流的桥梁:它读入字节,并根据指定的编码方式,将之转换为字符流。
使用的编码方式可能由名称指定,或平台可接受的缺省编码方式。
InputStreamReader 的 read() 方法之一的每次调用,可能促使从基本字节输入流中读取一个或多个字节。
为了达到更高效率,考虑用 BufferedReader 封装 InputStreamReader ,BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
OutputStreamWriter 将多个字符写入到一个输出流,根据指定的字符编码将多个字符转换为字节。
每个 OutputStreamWriter 合并它自己的 CharToByteConverter, 因而是从字符流到字节流的桥梁。
六、Java IO的一般使用原则:
1、按数据来源(去向)分类:
①、是文件: FileInputStream, FileOutputStream, FileReader, FileWriter
②、是byte[]:ByteArrayInputStream, ByteArrayOutputStream
③、是Char[]: CharArrayReader, CharArrayWriter
④、是String: StringBufferInputStream, StringReader, StringWriter
⑤、网络数据流:InputStream, OutputStream, Reader, Writer
2、按是否格式化输出分:
①、要格式化输出:PrintStream, PrintWriter
3、按是否要缓冲分:
①、要缓冲:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter
4、按数据格式分:
①、二进制格式(只要不能确定是纯文本的): InputStream, OutputStream及其所有带Stream结束的子类
②、纯文本格式(含纯英文与汉字或其他编码方式);Reader, Writer及其所有带Reader, Writer的子类
5、按输入输出分:
①、输入:Reader, InputStream类型的子类
②、输出:Writer, OutputStream类型的子类
6、特殊需要:
①、从Stream到Reader,Writer的转换类:InputStreamReader, OutputStreamWriter
②、对象输入输出:ObjectInputStream, ObjectOutputStream
③、进程间通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
④、合并输入:SequenceInputStream
⑤、更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader
决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):
首先,考虑最原始的数据格式是什么: 原则4
第二,是输入还是输出:原则5
第三,是否需要转换流:原则6第①点
第四,数据来源(去向)是什么:原则1
第五,是否要缓冲:原则3(特别注明:一定要注意的是readLine()是否有定义,有什么比read, write更特殊的输入或输出方法)
第六,是否要格式化输出:原则2
相关推荐
Java的IO系统是Java编程中的核心部分,它允许程序与外部世界进行数据交换,包括读取文件、写入文件、网络通信以及设备交互等。理解并掌握Java的IO系统对于任何Java开发者,尤其是新手,都是至关重要的。在这个实例...
Java IO系统是Java平台中处理输入输出操作的核心组件,它为开发者提供了丰富的类库,用于读写文件、网络通信以及处理各种数据流。在Java中,IO系统主要由一系列的抽象类和接口组成,如InputStream、OutputStream、...
### Java IO系统详解 在Java开发中,输入/输出(Input/Output,简称IO)操作是必不可少的一部分。Java提供了一套完整的IO系统来处理各种数据流的读写操作,包括字符流、字节流以及随机访问文件等。本文将深入探讨...
Java IO系统是Java编程语言中不可或缺的一部分,它提供了丰富的类库来处理输入和输出操作,包括文件读写、网络通信、数据转换等。这个资料包包含了一份PPT、一个源代码示例以及一些相关的文档,旨在帮助我们深入理解...
综上所述,Java IO培训讲义通过系统介绍Java IO的基本概念和模型,帮助应届生理解并掌握Java IO类库的使用,特别是在了解和应用不同IO模型时的注意事项和实践方法。通过这份讲义,初学者能更好地理解和编写涉及Java ...
2. **层次结构**:Java IO系统采用层次化的结构设计,使得用户可以根据需求选择合适的流进行组合使用。 3. **可扩展性**:通过装饰器模式和过滤器模式,可以轻松地扩展流的功能。 4. **灵活性**:Java IO系统提供了...
《Java IO.chm》是一个关于Java输入/输出(IO)技术的压缩文件,其中包含了丰富的资料,适合开发者深入理解和学习Java IO系统。这篇详细的总结将围绕Java IO体系结构、核心类、流的概念、缓冲区、转换流、字符集、...
#### 一、Java IO系统概述 - **Java I/O系统的重要性**:Java I/O系统是Java编程中的基础组成部分之一,用于处理数据的输入与输出。理解和熟练掌握Java I/O系统对于开发高质量的应用程序至关重要。 - **Java I/O...
了解这些基础知识后,可以更有效地处理Java程序中的输入输出操作,无论是文件操作、网络通信还是系统间的数据交互。在开发过程中,正确选择和使用Java IO流能够提高程序的效率和灵活性,是每个Java开发者必备的技能...
总之,Java IO系统为开发者提供了强大而灵活的工具来处理输入输出操作,无论是简单的文本文件,还是复杂的网络通信,都可以通过这个框架高效地实现。深入理解这个结构图对于提升Java编程能力至关重要。
例如,javaio.bmp和javaio2.bmp可能是两张展示IO框架图的图片,其中详细描绘了不同类之间的继承关系和使用场景,帮助开发者更好地理解和掌握Java IO系统。 总结一下,Java IO框架是Java平台不可或缺的一部分,它为...
Java IO系统是基于流(Stream)的,数据通过流在源和目的地之间传输。 标题“Java IO 使用例”指的是通过具体的代码示例来展示Java IO的各种操作,如读取文件、写入文件、复制文件、处理字符流和字节流等。下面我们...
Java IO(Input/Output)是Java编程语言中用于处理输入和输出操作的重要组成部分。它提供了丰富的类库,允许程序员在程序之间传输数据,包括从文件、网络、内存缓冲区到其他程序或系统组件。Java IO API是Java平台的...
Java中的IO流是Java核心库的重要组成部分,它用于在不同数据源之间传输数据。Java IO流分为两大类:字符流(Character Stream)和字节流(Byte Stream)。字符流处理单个字符,而字节流处理8位的字节序列。它们又...
2. File类:它是Java中处理文件和目录的主要类。通过File对象,我们可以创建、删除文件和目录,获取文件的基本信息(如大小、创建时间等),以及进行文件路径的操作。 三、文件读写 3. FileInputStream与...
在Java IO系统中,装饰模式被广泛应用于构建灵活且可扩展的输入输出流体系。 1. Java IO体系结构: Java IO库基于流的概念,流是数据传输的抽象表示,分为字节流(处理单个字节的数据)和字符流(处理Unicode字符的...
### 彻底理解Java语言中的IO系统 #### 一、Input和Output Java IO系统是Java编程中的一个重要组成部分,它负责处理程序与外部资源(如文件、网络等)之间的数据交换。Java IO的设计以流为基础,可以分为输入流...
Java IO系统提供了丰富的类来支持不同类型的输入输出操作,包括但不限于文件读写、网络通信等。本文将通过分析一张清晰明了的Java IO类层次图,详细介绍Java IO体系中的主要类及其关系。 #### 二、Java IO 类层次...
Java 的 IO 流主要包括输入、输出两种 IO 流,每种输入、输出流有可分为字节流和字符流两大类: 字节流以字节为单位来处理输入、输出操作 字符流以字符为单位来处理输入、输出操作