当前位置: 首页 > news >正文

花几千上万学习Java,真没必要!(三十七)

IO 流:

读取数据到内存的过程:可以包括从硬盘、网络或其他存储设备中将数据加载到内存中,以便程序能够访问和处理这些数据。
写入数据到硬盘的过程:通常是将内存中的数据保存到硬盘或其他持久性存储设备中,以便长期存储或备份数据。

IO :输入/输出(Input/Output)
流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输,IO 流就是用来处理设备间数据传输问题的。常见的应用:文件复制;文件上传;文件下载。


第一、IO 流的分类
按照数据的流向
输入流:读数据
输出流:写数据


第二、按照数据类型来分类
字节流
字节输入流
字节输出流

字符流
字符输入流
字符输出流


IO 流的使用场景
如果操作的是纯文本文件,优先使用字符流
如果操作的是图片、视频、音频等二进制文件。优先使用字节流。
如果不确定文件类型,优先使用字节流。字节流是万能的流。

测试代码1:

import java.io.FileOutputStream;  
import java.io.IOException;  
//字节流抽象基类
//InputStream :这个抽象类是表示字节输入流的所有类的超类
//OutputStream :这个抽象类是表示字节输出流的所有类的超类
//子类名特点:子类名称都是以其父类名作为子类名的后缀
//字节输出流
//FileOutputStream(String name) :创建文件输出流以指定的名称写入文件
//使用字节输出流写数据的步骤
//创建字节输出流对象 (调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)
//调用字节输出流对象的写数据方法
//释放资源 (关闭此文件输出流并释放与此流相关联的任何系统资源)  
public class FileOutputStreamExample {  public static void main(String[] args) {  // 指定要写入的文件名  String fileName = "example.txt";  // 使用try-with-resources语句自动管理资源  try (FileOutputStream fos = new FileOutputStream(fileName)) {  // 要写入的文本  String text = "Hello, World! This is a test file.";  // 将文本转换为字节数组  byte[] bytes = text.getBytes();  // 写入字节数组到文件  fos.write(bytes);  // 不需要显式调用fos.close(),try-with-resources会自动处理  System.out.println("Data written to " + fileName + " successfully.");  } catch (IOException e) {  // 如果发生I/O错误,则捕获异常并打印堆栈跟踪  e.printStackTrace();  }  // try-with-resources块之后,fos已经被自动关闭。  }  
}

测试代码2:

package iotest.com;
import java.io.FileOutputStream;  
import java.io.IOException;  public class FileOutputStreamTest {  public static void main(String[] args) {  String fileName = "example.txt";  // 写入单个字节  try (FileOutputStream fosSingleByte = new FileOutputStream(fileName)) {  fosSingleByte.write(65); // ASCII码65对应字母'A'  } catch (IOException e) {  e.printStackTrace();  }  // 写入字节数组  byte[] byteArray = "Hello, World!".getBytes();  try (FileOutputStream fosByteArray = new FileOutputStream(fileName, true)) { // 追加模式  fosByteArray.write(byteArray);  } catch (IOException e) {  e.printStackTrace();  }  // 写入字节数组的一部分  byte[] partOfByteArray = " New Line!".getBytes();  try (FileOutputStream fosPartOfArray = new FileOutputStream(fileName, true)) { // 继续追加  // 写入换行符  fosPartOfArray.write("\n".getBytes());  // 写入字节数组的一部分  fosPartOfArray.write(partOfByteArray, 0, partOfByteArray.length);  } catch (IOException e) {  e.printStackTrace();  }  }  
}

测试代码3:Copy文本

package iotest.com;
import java.io.File;
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  
//复制文本文件,把文本文件的内容从一个文件中读取出来 (数据源),然后写入到另一个文件中
//数据源:
//E:\\Test\\a.txt 读数据:InputStream -->FileInputStream
//目的地:
//D:\\AA\\a.txt 写数据: OutputStream -->FileOutputStream 
public class FileCopyExample {  public static void main(String[] args) {  String sourceFile = "E:\\Test\\a.txt";  String destFile = "D:\\AA\\a.txt";  // 检查目标目录是否存在,如果不存在则创建它  File destDir = new File("D:\\AA");  if (!destDir.exists()) {  destDir.mkdirs(); // 创建目录结构  }  FileInputStream fis = null;  FileOutputStream fos = null;  try {  // 创建FileInputStream对象  fis = new FileInputStream(sourceFile);  // 创建FileOutputStream对象  fos = new FileOutputStream(destFile);  // 读取和写入数据  byte[] buffer = new byte[1024]; // 创建一个缓冲区  int length;  while ((length = fis.read(buffer)) > 0) { // 读取到文件末尾  fos.write(buffer, 0, length); // 写入读取到的数据  }  // 刷新输出流,确保所有数据都被写入文件  fos.flush();  } catch (IOException e) {  e.printStackTrace();  } finally {  // 关闭流  try {  if (fis != null) fis.close();  if (fos != null) fos.close();  } catch (IOException e) {  e.printStackTrace();  }  }  }  
}  

测试代码4:Copy图片

package iotest.com;
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  public class CopyImage {  public static void main(String[] args) {  String sourceFile = "E:\\Test\\a.jpg";  String destFile = "D:\\AA\\a.jpg";  // 检查目标目录是否存在,如果不存在则创建它  java.io.File destDir = new java.io.File("D:\\AA");  if (!destDir.exists()) {  destDir.mkdirs(); // 创建目录结构  }  FileInputStream fis = null;  FileOutputStream fos = null;  //读取次数并不直接对应于读取的字节总数。//例如,如果文件大小不是1024的整数倍,那么最后一次读取可能会读取少于1024个字节的数据,但读取次数仍然会增加1。int readCount = 0; // 读取次数计数器 try {  // 创建FileInputStream对象  fis = new FileInputStream(sourceFile);  // 创建FileOutputStream对象  fos = new FileOutputStream(destFile);  // 读写数据  byte[] buffer = new byte[1024]; // 创建一个1024字节的缓冲区  int bytesRead;  while ((bytesRead = fis.read(buffer)) != -1) { // 读取到文件末尾时返回-1  fos.write(buffer, 0, bytesRead); // 写入读取到的数据,注意只写入实际读取到的字节数  readCount++; // 每次读取后增加计数器  }  // 刷新输出流,FileOutputStream这一步是可选的,close()会调用flush() 。 // fos.flush();  System.out.println("Total read operations: " + readCount); // 打印读取次数  } catch (IOException e) {  e.printStackTrace();  } finally {  // 关闭流  try {  if (fis != null) fis.close();  if (fos != null) fos.close();  } catch (IOException e) {  e.printStackTrace();  }  }  }  
}

测试代码5:字节缓冲流

package iotest.com;
import java.io.BufferedInputStream;  
import java.io.BufferedOutputStream;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  public class BufferedStreamDemo {  public static void main(String[] args) {  // 指定文件路径  String filePath = "E:\\Test\\a.txt";  // 使用try-with-resources语句自动关闭资源  try (  // 创建BufferedOutputStream,用于向文件写入数据  BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));  ) {  byte[] data = "Hello, Buffered Streams!".getBytes();  // 写入数据到文件  bos.write(data);  System.out.println("Data written to file successfully.");  } catch (IOException e) {  e.printStackTrace();  }  // 再次使用try-with-resources语句读取文件内容  try (  // 创建BufferedInputStream,用于从文件读取数据  BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));  ) {  // 用于存储从文件中读取的数据  byte[] buffer = new byte[1024];  // 用于记录实际读取的字节数  int bytesRead;  // 读取文件内容  while ((bytesRead = bis.read(buffer)) != -1) {  // 打印读取到的数据  System.out.write(buffer, 0, bytesRead);  }  } catch (IOException e) {  e.printStackTrace();  }  }  
}

测试代码6:用字节缓冲流Copy视频。

package iotest.com;
import java.io.BufferedInputStream;  
import java.io.BufferedOutputStream;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  public class TestCopyVideo {  public static void main(String[] args) {  String sourceFile = "E:\\Test\\a.avi";  String destinationFile = "D:\\AA\\a.avi";  // 确保目标目录存在  File destinationDir = new File(new File(destinationFile).getParent());  if (!destinationDir.exists()) {  destinationDir.mkdirs(); // 创建目录,包括所有必需的但不存在的父目录  }  // 使用try-with-resources自动关闭流  try (  BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourceFile));  BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destinationFile))  ) {  byte[] buffer = new byte[1024]; // 创建一个字节数组作为缓冲区  int bytesRead;  // 从源文件读取数据到缓冲区,然后写入到目标文件  while ((bytesRead = bis.read(buffer)) != -1) {  bos.write(buffer, 0, bytesRead);  }  System.out.println("文件复制成功!");  } catch (IOException e) {  e.printStackTrace();  System.out.println("文件复制失败!");  }  }  
}

 

相关文章:

花几千上万学习Java,真没必要!(三十七)

IO 流: 读取数据到内存的过程:可以包括从硬盘、网络或其他存储设备中将数据加载到内存中,以便程序能够访问和处理这些数据。 写入数据到硬盘的过程:通常是将内存中的数据保存到硬盘或其他持久性存储设备中,以便长期存…...

SSA-GRU(自适应平滑自回归门控循环单元)预测模型及其Python和MATLAB实现

SSA-GRU(自适应平滑自回归门控循环单元)预测模型是结合了SSA(Singular Spectrum Analysis,奇异谱分析)和GRU(Gated Recurrent Unit,门控循环单元)模型的一种时间序列预测方法。以下是…...

【ROS】让你的回调函数并行起来

【前言】 众所周知,ROS中的所有回调函数,都由 ros::spin() 这个家伙来统一管理和唤醒。这里说的是所有通过ROS方式创建出来的回调函数,比如ros::Subscriber、ros::Timer等等的回调函数。 【举例】 我们先来看一个示例节点: #i…...

M12电连接器的编码分类及应用领域分析

12电连接器的编码主要包括A、B、C、D、X、S、T、K、L等类型,每种编码都有其特定的应用场景和功能: A编码:适用于传感器、直流电、1G以太网。 B编码:主要用于PROFIBUS总线系统。 C编码:适用于交流电。 D编码&#x…...

基于YOLOv8的道路裂缝坑洼检测系统

基于YOLOv8的道路裂缝坑洼检测系统 (价格88) 包含 【“裂缝”,“凹坑”】 2个类 通过PYQT构建UI界面,包含图片检测,视频检测,摄像头实时检测。 (该系统可以根据数据训练出的yolov8的权重文件,运用在其他检测系…...

蓝鹏测径仪非标定制订制流程

测径仪通常属于非标定制设备,非标定制意味着这些设备不是按照标准规格批量生产的,而是根据特定的客户需求和应用场景设计和制造的。例如,某些测径仪可能需要特殊的测量范围、精度、传感器或软件来满足特定的工业检测要求。 测径仪非标定制的…...

vue基础3

1.推荐好用的第三方框架 BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务 1.moment.js 2.dayjs 2.收集表达数据 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Document</title><…...

LINUX -exec函数族

1、功能&#xff1a; *让父子进程来执行不相干的操作 *能够替换进程地址空间的代码.text段 *执行另外的程序&#xff0c;不需要创建额外的的地址空间 *当前程序中调用另外一个应用程序 2、执行目录下的程序&#xff1a; *指定执行目录下的程序 int execl(const char *path,…...

c++ 智能指针shared_ptr与make_shared

shared_ptr是C11引入的一种智能指针&#xff0c;‌它允许多个shared_ptr实例共享同一个对象&#xff0c;‌通过引用计数来管理对象的生命周期。‌当最后一个持有对象的shared_ptr被销毁时&#xff0c;‌它会自动删除所指向的对象。‌这种智能指针主要用于解决资源管理问题&…...

2024-HW最新漏洞整理及相应解决方案(二)

目录 前言&#xff1a; 漏洞 1.用友NC系统电采complainjudge接口的sql注入漏洞 2.用友U8 CRM产品存在SQL注入漏洞 3.WordPress LMS 插件任意文件上传漏洞 4.Oracle Fusion Middleware 安全漏洞CVE-2024-21181 5.WordPress plugin LearnPress 安全漏洞CVE-2024-6589 6.W…...

spring boot整合JPA兼容MySQL8和达梦数据库8

前言 Spring Boot是一个基于Spring框架的快速开发框架&#xff0c;它可以简化Spring应用的配置和部署过程。JPA&#xff08;Java Persistence API&#xff09;是Java持久化规范的一种实现&#xff0c;它提供了一种统一的方式来访问和管理数据库。MySQL和达梦数据库都是常用的关…...

规划决策算法(四)---Frenet坐标系

知乎&#xff1a;坐标系转换 1.Frenet 坐标系 什么是 Frenet 坐标系&#xff1a; 为什么使用 Frenet 坐标系&#xff1a; 通常情况&#xff0c;我们只会关注车辆当前距离左右车道线的距离&#xff0c;来判断是否偏离车道&#xff0c;是否需要打方向盘进行方向微调。而不是基于…...

大数据处理:大数据处理框架Hadoop、Spark

大数据处理是当代信息技术领域的一个重要分支&#xff0c;它涉及到海量数据的存储、管理和分析。为了高效地应对大数据处理的挑战&#xff0c;多种框架被开发出来&#xff0c;其中Hadoop和Spark是最为知名和广泛应用的两种。以下将详细介绍这两种框架以及它们在大数据处理中的应…...

网传的高频流量费会影响到个人用户的算法和策略T0吗?

先解答这个问题&#xff1a;高频的流量费这个确实是会影响你自己算法的交易的&#xff01;但是&#xff0c;强调一个但是&#xff1a;有的券商是没有流量费的&#xff01;小编今天就来带大家了解一下&#xff01;第一&#xff1a;算法交易的应用场景&#xff01; 算法交易的主…...

阿里云服务器 Ubuntu18.04 安装 mysql8.0并允许外部连接

参考教程&#xff1a; 官网教程 参考教程一 首先彻底删除mysql5.7 dpkg --list|grep mysql #查看 sudo apt-get remove mysql-common #卸载 sudo apt-get autoremove --purge mysql-server-5.7 #版本自己修改 dpkg -l|grep ^rc|awk {print$2}|sudo xargs dpkg -P #清除残留数…...

(Arxiv-2023)MobileDiffusion:移动设备上即时文本到图像生成

MobileDiffusion&#xff1a;移动设备上即时文本到图像生成 Paper Title&#xff1a;MobileDiffusion: Instant Text-to-Image Generation on Mobile Devices Paper是谷歌出品 Paper地址 图 1&#xff1a;MobileDiffusion 用于 (a) 文本到图像的生成。(b) Canny 边缘到图像、风…...

【七】Hadoop3.3.4基于ubuntu24的分布式集群安装

文章目录 1. 下载和准备工作1.1 安装包下载1.2 前提条件 2. 安装过程STEP 1: 解压并配置Hadoop选择环境变量添加位置的原则检查环境变量是否生效 STEP 2: 配置Hadoop2.1. 修改core-site.xml2.2. 修改hdfs-site.xml2.3. 修改mapred-site.xml2.4. 修改yarn-site.xml2.5. 修改hado…...

【Rust光年纪】深入了解Rust语言的关键库:功能特点与使用场景分析

探索Rust语言下的重要库&#xff1a;硬件接口控制和数据库操作全解析 前言 随着Rust语言在嵌入式开发和数据库操作领域的不断发展&#xff0c;越来越多的优秀库和工具涌现出来。本文将介绍一些用于Rust语言的重要库&#xff0c;包括硬件接口库、嵌入式硬件抽象层、ORM和查询构…...

矩估计与最大似然估计的通俗理解

点估计与区间估计 矩估计与最大似然估计都属于点估计&#xff0c;也就是估计出来的结果是一个具体的值。对比区间估计&#xff0c;通过样本得出的估计值是一个范围区间。例如估计馒头店每天卖出的馒头个数&#xff0c;点估计就是最终直接估计每天卖出10个&#xff0c;而区间估…...

性能调优本质:如何精准定位瓶颈并实现系统极致优化

目录 先入为主的反例 性能调优的本质 性能调优实操案例 性能调优相关文章 先入为主的反例 在典型的 ETL 场景中,我们经常需要对数据进行各式各样的转换,有的时候,因为业务需求太复杂,我们往往还需要自定义 UDF(User Defined Functions)来实现特定的转换逻辑。 但是…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...