`
天边一朵雲
  • 浏览: 36303 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

(CSDN)java中的io系统详解

 
阅读更多

相关读书笔记、心得文章列表

Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。

Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流和 java 内 Unicode 字符流之间的转换。而类 InputStreamReader 和 OutputStreamWriter 处理字符流和字节流的转换。字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。

( 一 )以字节为导向的 stream------InputStream/OutputStream

InputStream 和 OutputStream 是两个 abstact 类,对于字节为导向的 stream 都扩展这两个鸡肋(基类 ^_^ ) ;

1、 InputStream

1.1

ByteArrayInputStream -- 把内存中的一个缓冲区作为 InputStream 使用 .

construct---

(A)ByteArrayInputStream(byte[]) 创建一个新字节数组输入流( ByteArrayInputStream ),它从指定字节数组中读取数据( 使用 byte 作为其缓冲区数组)

(B)---ByteArrayInputStream(byte[], int, int) 创建一个新字节数组输入流,它从指定字节数组中读取数据。

---mark:: 该字节数组未被复制。

1.2

StringBufferInputStream -- 把一个 String 对象作为 InputStream .

construct---

StringBufferInputStream(String) 据指定串创建一个读取数据的输入流串。

注释:不推荐使用 StringBufferInputStream 方法。 此类不能将字符正确的转换为字节。

同 JDK 1.1 版中的类似,从一个串创建一个流的最佳方法是采用 StringReader 类。

1.3

FileInputStream -- 把一个文件作为 InputStream ,实现对文件的读取操作

construct---

(A)FileInputStream(File name) 创建一个输入文件流,从指定的 File 对象读取数据。

(B)FileInputStream(FileDescriptor) 创建一个输入文件流,从指定的文件描述器读取数据。

(C)-FileInputStream(String name) 创建一个输入文件流,从指定名称的文件读取数据。

method ---- read() 从当前输入流中读取一字节数据。

read(byte[]) 将当前输入流中 b.length 个字节数据读到一个字节数组中。

read(byte[], int, int) 将输入流中 len 个字节数据读入一个字节数组中。

1.4

PipedInputStream :实现了 pipe 的概念,主要在线程中使用 . 管道输入流是指一个通讯管道的接收端。

一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。

construct---

PipedInputStream() 创建一个管道输入流,它还未与一个管道输出流连接。

PipedInputStream(PipedOutputStream) 创建一个管道输入流 , 它已连接到一个管道输出流。

1.5

SequenceInputStream :把多个 InputStream 合并为一个 InputStream . “序列输入流”类允许应用程序把几个输入流连续地合并起来,

并且使它们像单个输入流一样出现。每个输入流依次被读取,直到到达该流的末尾。

然后“序列输入流”类关闭这个流并自动地切换到下一个输入流。

construct---

SequenceInputStream(Enumeration) 创建一个新的序列输入流,并用指定的输入流的枚举值初始化它。

SequenceInputStream(InputStream, InputStream) 创建一个新的序列输入流,初始化为首先 读输入流 s1, 然后读输入流 s2 。

2、 OutputSteam


2.1

ByteArrayOutputStream : 把信息存入内存中的一个缓冲区中 . 该类实现一个以字节数组形式写入数据的输出流。

当数据写入缓冲区时,它自动扩大。用 toByteArray() 和 toString() 能检索数据。

constructor

(A)--- ByteArrayOutputStream() 创建一个新的字节数组输出流。

(B)--- ByteArrayOutputStream() 创建一个新的字节数组输出流。

(C)--- ByteArrayOutputStream(int) 创建一个新的字节数组输出流,并带有指定大小字节的缓冲区容量。

toString(String) 根据指定字符编码将缓冲区内容转换为字符串,并将字节转换为字符。

write(byte[], int, int) 将指定字节数组中从偏移量 off 开始的 len 个字节写入该字节数组输出流。

write(int) 将指定字节写入该字节数组输出流。

writeTo(OutputStream) 用 out.write(buf, 0, count) 调用输出流的写方法将该字节数组输出流的全部内容写入指定的输出流参数。

2.2

FileOutputStream: 文件输出流是向 File 或 FileDescriptor 输出数据的一个输出流。

constructor

(A)FileOutputStream(File name) 创建一个文件输出流,向指定的 File 对象输出数据。

(B)FileOutputStream(FileDescriptor) 创建一个文件输出流,向指定的文件描述器输出数据。

(C)FileOutputStream(String name) 创建一个文件输出流,向指定名称的文件输出数据。

(D)FileOutputStream(String, boolean) 用指定系统的文件名,创建一个输出文件。

2.3

PipedOutputStream: 管道输出流是指一个通讯管道的发送端。 一个线程通过管道输出流发送数据,

而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。

constructor

(A)PipedOutputStream() 创建一个管道输出流,它还未与一个管道输入流连接。

(B)PipedOutputStream(PipedInputStream) 创建一个管道输出流,它已连接到一个管道输入流。

( 二 )以字符为导向的 stream Reader/Writer

以 Unicode 字符为导向的 stream ,表示以 Unicode 字符为单位从 stream 中读取或往 stream 中写入信息。

Reader/Writer 为 abstact 类

以 Unicode 字符为导向的 stream 包括下面几种类型:

1. Reader

1.1

CharArrayReader :与 ByteArrayInputStream 对应此类实现一个可用作字符输入流的字符缓冲区

constructor

CharArrayReader(char[]) 用指定字符数组创建一个 CharArrayReader 。

CharArrayReader(char[], int, int) 用指定字符数组创建一个 CharArrayReader

1.2

StringReader : 与 StringBufferInputStream 对应其源为一个字符串的字符流。

StringReader(String) 创建一新的串读取者。

1.3

FileReader : 与 FileInputStream 对应

1.4

PipedReader :与 PipedInputStream 对应

2. Writer

2.1 CharArrayWrite : 与 ByteArrayOutputStream 对应

2.2 StringWrite :无与之对应的以字节为导向的 stream

2.3 FileWrite : 与 FileOutputStream 对应

2.4 PipedWrite :与 PipedOutputStream 对应

3、两种不同导向的 stream 之间的转换

3.1

InputStreamReader 和 OutputStreamReader :

把一个以字节为导向的 stream 转换成一个以字符为导向的 stream 。

InputStreamReader 类是从字节流到字符流的桥梁:它读入字节,并根据指定的编码方式,将之转换为字符流。

使用的编码方式可能由名称指定,或平台可接受的缺省编码方式。

InputStreamReader 的 read() 方法之一的每次调用,可能促使从基本字节输入流中读取一个或多个字节。

为了达到更高效率,考虑用 BufferedReader 封装 InputStreamReader ,

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

例如: // 实现从键盘输入一个整数

  1. Strings=null;
  2. InputStreamReaderre=newInputStreamReader(System.in);
  3. BufferedReaderbr=newBufferedReader(re);
  4. try{
  5. s=br.readLine();
  6. System.out.println("s="+Integer.parseInt(s));
  7. br.close();
  8. }
  9. catch(IOExceptione)
  10. {
  11. e.printStackTrace();
  12. }
  13. catch(NumberFormatExceptione)//当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
  14. {
  15. System.out.println("输入的不是数字");
  16. }

InputStreamReader(InputStream) 用缺省的字符编码方式,创建一个 InputStreamReader 。

InputStreamReader(InputStream, String) 用已命名的字符编码方式,创建一个 InputStreamReader 。

OutputStreamWriter 将多个字符写入到一个输出流,根据指定的字符编码将多个字符转换为字节。

每个 OutputStreamWriter 合并它自己的 CharToByteConverter, 因而是从字符流到字节流的桥梁。

(三)Java IO 的一般使用原则 :

一、按数据来源(去向)分类:

1 、是文件: FileInputStream, FileOutputStream, ( 字节流 )FileReader, FileWriter( 字符 )

2 、是 byte[] : ByteArrayInputStream, ByteArrayOutputStream( 字节流 )

3 、是 Char[]: CharArrayReader, CharArrayWriter( 字符流 )

4 、是 String: StringBufferInputStream, StringBufferOuputStream ( 字节流 )StringReader, StringWriter( 字符流 )

5 、网络数据流: InputStream, OutputStream,( 字节流 ) Reader, Writer( 字符流 )

二、按是否格式化输出分:

1 、要格式化输出: PrintStream, PrintWriter

三、按是否要缓冲分:

1 、要缓冲: BufferedInputStream, BufferedOutputStream,( 字节流 ) BufferedReader, BufferedWriter( 字符流 )

四、按数据格式分:

1 、二进制格式(只要不能确定是纯文本的) : InputStream, OutputStream 及其所有带 Stream 结束的子类

2 、纯文本格式(含纯英文与汉字或其他编码方式); Reader, Writer 及其所有带 Reader, Writer 的子类

五、按输入输出分:

1 、输入: Reader, InputStream 类型的子类

2 、输出: Writer, OutputStream 类型的子类

六、特殊需要:

1 、从 Stream 到 Reader,Writer 的转换类: InputStreamReader, OutputStreamWriter

2 、对象输入输出: ObjectInputStream, ObjectOutputStream

3 、进程间通信: PipeInputStream, PipeOutputStream, PipeReader, PipeWriter

4 、合并输入: SequenceInputStream

5 、更特殊的需要: PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader

决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):

首先,考虑最原始的数据格式是什么: 原则四

第二,是输入还是输出:原则五

第三,是否需要转换流:原则六第 1 点

第四,数据来源(去向)是什么:原则一

第五,是否要缓冲:原则三 (特别注明:一定要注意的是 readLine() 是否有定义,有什么比 read, write 更特殊的输入或输出方法)

第六,是否要格式化输出:原则二

分享到:
评论

相关推荐

    java IO流操作详解源代码下载

    在这个详细的源代码下载中,我们可以通过四篇相关的CSDN博客文章来深入理解Java IO流的工作原理和实际应用。 首先,我们需要了解Java IO流的分类。Java IO库中的流分为字节流和字符流两大类,每类又分为输入流和...

    Java 学生信息管理系统

    《Java学生信息管理系统详解》 Java学生信息管理系统是一款基于JavaEE技术实现的课程设计项目,旨在帮助用户管理和处理学生信息,提升教育管理的效率。该系统利用MySQL数据库存储数据,确保了信息的安全性和稳定性...

    简易java图书管理系统

    【简易Java图书管理系统详解】 Java图书管理系统是一种使用Java编程语言实现的信息管理软件,主要用于图书馆的日常运营,包括图书的录入、借阅、归还、查询等操作。本系统虽然简单,但对于初学者来说,它是理解Java...

    java操作Excel_详解

    ### Java操作Excel详解:jExcelAPI与POI的对比及应用实例 在IT领域,特别是企业级应用开发中,处理电子表格数据是一项常见的需求。Java作为企业级开发的主流语言之一,提供了多种库来实现这一功能,其中最知名的莫...

    Myeclipse 10 激活详解过程_java学习_

    Java学习是一个全面且系统的过程,涵盖基础语法、面向对象编程、集合框架、多线程、网络编程、I/O流、异常处理、数据库连接、Swing图形界面、Java EE企业级开发等多个方面。初学者应从基础入手,理解变量、数据类型...

    java的IO流详细解读

    Java中的IO流是指在不同的数据源之间进行数据交互的过程。数据源可以是文件、数据库、网络甚至其他程序。在Java中,IO流可以分为两大类:输入流和输出流。输入流是将数据从外部来源输入到程序中,而输出流是将数据从...

    Java IO流对象的序列化和反序列化实例详解

    String file = "F:\\javaio\\obj.dat"; ObjectSerializeTest ost = new ObjectSerializeTest(); ost.objectOutput(file); ost.objectInput(file); } } ``` 上述代码定义了一个实现了Serializable接口的Student...

    【中文】【JAVA2 SDK 类库详解】【RAR】

    ### Java2 SDK 类库详解 #### 1. Java2 平台简介 Java2(Java Platform, Standard Edition,简称Java SE)是Java平台的一个版本,主要用于开发桌面应用软件和小型应用程序。Java2包括了JDK (Java Development Kit)...

    Java面试笔试题大汇总(最全+详细答案)

    Java作为一门广泛使用的编程语言,其面试笔试题涵盖了众多领域,包括基础语法、面向对象、集合框架、多线程、异常处理、IO流、网络编程、数据库操作、设计模式、JVM优化等。以下是对这些知识点的详细阐述: 1. **...

    java基础知识总结(经典)

    Java 基础知识总结是 Java 程序员不可或缺的一部分,本总结将涵盖 Java 的基础知识,包括 Java 概述、Java 语法基础、变量、数据类型、运算符、控制语句、方法、数组、继承、多态、接口、异常、IO 流等。 一、Java ...

    图书馆管理系统(java程序)

    《图书馆管理系统(Java程序)详解》 在信息技术领域,开发一个图书馆管理系统是常见的实践项目,它可以帮助图书馆高效地管理图书信息、借阅记录等数据。本项目基于Java编程语言,提供了一个完整的源代码实现,旨在...

    java常用类解析及示例及一些工具类源代码

    主要讲解了System类、Object类、Arrays类、Cloneable接口、IO系统输入输出类及装饰类、IO系统文本读写工具类、IO系统二进制读写工具类、对象序列化工具类、File类及文件搜索工具类、java异常机制及自定义异常类、...

    记事本(java语言编写)

    在Java中,我们使用`java.io`包中的`FileInputStream`和`FileOutputStream`类来读写文件。打开文档时,程序会打开一个文件选择对话框,用户选择文件后,程序读取文件内容并显示在文本区域。保存或另存为操作则相反...

    java连接oracle实例

    Oracle数据库作为全球领先的数据库管理系统之一,与Java结合可以实现高效的数据处理。本文将详细介绍如何使用Java来连接Oracle数据库,并通过示例代码进行具体说明。 #### 二、准备工作 在正式开始之前,我们需要...

    Java调用R语言的方法

    ### Java调用R语言的方法详解 #### JRI (Java/R Interface) **简介:** JRI是一种允许Java程序通过单线程方式与R进行交互的工具。它能够将R的动态库加载到Java环境中,并提供一系列Java API来实现R的功能。JRI支持...

    JAVA基础精讲PDF

    15. **Java标准库**:介绍一些常用的Java内置类库,如Math类、Date和Calendar类,以及IO和NIO库。 学习这个PDF文档,你可以逐步建立起坚实的Java基础,为进一步深入学习Java Swing、JavaFX、JDBC、Spring框架、...

    Java_api查看.rar

    - **包(Packages)**:如`java.io`、`java.util`等,是组织类和接口的方式,便于管理和查找。每个包都有特定的功能领域,比如`java.io`处理输入输出,`java.util`提供通用的工具类。 2. **使用Java API文档**: ...

    Java软件开发实战 Java基础与案例开发详解 2-7 java上机练习 共5页.pdf

    13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 ...

Global site tag (gtag.js) - Google Analytics