Java IO流基础

一、什么是Java IO流

  1. 概念
    • 想象你有一个管道,一端连接着数据源(比如一个文件,就像一个装满水的水桶,数据就是桶里的水),另一端连接着你的程序。这个管道就是IO流。如果数据从数据源通过管道进入程序,这就是输入流(Input Stream),相当于从水桶往你的容器里抽水;如果数据从程序通过管道送到目标(比如把处理后的数据存到另一个文件),这就是输出流(Output Stream),就像把你容器里的水倒入另一个水桶。
  2. 用途
    • 它的存在就是为了让Java程序能够和外界(如文件系统、网络等)进行数据交互。比如说,你想读取一个文本文件里的内容到程序里进行处理,或者把程序里生成的数据保存到一个文件中,都得靠IO流来完成这个数据的传输过程。

二、Java IO流的分类

(一)字节流

  1. 字节输入流(InputStream)
    • 基本介绍
      • 字节输入流就像是一个小助手,它每次从数据源(如文件)中一个字节一个字节地把数据拿过来给程序。它是所有字节输入流的抽象基类,意味着其他具体的字节输入流类(如FileInputStream)都是在它的基础上构建的。
    • 示例
      • 假设我们有一个名为input.txt的文件,里面存储了一些字节数据(可以是任何二进制数据,像图片、视频等在计算机里都是以字节形式存储的),我们要用FileInputStream来读取这个文件。
