Java IO流分析整理

Java中的流,可以从不同的角度进行分类。

按照数据流的方向不同可以分为:输入流和输出流。

按照处理数据单位不同可以分为:字节流和字符流。

按照实现功能不同可以分为:节点流和处理流。

 

输出流:

 

输入流:

因此输入和输出都是从程序的角度来说的。

字节流:一次读入或读出是8位二进制。

字符流:一次读入或读出是16位二进制。

字节流和字符流的原理是相同的,只不过处理的单位不同而已。后缀是Stream是字节流,而后缀是ReaderWriter是字符流。

 

节点流:直接与数据源相连,读入或读出。

直接使用节点流,读写不方便,为了更快的读写文件,才有了处理流。

处理流:与节点流一块使用,在节点流的基础上,再套接一层,套接在节点流上的就是处理流。

Jdk提供的流继承了四大类:InputStream(字节输入流)OutputStream(字节输出流),Reader(字符输入流),Writer(字符输出流)。

以下是javaio中常用的流。

 

字节输入流:

字节输出流:

字符输入流:

字符输出流:

简单介绍其上图:

对文件进行操作:FileInputStream(字节输入流),FileOutputStream(字节输出流),FileReader(字符输入流),FileWriter(字符输出流)

对管道进行操作:PipedInputStream(字节输入流),PipedOutStream(字节输出流),PipedReader(字符输入流),PipedWriter(字符输出流)

PipedInputStream的一个实例要和PipedOutputStream的一个实例共同使用,共同完成管道的读取写入操作。主要用于线程操作。

字节/字符数组:ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter是在内存中开辟了一个字节或字符数组。

Buffered缓冲流::BufferedInputStreamBufferedOutputStreamBufferedReader,BufferedWriter,是带缓冲区的处理流,缓冲区的作用的主要目的是:避免每次和硬盘打交道,提高数据访问的效率。

转化流:InputStreamReader/OutputStreamWriter,把字节转化成字符。

数据流:DataInputStreamDataOutputStream

因为平时若是我们输出一个8个字节的long类型或4个字节的float类型,那怎么办呢?可以一个字节一个字节输出,也可以把转换成字符串输出,但是这样转换费时间,若是直接输出该多好啊,因此这个数据流就解决了我们输出数据类型的困难。数据流可以直接输出float类型或long类型,提高了数据读写的效率。

打印流:printStreamprintWriter,一般是打印到控制台,可以进行控制打印的地方。

对象流:ObjectInputStreamObjectOutputStream,把封装的对象直接输出,而不是一个个在转换成字符串再输出。

序列化流:SequenceInputStream

对象序列化:把对象直接转换成二进制,写入介质中。

使用对象流需要实现Serializable接口,否则会报错。而若用transient关键字修饰成员变量,不写入该成员变量,若是引用类型的成员变量为null,值类型的成员变量为0.

