Java中I/O输入输出的深入讲解

Java中I/O输入输出的深入讲解

什么是I/O

I/O(Input/Output)指的是数据的输入和输出,是计算机与程序外部世界进行信息交互的方式之一。在Java中,I/O被视为一种Java API,提供了许多与文件、网络和其他I/O设备进行数据输入和输出的类和方法。

I/O的主要类型

字节流

字节流(Byte Stream)以字节为单位进行操作,可以读写任何类型的数据。在 Java 中主要是由 InputStream 和 OutputStream 两个抽象类派生出来的。

以读文件为例,以下为读文件的步骤:

  1. 打开文件;

FileInputStream fis = new FileInputStream(fileName);

  1. 开始读取数据;

int data = fis.read(); //读取文件字节,并转换成整数
while (data != -1) {
data = fis.read();
}

  1. 关闭文件。

fis.close();

字符流

字符流(Character Stream)以字符为单位进行操作,仅支持读取和写入纯文本信息。在 Java 中主要是由 Reader 和 Writer 两个抽象类派生出来的。

以读文件为例,以下为读文件的步骤:

  1. 打开文件,创建 Reader 对象;

FileReader fr = new FileReader(fileName);
BufferedReader br = new BufferedReader(fr);

  1. 开始读取数据;

String line = br.readLine();
while (line != null) {
line = br.readLine();
}

  1. 关闭文件。

br.close();
fr.close();

缓冲流

缓冲流(Buffer Stream)是为了增强字节流和字符流的效率而设计的。缓冲流通过在内存中创建一个缓冲区,使得数据读写时,先让数据暂时存储在缓冲区中,而不是通过物理设备(硬盘、网络等)直接读写。常用的缓冲流有 BufferedInputStream 和 BufferedOutputStream(字节流缓冲流)以及 BufferedReader 和 BufferedWriter(字符流缓冲流)。

以读文件为例,以下为读文件的步骤:

  1. 打开文件,创建 Input Stream 和 Buffered Input Stream 对象;

FileInputStream fis = new FileInputStream(fileName);
BufferedInputStream bis = new BufferedInputStream(fis);

  1. 开始读取数据;

int data = bis.read();
while (data != -1) {
data = bis.read();
}

  1. 关闭文件。

bis.close();
fis.close();

转换流

转换流(Conversion Stream)是字符流和字节流之间的桥梁,支持不同的字符集之间进行转换。常用的转换流是 InputStreamReader 和 OutputStreamWriter。

以读文件为例,以下为读文件的步骤:

  1. 打开文件,创建 InputStream 和 InputStreamReader 对象;

FileInputStream fis = new FileInputStream(fileName);
InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);

  1. 开始读取数据;

int data = isr.read();
while (data != -1) {
data = isr.read();
}

  1. 关闭文件。

isr.close();
fis.close();

I/O的常用类和方法

File

File 类代表文件或目录(文件夹),常用的方法有:

  • File file = new File(fileName):创建 File 对象;
  • file.exists():判断文件或目录是否存在;
  • file.getAbsolutePath():获得文件或目录的绝对路径;
  • file.isDirectory()file.isFile():判断是否是目录或文件;
  • file.mkdirs():递归创建目录;
  • file.delete():删除文件或目录。

FileInputStream/FileOutputStream

FileInputStream 和 FileOutputStream 类分别用于读取和写入文件,常用的方法有:

  • FileInputStream fis = new FileInputStream(fileName):创建 FileInputStream 对象;
  • FileOutputStream fos = new FileOutputStream(fileName):创建 FileOutputStream 对象;
  • fis.read()fos.write(byte[]):读取或写入字节数据;
  • fis.close()fos.close():关闭流。

FileReader/FileWriter

FileReader 和 FileWriter 类分别用于读取和写入文件中的字符数据,常用的方法有:

  • FileReader fr = new FileReader(fileName):创建 FileReader 对象;
  • FileWriter fw = new FileWriter(fileName):创建 FileWriter 对象;
  • fr.read()fw.write(char[]):读取或写入字符数据;
  • fr.close()fw.close():关闭流。

BufferedReader/BufferedWriter

BufferedReader 和 BufferedWriter 类分别用于对字符流进行缓冲,常用的方法有:

  • BufferedReader br = new BufferedReader(fr):创建 BufferedReader 对象;
  • BufferedWriter bw = new BufferedWriter(fw):创建 BufferedWriter 对象;
  • br.readLine()bw.write(String):读取或写入一行字符数据;
  • br.close()bw.close():关闭缓冲流。

ByteArrayInputStream/ByteArrayOutputStream