import java.io.FileInputStream;
import java.io.IOException;public class ByteInputStreamExample {public static void main(String[] args) {try {FileInputStream fis = new FileInputStream("input.txt");int data;while ((data = fis.read())!= -1) {// 这里的data就是每次读取到的一个字节,它是一个0 - 255之间的整数System.out.print(data + " ");}fis.close();} catch (IOException e) {e.printStackTrace();}}
}
  • 在这个例子中,while循环里的fis.read()方法每次从文件里读取一个字节,当读到文件末尾时,它会返回 - 1,循环就结束了。
  1. 字节输出流(OutputStream)
    • 基本介绍
      • 字节输出流则是把程序里的数据一个字节一个字节地送到目标(如文件)里。它也是一个抽象基类,像FileOutputStream就是它的一个具体实现类。
    • 示例
      • 我们要把一些字节数据(这里简单地用整数表示字节的值)写入到一个名为output.txt的文件中。
import java.io.FileOutputStream;
import java.io.IOException;public class ByteOutputStreamExample {public static void main(String[] args) {try {FileOutputStream fos = new FileOutputStream("output.txt");byte[] data = {65, 66, 67}; // 这里代表字符'A'、'B'、'C'的ASCII码值fos.write(data);fos.close();} catch (IOException e) {e.printStackTrace();}}
}
  • 在这个例子中,我们创建了一个FileOutputStream对象,然后用write方法把字节数组里的数据写入到文件中。

(二)字符流

  1. 字符输入流(Reader)
    • 基本介绍
      • 字符输入流和字节输入流有点类似,但它是专门用来处理字符数据的。因为在计算机里,字符有不同的编码方式(如UTF - 8、GBK等),字符流在读取字符时会根据指定的编码方式进行转换。它是字符输入流的抽象基类,FileReader是它的一个具体实现类。
    • 示例
      • 假如我们有一个文本文件input.txt,里面存储着一些文本内容,我们用FileReader来读取它。
import java.io.FileReader;
import java.io.IOException;public class CharacterInputStreamExample {public static void main(String[] args) {try {FileReader fr = new FileReader("input.txt");int data;while ((data = fr.read())!= -1) {// 这里的data是字符的Unicode编码值,我们可以把它转换为字符输出System.out.print((char) data);}fr.close();} catch (IOException e) {e.printStackTrace();}}
}
  • 这里while循环里的fr.read()方法每次读取一个字符的编码值,我们把它转换为字符后输出。
  1. 字符输出流(Writer)
    • 基本介绍
      • 字符输出流用于把程序中的字符数据按照指定的编码方式写入到目标(如文件)中。FileWriter是字符输出流的一个具体实现类。
    • 示例
      • 我们要把一些字符写入到一个名为output.txt的文件中。
import java.io.FileWriter;
import java.io.IOException;public class CharacterOutputStreamExample {public static void main(String[] args) {try {FileWriter fw = new FileWriter("output.txt");fw.write("Hello, World!");fw.close();} catch (IOException e) {e.printStackTrace();}}
}
  • 在这个例子中,FileWriterwrite方法把字符串"Hello, World!"写入到文件中。

三、处理流

  1. 缓冲流(BufferedInputStream和BufferedOutputStream、BufferedReader和BufferedWriter)
    • 基本介绍
      • 缓冲流就像是一个有缓存功能的小仓库。比如你要从文件里读取很多数据,如果没有缓冲流,每次都要直接从文件系统读取一个字节或者一个字符,这很慢。有了缓冲流,它会先把一部分数据读到自己的缓存区(就像先把货物搬到仓库里),然后程序从缓存区里拿数据就快多了。同样,在写入数据时,也是先把数据放到缓存区,等缓存区满了或者程序主动刷新缓存区时,才把数据真正写到目标里。
    • 示例(以BufferedReader和BufferedWriter为例)
      • 我们要读取一个文本文件input.txt,并把内容处理后写入到output.txt中。
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class BufferedStreamExample {public static void main(String[] args) {try {BufferedReader br = new BufferedReader(new FileReader("input.txt"));BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"));String line;while ((line = br.readLine())!= -1) {// 这里可以对读取到的每行数据进行处理,比如把所有字母转换为大写String processedLine = line.toUpperCase();bw.write(processedLine);bw.newLine();}br.close();bw.close();} catch (IOException e) {e.printStackTrace();}}
}
  • 在这个例子中,BufferedReaderreadLine方法可以一次读取一行文本,BufferedWriternewLine方法用于写入一个换行符。
  1. 数据流(DataInputStream和DataOutputStream)
    • 基本介绍
      • 数据流可以让我们方便地读写基本数据类型(如intdoubleboolean等)和字符串。它会把这些数据类型按照一定的格式转换为字节流进行传输。
    • 示例(以DataOutputStream为例)
      • 我们要把一些不同类型的数据写入到一个文件中。
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;public class DataOutputStreamExample {public static void main(String[] args) {try {FileOutputStream fos = new FileOutputStream("data.txt");DataOutputStream dos = new DataOutputStream(fos);dos.writeInt(10);dos.writeDouble(3.14);dos.writeBoolean(true);dos.writeUTF("Hello");dos.close();} catch (IOException e) {e.printStackTrace();}}
}
  • 在这个例子中,DataOutputStreamwriteIntwriteDoublewriteBooleanwriteUTF方法分别用于写入int类型、double类型、boolean类型的数据和UTF - 8编码的字符串。

四、注意事项

  1. 资源关闭
    • 不管是字节流还是字符流,在使用完后都要关闭。就像你用完水管后要关上水龙头一样,不关闭流可能会导致资源泄漏,比如文件一直被占用不能被其他程序访问等。在Java中,可以使用try - with - resources语句来自动关闭流,就像前面示例中的try语句块里的流对象,在try块结束时会自动调用close方法关闭流。
  2. 编码问题
    • 在使用字符流时,要特别注意编码问题。如果编码不一致,可能会导致读取和写入的数据出现乱码。例如,如果你用UTF - 8编码写入数据,但是用GBK编码读取数据,就很可能出现乱码现象。所以要确保在整个数据传输过程中编码保持一致。

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

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

相关文章

python视频编辑中的蒙版技术:创意与技术相结合

在数字视频编辑的世界里,蒙版技术是一种强大的工具,它允许我们在视频帧上进行精确的编辑和效果叠加。通过蒙版,我们可以控制哪些部分的视频内容被显示或隐藏,从而创造出各种视觉效果和过渡。在本文中,我们将探讨如何使…

文件操作和IO

目录 一. 文件预备知识 1. 硬盘 2. 文件 (1) 概念 (2) 文件路径 (3) 文件类型 二. 文件操作 1. 文件系统操作 [1] File常见的构造方法 [2] File的常用方法 [3] 查看某目录下所有的目录和文件 2. 文件内容操作 (1) 打开文件 (2) 关闭文件 (3) 读文件 (4) 写文件 …

PCB结构与组成

PCB板就是印制电路板,又称印刷电路板,是电子元器件电气连接的提供者。PCB板转化成我们所熟悉的电路板过程如下: 了解完定义,下面是我们电路板的标识 可简单的把PCB板拆分成六个部分:导线、铺铜、过孔、焊盘、丝印、阻焊…

OrienterNet在二维公共地图实现视觉定位的模型

论文来自MetaAI: https://arxiv.org/pdf/2304.02009https://arxiv.org/pdf/2304.02009github代码: https://github.com/facebookresearch/OrienterNet?tabreadme-ov-filehttps://github.com/facebookresearch/OrienterNet?tabreadme-ov-file 研究目…

LEAN 之 多态机制(Polymorphism,Type class)简析

LEAN 通过 类型类(Type Class)来提供的多态机制(Polymorphism)。 以∅:Set α 为例,有 Set α 实现 class EmptyCollection。 其中,class EmptyCollection 定义如下: 也就是&#xf…

【微软:多模态基础模型】(1)从专家到通用助手

欢迎关注【youcans的AGI学习笔记】原创作品 【微软:多模态基础模型】(1)从专家到通用助手 【微软:多模态基础模型】(2)视觉理解 【微软:多模态基础模型】(3)视觉生成 【微…

基于java的社区捐赠物品管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

机器学习—建立表现基准

让我们来看看一些具体的数字,Jtrain和Jcv是什么,以及如何做出判断,如果学习算法具有高偏差或高方差,使用一个语音识别应用的例子作为讲解。 很多在手机上进行网络搜索的用户会使用语音识别,而不是在手机上的小键盘上打…

阮一峰科技爱好者周刊(第 325 期)推荐工具:一个基于 Next.js 的博客和 CMS 系统

近期,阮一峰在科技爱好者周刊第 325 期中推荐了一款开源工具——ReactPress,ReactPress一个基于 Next.js 的博客和 CMS 系统,可查看 demo站点。(fecommunity 投稿) ReactPress:一款值得推荐的开源发布平台 …

大学语文教材电子版(第十一版)教学用书PDF及课件

大学语文课件:https://caiyun.139.com/m/i?005CiDusEVWnR 《大学语文》(第十一版)主编:徐中玉 齐森华 谭帆。 大学语文教材电子版教师用书PDF第一课《齐桓晋文之事》艺术赏析: 孟子四处游说,养成善辩的…

RK356x-8:Wifi模块AP6xxx配置与调试

本文记录如何根据原理图,配置和调试RK356x(测试用RK3566)主板上wifi/蓝牙模块(测试用AP6212,rkwifibt),使其能正确连网。 1.配置SOC接口 1.1 查看原理图,看看wifi模块用的接口是什…

Java基础——网络编程

可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)。 1. 基本的通信架构 基本的通信架构有2种形式:CS架构(Client客户端/Server服务端)、BS架构(Browser浏览器/Server服务端&…

变分自编码器(VAE, Variational Autoencoder)

代码说明 VAE 模型结构: 编码器将输入数据(如 MNIST 图像)映射到潜在空间,生成均值 (mu) 和对数方差 (logvar)。 通过重新参数化技巧 (reparameterize) 从正态分布中采样潜在向量 z。 解码器将潜在向量 z 映射回原始空间&#xf…

1. Django中的URL调度器 (项目创建与简单测试)

1. 创建 Django 项目 运行以下命令创建一个名为 blog_project 的 Django 项目: django-admin startproject blog_project2. 创建博客应用 Django 中,项目可以包含多个应用。创建一个名为 blog 的应用: cd blog_project python manage.py …

多目标优化算法:多目标黑翅鸢算法(MOBKA)求解ZDT1、ZDT2、ZDT3、ZDT4、ZDT6,提供完整MATLAB代码

一、黑翅鸢算法介绍 黑翅鸢优化算法(Black-winged Kite Algorithm, BKA)是2024年提出的一种元启发式优化算法,其灵感来源于黑翅鸢的迁徙和捕食行为。这种算法通过模拟黑翅鸢在捕食过程中的飞行和搜索策略,被用来解决优化问题&…

记一次Mysql远程连接报错

问题描述: Plugin caching sha2 password could not be loaded: 在wsl2用docker中拉取了mysql镜像,启动后想在win下的环境远程连接到docker中的mysql,报错了,报错如下所示 搜寻了相关的资料发现,在拉下来的myslq版本…

STM32F103移植FreeRTOS

1. 源码下载 在https://www.freertos.org/中下载源码,这里下载的是FreeRTOSv202212.01版本,源码内容解释可参考: https://rtos.100ask.net/zh/FreeRTOS/DShanMCU-F103/chapter7.html#_7-1-freertos%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84拷贝…

CAD多段线两侧偏移(交叉线容易出错)

public void 交叉多段线容易出错(){List<Curve> entse Z.db.SelectEntities<Curve>();List<Polyline> ents Z.db.CurvesToPolyLines(entse);//Z.db.SelectEntities<Polyline>();double offsetDistance 5.0;//偏移距离List<Polyline> resultP…

数据库EVA模式与传统数据库模式 | 分析对比及应用场景

目录 1. 实战场景2. 基本知识3. 应用场景 1. 实战场景 从实战进行探讨以及深入&#xff1a; 事因是同事给我创建表结构的时候&#xff0c;以如下这种方式进行创建&#xff1a; 看到这张表的结构可能会思考&#xff1a; 为啥设备的部件值&#xff08;日期、数值、字符串&…

算法【Java】—— 动态规划之简单多状态 dp 问题

按摩师 https://leetcode.cn/problems/the-masseuse-lcci 状态表示&#xff1a;根据经验和题目要求&#xff0c;达到 i 位置的时候&#xff0c;预约时间最长 接着我们细分状态表示&#xff1a;在遍历数组的时候&#xff0c;到达 i 位置的时候&#xff0c;又两种情况&#xff…