JAVA小知识29:IO流(上)

news2024/11/16 12:02:55

IO流是指在计算机中进行输入和输出操作的一种方式,用于读取和写入数据。IO流主要用于处理数据传输,可以将数据从一个地方传送到另一个地方,例如从内存到硬盘,从网络到内存等。IO流在编程中非常常见,特别是在文件操作和网络通信中。

一、IO流小知识

1.1、 IO流的分类

IO流主要分为以下几类:

  1. 按数据流方向分类

    • 输入流(Input Stream):从外部设备读取数据到内存,例如从文件读取数据。
    • 输出流(Output Stream):将数据从内存写入到外部设备,例如将数据写入文件。
    • 在这里插入图片描述
  2. 按数据类型分类

    • 字节流(Byte Stream):以字节为单位传输数据,常用于处理二进制数据。例如图片、视频等。常见的字节流类有:

      • 输入字节流:InputStream及其子类(如FileInputStreamBufferedInputStream等)
      • 输出字节流:OutputStream及其子类(如FileOutputStreamBufferedOutputStream等)
    • 字符流(Character Stream):以字符为单位传输数据,常用于处理文本数据。例如文本文件。常见的字符流类有:

      • 输入字符流:Reader及其子类(如FileReaderBufferedReader等)
      • 输出字符流:Writer及其子类(如FileWriterBufferedWriter等)
        在这里插入图片描述

1.2、常见的IO流类

  • FileInputStreamFileOutputStream:用于读取和写入文件的字节流。
  • FileReaderFileWriter:用于读取和写入文件的字符流。
  • BufferedInputStreamBufferedOutputStream:带有缓冲区的字节流,可以提高读写效率。
  • BufferedReaderBufferedWriter:带有缓冲区的字符流,可以提高读写效率。
  • InputStreamReaderOutputStreamWriter:将字节流转换为字符流,通常用于处理编码问题。
    在这里插入图片描述

二、字节流

在这里插入图片描述

2.1、字节输出流:FileOutputStream

操作本地文件的字节输出流,可以把程序中的数据写到本地文件中。他的操作方法分为三步:

  1. 创建字节流输出对象
  2. 写入数据
  3. 释放资源

字节输出流的细节:

  1. 创建字节输出流对象
    • 参数是字符串表示的路径或者是File对象都是可以的
    • 如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
    • 如果文件已经存在,则会清空文件
  2. 写数据
    • write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符
  3. 释放资源
    • 每次使用完流之后都要释放资源

其成员方法如下:

方法名称说明
public void write(int b)写入单个字节
public void write(byte[] b)写入字节数组
public void write(byte[] b, int off, int len)写入指定字节数组的一部分
public void close()关闭文件输出流
protected void finalize()确保文件输出流被关闭
public FileChannel getChannel()返回与此文件输出流相关的通道
public void flush()刷新此文件输出流的缓冲

演示代码如下:

public static void main(String[] args) throws IOException {
	// 创建对象就相当于创建一个通路 只有通路才能输入输出数据
    FileOutputStream fos = new FileOutputStream("C:\\Users\\password123456\\Desktop\\资料\\IO流\\a.txt");
    fos.write(97);
    fos.close();
}

在这里插入图片描述

public static void main(String[] args) throws IOException {
    byte[] buf = {'a', 'b', 'c', 'd', 'e', 'f'};
    FileOutputStream fos = new FileOutputStream("C:\\Users\\password123456\\Desktop\\资料\\IO流\\a.txt");
    fos.write(buf);
    // 数组名 起始索引 长度
    fos.write(buf,1,2);
    fos.close();
}

在这里插入图片描述

2.2、换行与续写

换行符:

  • window:“\r\n”
  • linux::"\n"
  • mac::"\r"
public static void main(String[] args) throws IOException {
    byte[] buf = {'a', 'b', 'c', 'd', 'e', 'f'};
    FileOutputStream fos = new FileOutputStream("C:\\Users\\password123456\\Desktop\\资料\\IO流\\a.txt");
    fos.write(buf);
    String wrap = "\r\n";
    fos.write(wrap.getBytes());
    // 数组名 起始索引 长度
    fos.write(buf,1,2);
    fos.close();
}

在这里插入图片描述

我们说了FileOutputStream创建对象,如果文件已经存在,则会清空文件。但是在我们创建FileOutputStream对象的时候,除了地址参数,其实还有一个续写参数:
在这里插入图片描述
只不过他的默认值是false,只要改为true,就进入到了续写模式。
在这里插入图片描述

2.3、字节输入流:FileInputStream

操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来
步骤:

  1. 创建字节流输入对象
  2. 读入数据
  3. 释放资源
    在这里插入图片描述

其成员方法如下:

