Java IO输入输出流 第15章

news2024/11/13 14:56:05

Java I/O输入/输出流 第15章

1.输入/输出流

Java I/O(输入/输出)流是用于在Java程序中处理输入和输出数据的机制。这是与文件、网络连接、键盘、屏幕等各种数据源和数据目标进行交互的重要方式。Java的I/O库提供了一组类来处理各种I/O操作,这些类位于java.io包中。

Java I/O流主要分为两类:

  1. 字节流(Byte Streams):这些流以字节为单位进行数据传输,适用于处理二进制数据,如图像、音频、视频等。常见的字节流类包括FileInputStreamFileOutputStreamBufferedInputStreamBufferedOutputStream等。
  2. 字符流(Character Streams):这些流以字符为单位进行数据传输,适用于处理文本数据,如文本文件的读写。字符流会自动处理字符编码和解码,以确保正确的字符转换。常见的字符流类包括FileReaderFileWriterBufferedReaderBufferedWriter等。

1.1输入流

输入流(InputStream)是用于从数据源(通常是文件、网络连接或其他数据源)读取数据的抽象类。输入流提供了各种方法来从数据源中逐个字节或一组字节读取数据。输入流通常用于处理输入数据,如文件读取、网络通信中的数据接收等。

以下是一些常用的Java输入流类和方法:

  1. FileInputStream:用于从文件中读取数据。

    InputStream input = new FileInputStream("example.txt");
    
  2. ByteArrayInputStream:用于从字节数组中读取数据。

    byte[] data = new byte[] { 65, 66, 67, 68 };
    InputStream input = new ByteArrayInputStream(data);
    
  3. BufferedInputStream:用于提高性能的缓冲输入流。它包装在其他输入流周围,通过缓冲区一次读取多个字节。

    InputStream input = new BufferedInputStream(new FileInputStream("example.txt"));
    
  4. DataInputStream:用于以二进制格式读取基本数据类型。

    InputStream input = new DataInputStream(new FileInputStream("data.dat"));
    
  5. ObjectInputStream:用于反序列化对象,从输入流中还原对象。

    InputStream input = new FileInputStream("object.dat");
    ObjectInputStream objectInput = new ObjectInputStream(input);
    Object obj = objectInput.readObject();
    
  6. PipedInputStream:用于线程间通信,通过管道传输数据。

    PipedInputStream input = new PipedInputStream();
    

使用输入流时,通常会调用其read方法来读取数据,并根据读取结果进行处理。输入流的常用方法包括:

  • int read():从输入流中读取下一个字节的数据,返回读取的字节数据,如果到达流的末尾,则返回-1。
  • int read(byte[] buffer):从输入流中读取多个字节数据到字节数组中,并返回实际读取的字节数。
  • int read(byte[] buffer, int offset, int length):从输入流中读取指定数量的字节到字节数组的指定偏移位置,返回实际读取的字节数。
  • void close():关闭输入流,释放相关资源。

以下是一个简单的示例,演示如何使用FileInputStream读取文件中的数据:

import java.io.*;

