JAVA中的IO 流们

本文详细介绍了 Java 中的 IO 流概念,包括节点流和处理流两大类,并深入探讨了缓冲流、转换流、数据流等各类处理流的特点及应用场景。

         Java 程序中对于数据的输入和输出操作以“流”方式进行,J2SDK提供了各种各样的“流”类,用于获取不同种类的数据;程序通过标准的方法输入和输出数据。


         java.io包中定义了多个流类型来实现输入、输出功能;从如下角度进行分类:

   数据流的方向:输入流和输出流

处理数据单位:字节流和字符流(一个字符包含两个字节)

功能:节点流和处理流

节点流:从一个特定的“数据源(节点)”读取数据

处理流:连接在已经“存在的流”上进行数据读取。

   不管有多少“流”类,最终java.io中类都继承如下四种抽象流类型:

   

  

让我们来根据功能看一下javaIO 中的流

    

一、节点流


节点:数据源。通俗的理解节点流:对数据的处理是从数据源点开始进行的就属于节点流。

内容类如下 图:

   

  

从上表可以看出

1、节点类型,四种:File,Memory ArrayMemory String Pipe

2、字符流的方法都是:Reader/Writer;字节流则为:input/output

二、处理流 

  

1、处理流概览

处理流:是对节点流进行“处理”的一些类,不直接跟“数据源点”交互,通过节点流来达到我们需要的输入输出数据。这就是处理流的意义所在。看如下图就是处理流的内容类。


上表 特点

1、操作对象:buffering(缓冲),filtering(过滤),Converting (转换),object(对象),Data ConversionPrinting(打印),Counting(计数),Peekingahead (预读)

2、字符流的方法都是:Reader/Writer;字节流则为:input/output。(同节点流) 


二、分类

通过上表处理流的不同操作对象,接下来介绍几种主要的处理流类型类型。 


1、缓冲流——buffering


套接在相应的节点流之上,对读写的数据提供了缓冲功能,可以提高读取效率,同时还可以增加一些新方法。

四个类构造如下:



2、转换流——Converting


A:上表查出转换流有两种:InputStreamReaderOutputStreamWriter 两种。

B:转换流在构造时可以指定其编码集合,如:inputStream isr = new InputStreamReader(System.in,"ISO8859_1");


使用需要套接。 


3、数据流——Data Conversion


可以一次性写入一个“数据”,不然,是一个字节一个字节读取,不知道写进去,或者读出来的是什么:都是以字节读,写。例如:写入:12132434,可能读出来是 1 21 3 2 4 3 4 ,这样就模糊了。


类:DataInputStream DataOutputStream (继承自InputStream OutputStream

构造:DataInputStream(InputStream in)

 DataOutputStream(OutputStream out) 


特点:提供了可以存取与机器无关的java原始类型数据(int,double)方法。

使用需要套接 


4Print


这个处理流是我们最常见的输出流。

 类:PrintWriter(字符)、PrintStream (字节)。

构造如下:



特点如下:

都提供了重载的print方法,println 方法用于多种数据类型的输出。

不会抛出异常,用户通过检测错误状态获取错误信息。

有自动的Flush功能。

使用需要套接 


5Object 流——直接将object 写入或者读出。 


类:ObjectInputStream ObjectOutputStream


重点如下:

Transient :修饰的成员变量在编译的时候不被考虑。输出的时候是看不到的值(会显示0

Serializable Serializable是标记性接口。接口内没有方法。

Externalizable:外部化接口,继承来自serializable 接口,自己控制自己的序列化过程。一般不使用。如果不使用这个接口,那么直接实现serializable 接口,由JDK 控制。

使用需要套接 


三、共同点——套接 


观察以上所有处理流的类构造方法中都需要参数,这个参数是做什么用的呢?——套接。通过传递的参数和要作用的对象产生关联。

处理流的使用都需要套接。套接谁?为什么要套接?

这个不难理解,因为处理流的特性就是要对字节流进行处理加工,所以处理流声明过程中,肯定要指定它要“服务”的对象。所以套接的就是字节流,具体是如下四种抽象类型:


最终还是回归到了原点,不论怎么处理,最终我们都还是对这基本四种的“流”进行变形,达到我们期望的输入输出。









### Java IO的概念及使用方法 JavaIO通过`java.io`包下的类和接口来支持,主要用于数据的读取和写入操作。IO可以分为输入流(InputStream)和输出流(OutputStream),并且根据处理的数据单位不同,又可分为字节和字符[^1]。 #### 1. IO的分类 - **字节**:以字节为单位进行数据处理,适用于所有类型的文件,包括二进制文件。主要类有`FileInputStream`和`FileOutputStream`。 - **字符**:以字符为单位进行数据处理,仅适用于纯文本文件。主要类有`FileReader`和`FileWriter`[^4]。 此外,JavaIO还采用了装饰者设计模式,将分为底层节点和上层处理。节点直接物理存储节点关联,而处理则对节点进行包装,提供额外的功能,如缓冲、过滤等[^1]。 #### 2. 字符的使用示例 以下是一个使用字符读取文件内容的示例代码: ```java import java.io.BufferedReader; import java.io.FileReader; public class Demo2 { public static void main(String[] args) { try { BufferedReader br = new BufferedReader(new FileReader("E:\\Test.txt")); String line; while ((line = br.readLine()) != null) { System.out.println(line); } br.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上述代码中,`BufferedReader`被用来提高读取效率,并且通过`readLine()`方法逐行读取文件内容[^2]。 #### 3. 序列化的使用 序列化是Java IO的一个重要应用,用于将对象转换为字节以便于存储或传输。为了实现序列化,类必须实现`Serializable`接口。以下是一个对象序列化的示例代码: ```java import java.io.FileOutputStream; import java.io.ObjectOutputStream; import java.io.Serializable; class Student implements Serializable { private static final long serialVersionUID = 1L; String name; int age; public Student(String name, int age) { this.name = name; this.age = age; } } public class SerializationDemo { public static void main(String[] args) throws Exception { Student student = new Student("张三", 22); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("student")); oos.writeObject(student); oos.flush(); oos.close(); } } ``` 在此示例中,`ObjectOutputStream`被用来将`Student`对象序列化并保存到文件中[^3]。 #### 4. 关闭的重要性 如果不关闭IO,可能会导致资源泄漏,影响程序性能甚至引发异常。因此,在完成数据读写后,务必调用`close()`方法释放相关资源[^1]。 --- ###
评论 25
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值