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编码读取数据,就很可能出现乱码现象。所以要确保在整个数据传输过程中编码保持一致。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《生成式 AI》课程 第3講 CODE TASK执行文章摘要的机器人

课程 《生成式 AI》课程 第3講:訓練不了人工智慧嗎?你可以訓練你自己-CSDN博客 任务1:总结 1.我们希望你创建一个可以执行文章摘要的机器人。 2.设计一个提示符,使语言模型能够对文章进行总结。 model: gpt-4o-mini,#gpt-3.5-turbo, import…

【大数据学习 | flume】flume Sink Processors与拦截器Interceptor

1. Failover Sink Processor 故障转移处理器可以同时指定多个sink输出,按照优先级高低进行数据的分发,并具有故障转移能力。 需要修改第一台服务器agent a1.sourcesr1 a1.sinksk1 k2 a1.channelsc1 a1.sources.r1.typenetcat a1.sources.r1.bindworker…

i春秋-登陆(sql盲注爆字段,.git缓存利用)

练习平台地址 竞赛中心 题目描述 先登陆再说 题目内容 就是一个登录框 测试登录 用户名:admin or 11# 密码:随便输 返回密码错误 用户名:随便输 密码:随便输 返回用户名不存在 这里就可以确定时一个bool盲注了 这里提供一个lik…

【爬虫实战】抓取某站评论

【爬虫实战】抓取某站评论 声明:本文中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 方式一:JS逆向request发…

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

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

HarmonyOS ArkUI(基于ArkTS) 开发布局 (中)

HarmonyOS ArkUI(基于ArkTS) 开发布局 (上) 四 层叠布局 (Stack) 层叠布局(StackLayout)用于在屏幕上预留一块区域来显示组件中的元素,提供元素可以重叠的布局。层叠布局通过Stack容器组件实现位置的固定定位与层叠&…

港湾周评|鼎益丰“庞氏骗局”陨落

《港湾商业观察》李镭 在坊间有着“老鼎”之称的鼎益丰迎来了全面陨落,这丝毫不出人意料,毕竟在一年前就已经暴雷了。 同样,仙风道骨般神采的鼎益丰老板隋广义也迎来人生的至暗时刻,应了无间道那句话,出来混总是要还…

创建vue插件,发布npm

开发步骤:1.创建一个vue项目,2.开发一个组件。 3.注册成插件。 4.vite和package.json配置。5.发布到npm 1.创建一个vue项目 npm create vuelatest 生成了vue项目之后,得到了以下结构。 在src下创建个plugins目录。用于存放开发的…

用paramiko与SSH交互

# 导入paramiko库用于SSH连接,以及sys库用于处理命令行参数 import paramiko import sys# 定义一个函数send_command,用于发送命令到SSH服务器并打印输出结果 def send_command(ssh_client, cmd):# 使用exec_command方法执行命令,并获取输入、…

Go语言中AES加密算法的实现与应用

一、前言 在当今的软件开发领域,数据安全至关重要。加密技术作为保护数据机密性的关键手段,被广泛应用于各个方面。AES(高级加密标准)作为一种对称加密算法,以其高效性和安全性在众多加密场景中占据重要地位。本文将详…

CSS 语法规范

基本语法结构 CSS 的基本语法结构包含 选择器 和 声明块,两者共同组成 规则集。规则集可以为 HTML 元素设置样式,使页面结构和样式实现分离,便于网页的美化和布局调整。 CSS 规则集的结构如下: selector {property: value; }选择器(Selector) 选择器用于指定需要应用…

JavaScript 变量:理解基元和引用类型

两种基本类型的数据存储在 javascript 中的变量中:基元 和 引用类型。了解这两种类型之间的区别对于内存管理以及调节数据的共享、存储和更改至关重要。本文深入探讨了它们之间的区别,提供了现实世界的示例,并研究了有效处理这两种类型的方法…

【C++】—— stack和queue的模拟实现

前言 ​ stack 和 queue使用起来都非常简单,现在来模拟实现一下,理解其底层的原理。 ​ 在实现之前,应该知道,stack 和 queue 都是容器适配器,通过看官网文件也可以看出来;其默认的容器都是deque&#xff…

MuMu模拟器安卓12安装Xposed 框架

MuMu模拟器安卓12安装Xposed 框架 当开启代理后,客户端会对代理服务器证书与自身内置证书展开检测,只要检测出两者存在不一致的情况,客户端就会拒绝连接。正是这个原因,才致使我们既没有网络,又抓不到数据包。 解决方式: 通过xposed框架和trustmealready禁掉app里面校验…

Linux网络:守护进程

Linux网络:守护进程 会话进程组会话终端 守护进程setsiddaemon 在创建一个网络服务后,往往这个服务进程是一直运行的。但是对于大部分进程来说,如果退出终端,这个终端上创建的所有进程都会退出,这就导致进程的生命周期…

丹摩征文活动|丹摩平台一日游

目录 一.引言 二.平台简介 三.体验过程 1.注册与登录 (1).注册 (2).登录 2.界面介绍 (1).主界面 (2).任务监控界面 3.功能体验 (1).数据存储与管理 (2).数据预处理 (3).模型训练 (4).模型评估与优化 4.例子 (1).创建一个实例 (2).选择类型 1.实例配置 2.选择…

计算机网络中的数据包传输机制详解

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 计算机网络中的数据包传输机制详解 计算机网络中的数据包传输机制详解 计算机网络中的数据包传输机制详解 引言 数据包的基本概念…

普通用户切换到 root 用户不需要输入密码配置(Ubuntu20)

在 Ubuntu 系统中,允许一个普通用户切换到 root 用户而不需要输入密码,可以通过以下步骤配置 sudo 设置来实现。 步骤: 打开 sudoers 文件进行编辑: 在终端中,输入以下命令来编辑 sudoers 文件: sudo visu…

入侵检测算法平台部署LiteAIServer视频智能分析平台行人入侵检测算法:科技守护安全的新篇章

在现代化城市快速发展的背景下,安全防范已成为城市管理与社会生活中不可或缺的一环。随着人工智能、大数据、物联网等技术的飞速发展,智能化安防系统正逐步改变着传统的安全防护模式,特别是在行人入侵检测领域,视频智能分析平台Li…

20.UE5UI预构造,开始菜单,事件分发器

2-22 开始菜单、事件分发器、UI预构造_哔哩哔哩_bilibili 目录 1.UI预构造 2.开始菜单和开始关卡 2.1开始菜单 2.2开始关卡 2.3将开始菜单展示到开始关卡 3.事件分发器 1.UI预构造 如果我们直接再画布上设计我们的按钮,我们需要为每一个按钮进行编辑&#x…