一文彻底搞懂IO流

一文彻底搞懂IO流Java 对数据的操作是通过流的方式 IO 是 java 中实现输入输出的基础 它可以很方便的完成数据的输入输出操作 Java 把不同的输入输出抽象为流 通过流的方式允许 Java 程序使用相同的方式来访问不同的输入 输出

大家好,欢迎来到IT知识分享网。

1. 什么是IO流

Java对数据的操作是通过流的方式,IO是java中实现输入输出的基础,它可以很方便的完成数据的输入输出操作,Java把不同的输入输出抽象为流,通过流的方式允许Java程序使用相同的方式来访问不同的输入、输出。

IO又分为流IO(java.io)和块IO(java.nio),Java.io是大多数面向数据流的输入/输出类的主要软件包。此外,Java也对块传输提供支持,在核心库 java.nio中采用的便是块IO。流IO的好处是简单易用,缺点是效率较低。块IO效率很高,但编程比较复杂。

2. IO流原理

IO流是基于流的概念,它将数据的输入和输出看作是一个连续的流。数据从一个地方流向另一个地方,流的方向可以是输入(读取数据)或输出(写入数据)。Java中的IO流分为字节流和字符流两种类型,分别用于处理字节数据和字符数据。

IO流的原理是通过流的管道将数据从源头传输到目标地。源头可以是文件、网络连接、内存等,而目标地可以是文件、数据库、网络等。IO流提供了一组丰富的类和方法来实现不同类型的输入和输出操作。

3. IO流分类

Java中的IO流可以按照数据的类型和流的方向进行分类。

3.1 按数据类型分类

  • 字节流(Byte Stream):以字节为单位读写数据,适用于处理二进制数据,如图像、音频、视频等。常见的字节流类有InputStream和OutputStream。
  • 字符流(Character Stream):以字符为单位读写数据,适用于处理文本数据。字符流会自动进行字符编码和解码,可以处理多国语言字符。常见的字符流类有Reader和Writer。

在这里插入图片描述

3.2 按流的方向分类

  • 输入流(Input Stream):用于读取数据。输入流从数据源读取数据,如文件、网络连接等。常见的输入流类有FileInputStream、ByteArrayInputStream、SocketInputStream等。
  • 输出流(Output Stream):用于写入数据。输出流将数据写入到目标地,如文件、数据库、网络等。常见的输出流类有FileOutputStream、ByteArrayOutputStream、SocketOutputStream等。

4. IO流的使用场景

IO流主要用于处理输入和输出操作,适用于以下场景:

  • 读写文件:IO流可以方便地读取和写入文件中的数据,从而实现文件的读写操作,例如读取配置文件、处理日志文件、读取用户上传的文件等。
  • 网络通信:IO流可以用于处理网络通信中的数据输入和输出,例如通过Socket进行网络通信时,可以使用IO流来传输数据。
  • 数据库操作:IO流可以将数据从程序中传输到数据库中,或者从数据库中读取数据到程序中,从而实现数据库的读写操作。
  • 内存操作:IO流也可以用于处理内存中的数据输入和输出,例如通过ByteArrayInputStream和ByteArrayOutputStream可以在内存中读写数据。
  • 用户交互:IO流可以用于处理用户输入和输出,例如从控制台读取用户输入的数据,或者向控制台输出提示信息和结果。

5. 常用的IO流类

Java提供了许多IO流类来满足不同的需求,下面介绍一些常用的IO流类:

5.1 字节流类

  • InputStream:用于从输入源读取字节数据的抽象类。
  • FileInputStream:从文件中读取字节数据的类。
  • ByteArrayInputStream:从字节数组中读取字节数据的类。
  • BufferedInputStream:提供缓冲功能的字节输入流类。
  • DataInputStream:读取基本数据类型的字节输入流类。