public class InputStreamExample {
    public static void main(String[] args) {
        try {
            InputStream input = new FileInputStream("example.txt");
            int data;
            while ((data = input.read()) != -1) {
                System.out.print((char) data);
            }
            input.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这个示例使用FileInputStream从名为"example.txt"的文件中逐个字节读取数据,并将其显示在控制台上。

1.2输出流

输出流(OutputStream)是用于向数据目标(通常是文件、网络连接或其他数据目标)写入数据的抽象类。输出流提供了各种方法来将数据逐个字节或一组字节写入到数据目标中。输出流通常用于处理输出数据,如将数据写入文件、通过网络发送数据等。

以下是一些常用的Java输出流类和方法:

  1. FileOutputStream:用于将数据写入文件。

    OutputStream output = new FileOutputStream("output.txt");
    
  2. ByteArrayOutputStream:用于将数据写入字节数组。

    ByteArrayOutputStream output = new ByteArrayOutputStream();
    
  3. BufferedOutputStream:用于提高性能的缓冲输出流。它包装在其他输出流周围,通过缓冲区一次写入多个字节。

    OutputStream output = new BufferedOutputStream(new FileOutputStream("output.txt"));
    
  4. DataOutputStream:用于以二进制格式写入基本数据类型。

    OutputStream output = new DataOutputStream(new FileOutputStream("data.dat"));
    
  5. ObjectOutputStream:用于将对象序列化后写入输出流中。

    OutputStream output = new FileOutputStream("object.dat");
    ObjectOutputStream objectOutput = new ObjectOutputStream(output);
    objectOutput.writeObject(someObject);
    
  6. PipedOutputStream:用于线程间通信,通过管道传输数据。

    PipedOutputStream output = new PipedOutputStream();
    

使用输出流时,通常会调用其write方法来写入数据,并根据写入结果进行处理。输出流的常用方法包括:

  • void write(int b):将一个字节写入输出流。
  • void write(byte[] buffer):将字节数组中的所有数据写入输出流。
  • void write(byte[] buffer, int offset, int length):将字节数组中的指定范围数据写入输出流。
  • void flush():将缓冲区中的数据立即刷新到输出流,确保数据被写入。
  • void close():关闭输出流,释放相关资源

以下是一个简单的示例,演示如何使用FileOutputStream将数据写入文件:

import java.io.*;

public class OutputStreamExample {
    public static void main(String[] args) {
        try {
            OutputStream output = new FileOutputStream("output.txt");
            String data = "Hello, Java I/O!";
            byte[] bytes = data.getBytes();
            output.write(bytes);
            output.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这个示例使用FileOutputStream将字符串数据写入名为"output.txt"的文件中

2.File类

File类是Java中用于操作文件和目录的类,它提供了一种在文件系统中创建、访问、检查和管理文件和目录的方法。File类的实例可以代表文件或目录的路径,允许你进行文件和目录的各种操作,如创建文件、删除文件、查询文件信息等。

以下是File类的一些常见操作和用法:

  1. 创建文件或目录

    • File file = new File("example.txt"):创建一个代表名为"example.txt"的文件的File对象。
    • File dir = new File("myDirectory"):创建一个代表名为"myDirectory"的目录的File对象。
    • file.createNewFile():在文件系统中创建一个文件。
    • dir.mkdir():在文件系统中创建一个目录。
  2. 检查文件或目录属性

    • file.exists():检查文件是否存在。
    • file.isFile():检查File对象是否代表文件。
    • dir.isDirectory():检查File对象是否代表目录。
    • file.getName():获取文件或目录的名称。
    • file.getAbsolutePath():获取文件或目录的绝对路径。
  3. 获取文件和目录内容

    • dir.list():返回目录中的文件和子目录的名称数组。
    • dir.listFiles():返回目录中的文件和子目录的File对象数组。
  4. 删除文件或目录

    • file.delete():删除文件。
    • dir.delete():删除目录。
  5. 重命名文件或目录

    • file.renameTo(newName):重命名文件。
    • dir.renameTo(newName):重命名目录。
  6. 遍历目录内容

    使用递归或循环来遍历目录中的文件和子目录。你可以使用listFiles()方法获取File对象数组,并递归遍历子目录。

例1:在指定盘目录创建文本文件

在这里插入图片描述

3.文件输入/输出流

3.1FileInputStream和FileOutputStream类

FileInputStreamFileOutputStream是Java中用于文件输入和输出的类,它们分别用于从文件中读取数据和将数据写入文件。这两个类属于字节流,适用于处理二进制数据,如图像、音频、视频以及文本等。以下是关于它们的更详细信息:

  1. FileInputStream
    • FileInputStream 是用于从文件中读取数据的类。
    • 它继承自 InputStream 类,因此可以使用所有 InputStream 提供的方法来读取文件中的字节数据。
    • 你可以通过创建一个 FileInputStream 对象,并传递文件路径作为参数来打开一个文件以供读取。
    • 通常使用 read() 方法从文件中逐个字节地读取数据。例如,int data = fileInputStream.read(); 会返回文件中的下一个字节数据。
    • 需要注意的是,在使用完 FileInputStream 后,应该调用 close() 方法关闭流,以确保文件句柄和系统资源得到释放。
  2. FileOutputStream
    • FileOutputStream 是用于向文件中写入数据的类。
    • 它继承自 OutputStream 类,因此可以使用所有 OutputStream 提供的方法来写入数据到文件中。
    • 你可以通过创建一个 FileOutputStream 对象,并传递文件路径作为参数来打开一个文件以供写入。
    • 通常使用 write() 方法将字节数据写入文件。例如,fileOutputStream.write(data) 会将一个字节的数据写入文件。
    • 需要注意,在使用完 FileOutputStream 后,应该调用 close() 方法关闭流,以确保文件得到保存并释放相关资源。

例2:写入/读取文本内容

在这里插入图片描述

3.2FileReader和FileWriter类

FileReaderFileWriter 是 Java 中用于读取和写入字符数据的类,它们通常用于处理文本文件。这两个类是字符流,会自动处理字符编码和解码,以确保正确的字符转换。以下是关于它们的更详细信息:

  1. FileReader:
    • FileReader 用于从文件中读取字符数据。
    • 它继承自 InputStreamReader 类,因此可以使用所有 Reader 提供的方法来读取字符数据。
    • 你可以通过创建一个 FileReader 对象,并传递文件路径作为参数来打开一个文件以供读取。
    • 通常使用 read() 方法从文件中逐个字符地读取数据。例如,int data = fileReader.read(); 会返回文件中的下一个字符数据。
    • 需要注意的是,在使用完 FileReader 后,应该调用 close() 方法关闭流,以确保文件句柄和系统资源得到释放。
  2. FileWriter:
    • FileWriter 用于向文件中写入字符数据。
    • 它继承自 OutputStreamWriter 类,因此可以使用所有 Writer 提供的方法来写入字符数据到文件中。
    • 你可以通过创建一个 FileWriter 对象,并传递文件路径作为参数来打开一个文件以供写入。
    • 通常使用 write() 方法将字符数据写入文件。例如,fileWriter.write(data) 会将一个字符的数据写入文件。
    • 需要注意的是,在使用完 FileWriter 后,应该调用 close() 方法关闭流,以确保文件得到保存并释放相关资源。

例3:字符流读写文本

在这里插入图片描述

4.带缓存的输入/输出流

4.1 BufferedInputStream与BufferedOutputStream类

BufferedInputStreamBufferedOutputStream 是 Java 中用于提高 I/O 性能的类,它们通过使用内部缓冲区来批量读取和写入数据,从而减少了与底层流的频繁交互。这些类属于字节流,适用于处理二进制数据,如文件、网络连接等。以下是关于它们的更详细信息:

  1. BufferedInputStream:
    • BufferedInputStream 用于从输入流中读取数据,并提供了内部缓冲区,可以一次读取多个字节数据。
    • 你可以通过创建一个 BufferedInputStream 对象,并将其他输入流(如 FileInputStream)作为参数传递给它,以创建一个包装了缓冲功能的输入流。
    • 使用 read() 方法来从缓冲区中读取数据,通常一次读取多个字节,然后逐个返回。
    • BufferedInputStream 对于频繁的小量读取操作特别有用,因为它可以减少与底层流的交互次数,提高读取性能。
  2. BufferedOutputStream:
    • BufferedOutputStream 用于向输出流中写入数据,并提供了内部缓冲区,可以一次写入多个字节数据。
    • 你可以通过创建一个 BufferedOutputStream 对象,并将其他输出流(如 FileOutputStream)作为参数传递给它,以创建一个包装了缓冲功能的输出流。
    • 使用 write() 方法来将数据写入缓冲区,通常一次写入多个字节,然后一次性刷新到底层输出流。
    • BufferedOutputStream 对于频繁的小量写入操作也特别有用,因为它可以减少与底层流的交互次数,提高写入性能。

4.2BufferedReader与BufferedWriter类

BufferedReaderBufferedWriter 是 Java 中用于读取和写入字符数据的类,它们提供了缓冲功能,可以一次读取和写入多个字符,从而提高了 I/O 性能。这些类通常用于处理文本数据,如文本文件的读写。以下是关于它们的更详细信息:

  1. BufferedReader:
    • BufferedReader 用于从字符输入流中读取数据,并提供了内部缓冲区,可以一次读取多个字符数据。
    • 你可以通过创建一个 BufferedReader 对象,并将其他字符输入流(如 FileReaderInputStreamReader)作为参数传递给它,以创建一个包装了缓冲功能的字符输入流。
    • 使用 read() 方法来从缓冲区中读取数据,通常一次读取多个字符,然后逐个返回。
    • BufferedReader 对于频繁的小量读取操作特别有用,因为它可以减少与底层流的交互次数,提高读取性能。另外,它还提供了一些方便的方法用于读取行。
  2. BufferedWriter:
    • BufferedWriter 用于向字符输出流中写入数据,并提供了内部缓冲区,可以一次写入多个字符数据。
    • 你可以通过创建一个 BufferedWriter 对象,并将其他字符输出流(如 FileWriterOutputStreamWriter)作为参数传递给它,以创建一个包装了缓冲功能的字符输出流。
    • 使用 write() 方法来将数据写入缓冲区,通常一次写入多个字符,然后一次性刷新到底层输出流。
    • BufferedWriter 对于频繁的小量写入操作也特别有用,因为它可以减少与底层流的交互次数,提高写入性能。另外,它还提供了一些方便的方法用于写入行。

例题4

在这里插入图片描述

5数据输入/输出流

数据输入流和数据输出流(DataInputStream 和 DataOutputStream)是 Java 中用于以二进制格式读写基本数据类型的类。它们是字节流,通常用于处理二进制数据,如将整数、浮点数等写入文件并读取它们。

以下是关于数据输入流和数据输出流的更详细信息:

DataInputStream:

  • DataInputStream 是用于以二进制格式从输入流中读取基本数据类型的类。
  • 你可以通过创建一个 DataInputStream 对象,并将其他输入流(如 FileInputStreamSocketInputStream)作为参数传递给它,以创建一个包装了二进制数据读取功能的输入流。
  • 使用 readInt(), readDouble(), readBoolean(), 等方法从输入流中读取基本数据类型的数据。
  • 通常与 DataOutputStream 配合使用,以确保写入和读取的数据格式一致。

DataOutputStream:

  • DataOutputStream 用于以二进制格式向输出流中写入基本数据类型的类。
  • 你可以通过创建一个 DataOutputStream 对象,并将其他输出流(如 FileOutputStreamSocketOutputStream)作为参数传递给它,以创建一个包装了二进制数据写入功能的输出流。
  • 使用 writeInt(), writeDouble(), writeBoolean(), 等方法将基本数据类型的数据写入输出流。
  • 通常与 DataInputStream 配合使用,以确保写入和读取的数据格式一致。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1122783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络笔记】TCP/IP参考模型基本概念,包括五层参考模型

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

概率论_概率公式中的分号(;)、逗号(,)、竖线(|)

1. 概率公式中的分号(;)、逗号(,)、竖线(|) ; 分号代表前后是两类东西,以概率P(x;θ)为例,分号前面是x样本,分号后边是模型参数。 , 逗号代表两者地位平等,代表与的关系 | 竖线代表 if,以条件概率P(A|B)为例&#xff0…

【数据结构】String类对象的创建与字符串常量池的“神秘交易”

作者主页:paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力…

【码制】原码反码补码移码浮点数

从C语言占位符到码值 学C语言的时候一定会用到printf("%d",a); 有的课程称%d为“占位符”,非常形象:%d替a占位,输出的时候a的值会替换%d的内容。 但也有课程称之为“转换规范”,官方称之为“format specifiers”格式说…

Git最佳实践:git常用命令和原理

Git 是一个开源的分布式版本控制系统。 Git 工作区、暂存区和版本库 工作区:就是你在电脑里能看到的目录。暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时…

7.20 SpringBoot项目实战【图书详情-学生端】:图书信息 + 评论列表 + 是否收藏

文章目录 前言一、接口规划二、编写服务层三、编写数据访问层四、编写控制器五、PostMan测试1. getBook 根据id获取图书2. getBookCommentList 根据id获取图书详情 - 评论列表3. getFavoriteId 获取学生收藏了某图书的收藏id 最后 前言 学生的【借阅申请】审核通过以后&#x…

nodejs+vue市民健身中心网上平台-计算机毕业设计

市民健身中心网上平台分为用户界面和管理员界面,用户界面功能模块图如图1所示,管理员界面功能模块图如图2所示。 目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs…

springboot+avue医院绩效考核系统源码

医院绩效考核系统是一种以人力资源管理为基础,选用适合医院组织机构属性的绩效理论和方法,基于医院战略目标,构建全方位的绩效考评体系,在科学、合理的绩效管理体系基础上,采用科学管理的方法,如平衡计分卡…

C++前缀和算法:生成数组原理、源码及测试用例

本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 动态规划,日后完成。 题目 给定三个整数 n、m 和 k 。考虑使用下图描述的算法找出正整数数组中最大的元素。 请你构建一个具有以下属性的数组 arr &#…

Amazon CodeWhisperer让力扣不再用力code!

书接上文《爱编程 why not AI编程》,通过前文的对于Amazon CodeWhisperer的介绍、入门指南、相关课程以及【云上探索实验室】活动,各位读者们应该对于Amazon CodeWhisperer有了一些了解,那么作者今天将该通过本篇文章来介绍用Amazon CodeWhis…

OpenCV官方教程中文版 —— Canny 边缘检测

OpenCV官方教程中文版 —— Canny 边缘检测 前言一、原理1.噪声去除2.计算图像梯度3.非极大值抑制4.滞后阈值 二、OpenCV 中的 Canny 边界检测练习 前言 OpenCV 中的 Canny 边缘检测 • 了解 Canny 边缘检测的概念 • 学习函数 cv2.Canny() 一、原理 Canny 边缘检测是一种…

FreeRTOS深入教程(任务的引入及栈的作用)

文章目录 前言一、任务的引入二、深入理解C语言函数的调用1.ARM架构2.基础汇编指令3.函数运行流程分析 三.保存现场的几种情况1.函数调用2.中断处理3.任务切换 总结 前言 本篇文章开始带大家深入学习FreeRTOS,带大家学习什么是任务,并且深入学习栈的作用…

Openssl数据安全传输平台008:业务数据分析+工厂方法

文章目录 UML图1.1 客户端1.2 服务器端 UML图 1.1 客户端 // 准备要发送的数据 struct RequestMsg {//1 密钥协商 //2 密钥校验; // 3 密钥注销int cmdType; // 报文类型string clientId; // 客户端编号string serverId; // 服务器端编号string sign;string data; };1.2 服务器…

USB学习(1):USB基础之接口类型、协议标准、引脚分布、架构、时序和数据格式

连接计算机外围设备最简单的方法是通过USB(通用串行总线)。USB是即插即用接口,可以将扫描仪、打印机、数码相机、闪存驱动器等计算机外围设备连接到计算机上。本篇文章就来介绍一下USB的一些基础知识,包括。 文章目录 1 接口类型和标准规范2 引脚分布3 …

前端Vue——安装和遇到的问题记录

文章目录 安装Node.js安装Vue需要的脚手架Vue Cli在PyCharm中开发Vue项目 安装Node.js 下载地址:https://nodejs.cn/download/ 下载.Msi即可,然后安装,一直next WinR,cmd,node -v可以查看node的版本,v18.1…

Deno 命令行界面

目录 1、命令行界面 ​2、脚本源 3、脚本参数 4、监听模式 5、完整性标记(lock files) 6、缓存和编译标记 7、运行时标记 7.1 类型检查标记 7.2 权限标记 7.2.1 权限 7.2.2 放心地运行不受信任的代码 7.2.3 权限列表 7.2.4 可配置权限 文件…

Vm虚拟机安装Linux(ubuntu18.04)系统教程(2023最新最详细)

软件:Linux版本:18.0.4语言:简体中文大小:1.82G安装环境:VMware硬件要求:CPU2.0GHz 内存4G(或更高) 下载通道①丨百度网盘: 1.Vm虚拟机15.5下载链接: https://pan.baidu.…

Vue项目中使用Multiavatarjs生成自定义随机头像-demo

Multiavatar & vue-color-avatar 前者使用简单一点提供的有api,后者更类似一个项目 主要使用Multiavatar去实现随机生成头像的功能 https://github.com/multiavatar/Multiavatar/blob/main/multiavatar.js 使用很简单,把js下载保存到项目中&#xff…

【Top101】002链表内指定区间反转

链表内指定区间反转_牛客题霸_牛客网 import java.util.*;/** public class ListNode {* int val;* ListNode next null;* public ListNode(int val) {* this.val val;* }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿…

零代码编程:用ChatGPT将Mobi、epub、azw3等电子书批量转换为word文档

将ebook格式转换为PDF需要一个名为Calibre的命令行工具。这是一个开源的电子书管理工具,首先在系统上安装它,软件下载地址:https://calibre-ebook.com/download_windows 然后将其添加到PATH环境变量中: 接下来,在ChatG…