ByteArrayInputStream 和 ByteArrayOutputStream 类分别用于读取和写入字节数组,常用的方法有:

  • ByteArrayInputStream bis = new ByteArrayInputStream(byteArray):创建 ByteArrayInputStream 对象;
  • ByteArrayOutputStream bos = new ByteArrayOutputStream():创建 ByteArrayOutputStream 对象;
  • bis.read(byte[])bos.write(byte[]):读取或写入字节数据;
  • bis.close()bos.close():关闭流。

示例

示例1:读取文件

以下示例是通过 BufferedReader 和 FileReader 读取一个文件并输出文件内容:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class ReadFile {
    public static void main(String[] args) {
        String fileName = "C:/temp/test.txt";
        try (FileReader fr = new FileReader(fileName);
             BufferedReader br = new BufferedReader(fr)) {
            String line = br.readLine();
            while (line != null) {
                System.out.println(line);
                line = br.readLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

示例2:写入文件

以下示例是通过 BufferedWriter 和 FileWriter 向文件中写入一行字符串:

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class WriteFile {
    public static void main(String[] args) {
        String fileName = "C:/temp/test.txt";
        try (FileWriter fw = new FileWriter(fileName, true);
             BufferedWriter bw = new BufferedWriter(fw)) {
            bw.write("Hello, World!\n");
            bw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

以上示例中 <String> 为省略的泛型参数,可以根据具体情况进行替换。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中I/O输入输出的深入讲解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 如何通过一张图搞懂springBoot自动注入原理

    下面是关于“如何通过一张图搞懂springBoot自动注入原理”的完整攻略。 1. 简介 在 Spring Boot 中,我们可以使用自动配置完成很多操作,其中最重要的一个就是通过自动注入来维护 Spring 应用程序之间的依赖关系。 Spring Boot 中自动注入的原理比较复杂,但我们可以用一张图来概述它的过程。 2. 图片介绍 下面这张图片展示了自动…

    Java 2023年5月15日
    00
  • SpringBoot配置数据库密码加密的实现

    为了实现Spring Boot配置数据库密码加密,我们可以使用以下步骤: 配置依赖项 需要添加以下依赖项到项目的pom.xml文件中: <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security…

    Java 2023年5月19日
    00
  • BMIDE环境导入项目报编码错误解决方案

    下面是详细的BMIDE环境导入项目报编码错误解决方案攻略: 问题描述 当我们使用BMIDE环境导入项目时,可能会遇到编码错误的问题。具体表现为打开BMIDE后,选择需要导入的项目后点击“确定”按钮,但出现了以下错误提示信息: The project description ‘`’ should be a dirname representing a loca…

    Java 2023年5月20日
    00
  • asp.net中利用Jquery+Ajax+Json实现无刷新分页的实例代码

    首先我们需要了解一下如何在ASP.NET中使用jQuery和AJAX。在ASP.NET中,我们可以使用JavaScriptSerializer对象将对象序列化为JSON格式,然后将其返回给客户端。 以下是实现无刷新分页的详细流程和实例代码: 第一步:添加必要的JavaScript库 我们需要在网站中添加jQuery和Ajax的库文件。可以手动下载这些库文件并…

    Java 2023年5月19日
    00
  • Java8时间接口LocalDateTime详细用法

    Java8时间接口LocalDateTime详细用法 简介 Java8新增了一套时间日期API,称为java.time,提供了更好的可读性和更好的精度。LocalDateTime是这些API的一个实现类,代表了一个本地的日期和时间,不带时区信息。 创建LocalDateTime对象 可以使用now()方法创建当前日期时间的对象: LocalDateTime …

    Java 2023年5月20日
    00
  • SpringBoot 开发提速神器 Lombok+MybatisPlus+SwaggerUI

    我将为您详细讲解 Spring Boot 开发提速神器 Lombok+MybatisPlus+SwaggerUI 的完整攻略。 概述 Spring Boot 是一款轻量级、快速开发的框架,使用起来很方便,但是在我们进行开发时,有很多简单重复的代码需要我们手动编写,这样大大增加了我们的工作量。Lombok、MybatisPlus 和 SwaggerUI 是经过…

    Java 2023年5月19日
    00
  • SpringBoot集成JPA的示例代码

    下面我会详细讲解“SpringBoot集成JPA的示例代码”的完整攻略,过程中会包含两条示例。 1. 环境准备 在开始之前,我们需要确保我们的开发环境中已经安装好了以下软件: JDK 8或以上版本 IntelliJ IDEA或其他一款IDE 然后,我们需要确保我们在项目中引入了以下依赖: <dependency> <groupId>o…

    Java 2023年5月20日
    00
  • Mybatis中自定义实例化SqlSessionFactoryBean问题

    在Mybatis中,SqlSessionFactory是负责创建SqlSession的工厂类。而SqlSessionFactoryBean是把Mybatis和Spring整合的关键类,其主要作用是将SqlSession实例注入到Spring容器中。 在某些情况下,我们需要自定义实例化SqlSessionFactoryBean,比如需要设置动态的数据源,或者自…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部