方法名称说明
public int read()从输入流读取一个字节
public int read(byte[] b)从输入流读取一定数量的字节,并将其存储到缓冲区数组 b
public int read(byte[] b, int off, int len)从输入流中读取最多 len 个字节的数据,并将其存储到缓冲区数组 b 中,从偏移量 off 开始存储
public long skip(long n)跳过和丢弃输入流中最多 n 个字节的数据
public int available()返回可以从此输入流中读取的字节数
public void close()关闭此文件输入流并释放与该流关联的所有系统资源
protected void finalize()确保在垃圾回收时关闭文件输入流
public FileChannel getChannel()返回与此文件输入流相关的通道
public FileDescriptor getFD()返回文件描述符,表示与此文件输入流相关的连接

根据上面的读取细节,我们可以写一个循环读取:

public static void main(String[] args) throws IOException {
    FileInputStream ios = new FileInputStream("C:\\Users\\password123456\\Desktop\\资料\\IO流\\a.txt");
    int a;
    while ((a=ios.read())!=-1){
        System.out.println((char)a);
    }
    ios.close();
}

在这里插入图片描述
我们再来看一种错误的写法:

public static void main(String[] args) throws IOException {
    FileInputStream ios = new FileInputStream("C:\\Users\\password123456\\Desktop\\资料\\IO流\\a.txt");
    int a;
    while (ios.read()!=-1){
        a = ios.read();
        System.out.println((char)a);
    }
    ios.close();
}

在这里插入图片描述

这样的写法自然是错的,还记得我们之前学过的迭代器吗?每一个next都会移动指针,这里也是一样的,每一个read也会移动指针,第一次移动是判断,第二次移动是赋值,所以一次循环会移动两次指针。

三、文件拷贝

第一种方法:

public static void main(String[] args) throws IOException {
    FileInputStream ios = new FileInputStream("C:\\Users\\password123456\\Desktop\\资料\\IO流\\a.txt");
    FileOutputStream fos = new FileOutputStream("C:\\Users\\password123456\\Desktop\\资料\\IO流\\b.txt");
    int a;
    while ((a=ios.read())!=-1){
        fos.write(a);
    }
    ios.close();
    fos.close();
}

在这里插入图片描述
这种方法效率非常的慢,来看第二种方法:这种方法非常的好。

public static void main(String[] args) throws IOException {
    FileInputStream ios = new FileInputStream("C:\\Users\\password123456\\Desktop\\资料\\IO流\\a.txt");
    FileOutputStream fos = new FileOutputStream("C:\\Users\\password123456\\Desktop\\资料\\IO流\\b.txt");
    int len;
    byte[] buffer = new byte[1024 * 1024 * 5];
    while ((len = ios.read(buffer))!=-1){
        fos.write(buffer,0,len);
    }
    fos.close();
    ios.close();
}

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

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

相关文章

Git的安装配置及使用(超详细!!!)

一、git概述 它是一个版本管理工具. 版本: 软件开发过程当中的重要节点. 作用: 团队协作,管理代码. 对于软件的学习, 会用就行. 1.1 安装及配置 下载地址: github.com 安装注意事项: 傻瓜式安装,一直下一步就好. 安装目录不要有中文. 尽量也不要有空格. 配置环境变量: 找到…

1亿参数的细胞大模型来了!登Nature子刊,清华大学团队发布scFoundation:对2万基因同时建模

近年来,大规模预训练模型正在引领新一轮人工智能浪潮。「大模型」通过从大规模、多来源的数据中提取深层次规律,进而能够作为「基础模型」服务不同领域的多样化任务。例如,大语言模型通过学习大量文本数据,掌握了理解和识别语言的…

Python 列表去重方法解析与使用详解

概要 在 Python 编程中,列表是非常常用的数据结构之一。由于在实际使用中,我们经常会遇到包含重复元素的列表,因此对列表进行去重操作是一个常见的需求。本文将详细介绍多种 Python 列表去重的方法,并提供相应的示例代码,帮助更好地掌握这些技术。 使用集合(set) 集合…

充电桩现场安装施工流程

摘要:在化石能源日益紧缩的今天,新能源车辆逐渐走进了千家万户,与传统化石能源车辆相比,以电驱动的新能源车辆能源利用率高,缩短了能源传递过程,实现了能源有效利用。根据能量守恒定律可知,任何…

一文读懂RSTP流媒体传输原理

