一文彻底搞懂IO流

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();
        }
    }
}

  • 51
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它将数据和操作封装在对象中,通过对象之间的交互实现程序的设计和开发。下面是一些关键概念,帮助你更好地理解Python面向对象编程。 1. 类(Class):类是对象的蓝图或模板,描述了对象的属性和行为。它定义了对象的特征和方法。例如,我们可以定义一个名为"Car"的类来表示汽车,其中包含属性(如颜色、型号)和方法(如加速、刹车)。 2. 对象(Object):对象是类的实例,是具体的实体。通过实例化类,我们可以创建一个对象。例如,我们可以创建一个名为"my_car"的对象,它是基于"Car"类的实例。 3. 属性(Attribute):属性是对象的特征,用于描述对象的状态。每个对象都可以具有一组属性。例如,"Car"类的属性可以包括颜色、型号等。 4. 方法(Method):方法是对象的行为,用于定义对象的操作。每个对象都可以具有一组方法。例如,"Car"类的方法可以包括加速、刹车等。 5. 继承(Inheritance):继承是一种机制,允许我们创建一个新类(称为子类),从现有类(称为父类)继承属性和方法。子类可以扩展或修改父类的功能。继承可以实现代码重用和层次化设计。 6. 多态(Polymorphism):多态是一种特性,允许不同类的对象对同一方法做出不同的响应。多态提高了代码的灵活性和可扩展性。 7. 封装(Encapsulation):封装是一种将数据和操作封装在对象中的机制,隐藏了对象的内部实现细节,只暴露必要的接口给外部使用。这样可以保护数据的安全性,提供了更好的模块化和代码复用性。 通过理解这些概念,你可以更好地掌握Python面向对象编程。在实践中,你可以使用类来创建对象,操作对象的属性和调用对象的方法,通过继承和多态实现代码的灵活性和可扩展性,通过封装保护数据的安全性和提高代码的可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值