<think>好的,我现在需要回答用户关于Java IO的使用教程及常见问题解析。首先,根据用户的引用内容,用户已经提供了一些关于缓冲、对象、反序列化以及文件读取的示例代码。我需要系统地整理Java IO的基础知识,并结合这些引用内容进行说明。 首先,我应该从Java IO的整体分类开始,分为字节和字符。字节处理所有类型的数据,而字符专门处理文本。然后,分别介绍各个的使用方法,比如FileInputStream、FileOutputStream、BufferedInputStream、BufferedOutputStream等。同时,用户提到了对象和反序列化的例子,这部分需要详细说明ObjectInputStream和ObjectOutputStream的使用,以及序列化的注意事项,比如实现Serializable接口。 接下来是常见问题解析部分。用户提供的引用中有一个读取文件内容的例子,使用字节读取,但可能存在读取不完整的问题,因为read方法可能不会填满整个字节数组。这里需要指出问题所在,并给出正确的处理方式,比如循环读取直到返回-1。另外,对象在读取时需要进行类型转换,如果类型不匹配会抛出ClassNotFoundException,这也是需要注意的地方。 还需要考虑其他常见问题,比如字符编码的问题,处理大文件时的缓冲使用,以及资源关闭的正确方法,避免资源泄漏。此外,用户可能在处理文件路径时遇到问题,比如使用File.separator来保证跨平台兼容性,这在引用3的示例中已经提到,可以进一步强调。 最后,生成相关问题,需要覆盖用户可能关心的其他IO相关主题,比如不同的选择、异常处理、性能优化、序列化注意点等。确保问题能够引导用户进一步深入学习或解决实际问题。 在整理过程中,要确保所有代码示例正确,并符合用户提供的引用内容中的格式,比如使用反序列化的代码示例,正确使用ObjectInputStream。同时,注意引用标识的正确添加,例如在提到缓冲和对象时,引用对应的引用1和引用2。 需要检查是否有遗漏的重要知识点,比如其他类型的(如转换数据),或者NIO的相关内容。不过根据用户提供的引用,可能主要集中在基本IO操作,因此可以暂时不涉及NIO,除非用户特别询问。 总结来说,回答的结构应该先介绍基础概念和分类,然后详细讲解各类的使用方法,结合示例代码,接着分析常见问题并提供解决方案,最后生成相关问题。要确保内容清晰,步骤明确,符合用户要求的系统级指令和用户可见层的格式要求。</think>### Java IO使用教程及常见问题解析 --- #### **一、Java IO基础概念** Java IO用于处理设备间的数据传输,分为**字节**和**字符**两类: - **字节**:处理所有类型数据(如图片、视频),核心类为`InputStream`和`OutputStream`。 - **字符**:专门处理文本数据,核心类为`Reader`和`Writer`。 --- #### **二、核心分类及用法** ##### 1. **文件** - **写入文件**(字节): ```java try (FileOutputStream fos = new FileOutputStream("test.txt")) { fos.write("Hello".getBytes()); } catch (IOException e) { e.printStackTrace(); } ``` - **读取文件**(字节,引用3示例改进)[^3]: ```java try (FileInputStream fis = new FileInputStream("hello.txt")) { byte[] buffer = new byte[1024]; int len; while ((len = fis.read(buffer)) != -1) { System.out.println(new String(buffer, 0, len)); } } ``` ##### 2. **缓冲(提升性能)** - 通过缓冲减少磁盘IO次数(引用1)[^1]: ```java try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt")); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) { byte[] buffer = new byte[1024]; int len; while ((len = bis.read(buffer)) != -1) { bos.write(buffer, 0, len); } } ``` ##### 3. **对象(序列化与反序列化)** - **序列化对象**: ```java try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("data.obj"))) { oos.writeObject(new Student("Alice", 20)); } ``` - **反序列化对象**(引用2示例)[^2]: ```java try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data.obj"))) { Student student = (Student) ois.readObject(); System.out.println(student); } ``` **注意**:对象需实现`Serializable`接口。 --- #### **三、常见问题解析** 1. **文件读取不完整** **问题**:直接调用`in.read(b)`可能未填满数组,导致数据截断。 **解决**:循环读取直到`len=-1`(见第二节文件示例)。 2. **反序列化类型转换异常** **问题**:未强制转换类型或类定义不一致时抛出`ClassCastException`[^2]。 **解决**:确保序列化和反序列化的类完全一致。 3. **字符编码乱码** **问题**:字节直接读取文本时未指定编码。 **解决**:使用字符或指定编码: ```java new String(buffer, StandardCharsets.UTF_8); ``` 4. **资源未关闭导致泄漏** **问题**:忘记调用`close()`。 **解决**:使用`try-with-resources`语法自动关闭资源。 --- #### **四、性能优化建议** - **大文件处理**:优先使用缓冲(如`BufferedInputStream`)。 - **减少IO次数**:批量读写(如数组或`BufferedReader.readLine()`)。 ---
评论 48
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值