什么是流? 流(Streaming):近年在Internet上出现的新概念,定义非常广泛,主要是指通过网络传输多媒体数据的技术总称。 流式传输分为两种:顺序流式传输 (Progressive Streaming)和实时流式传输 (R…

2024挣大钱的机会来了!入职这一行,也能“一飞冲天”

不知不觉我们已经走过了疫情笼罩的三年。如今,已经全面放开,自12月起核酸检测也将彻底取消,对于我们每个人来说这也将是一场长期的战役。 然而在疫情的常态化下,国民经济也将逐渐恢复。对于我们普通人来说如何抓住机遇&#xff…

【渗透测试】小程序反编译

前言 在渗透测试时,除了常规的Web渗透,小程序也是我们需要重点关注的地方,微信小程序反编译后,可以借助微信小程序开发者工具进行调试,搜索敏感关键字,或许能够发现泄露的AccessKey等敏感信息及数据 工具…

模拟题解析:

攻击树方法可以被Red Team用来进行渗透测试,同时也可以被Blue Team用来研究防御机制。攻击树的优点:能够采取专家头脑风暴法,并且将这些意见融合到攻击树之中去;能够进行费效分析或者概率分析;能够建模非常复杂的攻击…

ICRA 2024: 使用Masked Visual-Tactile 对机器人操作预训练

先前的关于机器人操作的预训练工作表明,从大量人类操作数据中学习到的内容, 可以很好地泛化到新的操作任务以及操作环境当中。然而, 先前的方法主要集中在人类视觉或者自然语言方面, 忽视了触觉反馈。在本文中, 作者探索了如何使用人类的视觉和触觉数据来训练机器人操作的预训练…

【启明智显技术分享】MOEDL3芯片通用接口如CAN、I2S、I2C、SPI、UART、USB、emac的介绍和比较

启明智显MODEL3芯片提供的通用接口包括CAN、I2S、I2C、SPI、UART、USB和emac,每种接口都有其独特的功能和应用场景。 以下是这些接口的介绍和比较: CAN接口 功能: 支持CAN2.0A和CAN2.0B协议。支持11位标识符(标准格式&#xf…

RT-Thread Studio实现动态线程

1创建项目 我的板子为STM32F03ZET6 点击RT-Thread项目 2选择板子(根据自己的板子选择) 3找到主函数 4编写代码 4-1创建函数入口 // 线程入口函数 static void thread_entry(void *parameter) {rt_uint32_t count 0;while (1){// 线程执行的代码rt_k…

windows下以服务方式安装prometheus和grafana

grafana 找到confi下的defaults.ini&#xff0c;找到http_port修改端口号 # The HTTP port to use http_port 3000启动 grafana-server.exe访问localhost:8601即可 下载winsw https://github.com/winsw/winsw 新建grafanaservice.xml <service><id>grafana&…

(四十六)Vue Router组件所独有的两个钩子activate、deactivated

文章目录 activated钩子函数deactivated钩子函数demo 上一篇&#xff1a;&#xff08;四十五&#xff09;Vue Router之编程式路由导航 Vue Router提供了两个钩子函数&#xff0c;分别是activated和deactivated。 这两个钩子函数可以用于在路由组件的激活状态发生变化时执行相…

远程过程调用协议gRPC及在go环境下的使用

1. 远程过程调用协议 1.1 定义 远程过程调用(Remote Procedure Call&#xff0c;PRC是一种进程间通信技术&#xff0c;它使得程序可以像调用本地函数一样调用远程服务器上的函数。RPC 屏蔽了底层的通信细节&#xff0c;让开发者能够更专注于业务逻辑&#xff0c;而无需关心网络…

无限下拉菜单效果实现

无限下拉菜单效果实现 代码 <style>.nav_main{width: 600px;margin: 0 auto;}.nav ul{margin: 0;padding: 0;}.nav ul li{list-style: none;}.nav ul li a{text-decoration: none;color: #000;display: block;background: #ccc;margin: 10px 0px;padding: 10px;} i {bo…

react开发嵌入react-monaco-editor代码编辑器的方法

Next.js中使用react开发嵌入react-monaco-editor代码编辑器的方法&#xff08;支持语法高亮&#xff09; 安装 (base) PS D:\ai-ui> npm install react-monaco-editoradded 1 package, changed 1 package, and audited 1030 packages in 6s273 packages are looking for f…

qt for android 工程添加AndroidManifest.xml 文件

1.选择左边图形栏目中的Projects&#xff0c;在Build steps下的Build Android APK中Details 2.点击Create Templates&#xff0c;并勾选 此时在工程下面会多出一个文件夹android 3.将这个android的中所有文件加入工程中&#xff0c;编辑.pro 4.通过QT 图形化编辑设置属性&#…

深入理解计算机系统 CSAPP 家庭作业7.8

A:a main1 b main2 B:a 未知 b 未知 C:a 错误 b 错误

Qt客户案例 | 西门子医疗-满足最高要求的医疗软件和源代码检查的架构合规性

西门子医疗是全球领先的医疗技术公司之一&#xff0c;在70多个国家拥有约66&#xff0c;000位员工。除其他产品以外&#xff0c;他们还为诊断和治疗成像、实验室诊断和分子医学等领域提供产品。公司在全球各地的开发者设计、开发和维护这些产品的软件。为了让这个分布式团队持续…

基于 Spring Boot 的健康咨询系统

1 项目介绍 1.1 摘要 本项目旨在通过构建一个对用户更加友好的健康咨询平台&#xff0c;帮助用户方便、快捷地获取专业并且准确的健康咨询服务&#xff0c;同时为医疗机构提供一个高效易用的可以提供信息管理的服务平台。 项目采用了Spring Boot框架作为主要的开发平台。本系…