import java.io.*; public class ByteStreamExample { public static void main(String[] args) { try { // 创建一个文件输入流 FileInputStream fis = new FileInputStream("example.txt"); // 创建一个缓冲输入流,提高读取效率 BufferedInputStream bis = new BufferedInputStream(fis); // 创建一个字节数组输出流 ByteArrayOutputStream bos = new ByteArrayOutputStream(); // 读取文件内容到字节数组输出流中 int data; while ((data = bis.read()) != -1) { bos.write(data); } // 将字节数组输出流中的内容转换为字节数组 byte[] byteArray = bos.toByteArray(); // 打印输出字节数组内容 System.out.println(new String(byteArray)); // 关闭流 bis.close(); bos.close(); } catch (IOException e) { e.printStackTrace(); } } } 

5.2 字符流类

  • Reader:用于从输入源读取字符数据的抽象类。
  • FileReader:从文件中读取字符数据的类。
  • BufferedReader:提供缓冲功能的字符输入流类。
  • InputStreamReader:将字节流转换为字符流的类。
import java.io.*; public class CharacterStreamExample { public static void main(String[] args) { try { // 创建一个文件输入流,用于读取文件中的字符数据 FileInputStream fis = new FileInputStream("example.txt"); // 将字节流转换为字符流,用于读取字符数据 InputStreamReader isr = new InputStreamReader(fis); // 创建一个缓冲字符输入流,提高读取效率 BufferedReader br = new BufferedReader(isr); // 读取文件内容并打印输出 String line; while ((line = br.readLine()) != null) { System.out.println(line); } // 关闭流 br.close(); } catch (IOException e) { e.printStackTrace(); } } } 

5.3 输入输出流类

  • OutputStream:用于向输出目标写入字节数据的抽象类。
  • FileOutputStream:将字节数据写入文件的类。
  • ByteArrayOutputStream:将字节数据写入字节数组的类。
  • BufferedOutputStream:提供缓冲功能的字节输出流类。
  • DataOutputStream:将基本数据类型写入输出流的类。
import java.io.*; public class OutputStreamExample { public static void main(String[] args) { try { // 创建一个文件输出流,用于向文件中写入字节数据 FileOutputStream fos = new FileOutputStream("example.txt"); // 创建一个缓冲字节输出流,提高写入效率 BufferedOutputStream bos = new BufferedOutputStream(fos); // 创建一个字节数组输出流,用于将数据写入字节数组中 ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 创建一个数据输出流,用于将基本数据类型写入输出流中 DataOutputStream dos = new DataOutputStream(baos); // 写入数据到输出流中 dos.writeInt(123); dos.writeDouble(3.14); dos.writeUTF("Hello, world!"); // 将数据写入文件 bos.write(baos.toByteArray()); // 关闭流 dos.close(); bos.close(); } catch (IOException e) { e.printStackTrace(); } } } 

5.4 字符输出流类

  • Writer:用于向输出目标写入字符数据的抽象类。
  • FileWriter:将字符数据写入文件的类。
  • BufferedWriter:提供缓冲功能的字符输出流类。
  • OutputStreamWriter:将字节流转换为字符流的类。
import java.io.*; public class WriterExample { public static void main(String[] args) { try { // 创建一个文件输出流,用于向文件中写入字符数据 FileWriter fw = new FileWriter("example.txt"); // 创建一个缓冲字符输出流,提高写入效率 BufferedWriter bw = new BufferedWriter(fw); // 创建一个字符数组输出流,用于将字符数据写入字符数组中 CharArrayWriter caw = new CharArrayWriter(); // 创建一个字符输出流,用于将字符数据写入输出流中 PrintWriter pw = new PrintWriter(caw); // 写入数据到输出流中 pw.println("Hello, world!"); pw.println("This is a test."); // 将数据写入文件 bw.write(caw.toCharArray()); // 关闭流 pw.close(); bw.close(); } catch (IOException e) { e.printStackTrace(); } } } 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/122240.html

(0)
上一篇 2025-10-18 10:15
下一篇 2025-10-18 10:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信