Java中操作文件(二)
目录
一、什么是数据流
二、InputStream概述
2.1、方法
2.2、说明
三、FileInputStream概述
3.1、构造方法
3.2、利用Scanner进行字符串读取,简化操作
四、OutputStream概述
4.1、方法
4.2、PrinterWriter简化写操作
五、小程序练习
示例1
示例2
一、什么是数据流
对照我们的现实生活,可以想象成流水。
流的输入(读)和流的输出(写),针对于内存来说的,从设备包括硬盘,网卡的数据进入内存叫输入(Input),从内存把数据写到硬盘,网卡叫输出(Output) 。
Java中针对input和Output提供了两个抽象类
- InputStream输入流,从文件中把数据读取到内存。
- OutputStream输出流,把数据从内存输出到文件。
二、InputStream概述
2.1、方法
修饰符以及返回值类型 | 方法签名 | 说明 |
int | read() | 读取一个字节的数据,返回-1代表已经完全读完了. |
int | read(byte[] b) | 最多读取b.length自己的数据到b中,返回实际读到的数量;-1代表已经读完了. |
int | read(byte[] b,int off,int len) | 最多读取len-off字节的数据到b中,放在off开始,返回实际读到的数量;-1代表已经读完了. |
void | close() | 关闭字节流 |
2.2、说明
InputStream只是一个抽象类,要使用还是需要具体的实现类。关于InputStream的实现类有很多,基本可以认为不同的输入设备都可以对应一个InputStream类,本篇博客只讲从文件中读取,所以使用FileInputStream。
三、FileInputStream概述
3.1、构造方法
签名 | 说明 |
FileInputStream(File file) | 利用File对象构造文件输入流 |
FileInputStream(String name) | 利用文件路径构造文件输入流 |
示例1
import java.io.FileInputStream;
import java.io.IOException;/*** 创建一个输入流读取文件内容*/
public class Exe_01 {public static void main(String[] args) throws IOException {FileInputStream inputStream=new FileInputStream("C:/Temp/Hello.txt");//创建一个byte数组,来接收每次读取的内容,扩大缓冲区的容量byte[] bytes=new byte[1024];//循环读取while(true){//获取每次读取的长度int len=inputStream.read(bytes);//如果等于-1,就说明读完了if(len==-1){break;}//打印读取的内容for (int i = 0; i < len; i++) {System.out.print(bytes[i]+",");}}//关闭数据流inputStream.close();}
}
3.2、利用Scanner进行字符串读取,简化操作
上述例子中,我们看到了对字符类型直接使用 InputStream 进行读取是非常麻烦且困难的,所以,我们使用一种我们之前比较熟悉的类来完成该工作,就是 Scanner 类 。
示例2
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;public class Exe_05 {public static void main(String[] args) throws IOException {//创建一个流FileInputStream inputStream=new FileInputStream("C:/Temp/基尼太美.txt");//使用Scanner简化操作Scanner sc=new Scanner(inputStream,"UTF-8");//循环读取while(true){//判断if(!sc.hasNextLine()){break;}String str=sc.nextLine();System.out.println(str);}sc.close();inputStream.close();}
}
四、OutputStream概述
4.1、方法
修饰符及返回值类型 | 方法签名 | 说明 |
void | write(int b) | 写入要给字节的数据 |
void | write(byte[] b) | 将b这个字符数组中的数据全部写道os中 |
int | write(byte[] b,int off,int len) | 将b这个字符数组从off开始的数据写到os中,一共写len个 |
void | close() | 关闭字节流 |
void | flush() | 重要:I/O的速度是很慢的,所以,大多的OutputStream为了减少设备操作的次数,在写数据的时候都会将数据先暂时的写入到内存的一个指定区域里面,知道该区域满了或者其它指定条件时才真正的将数据写入到设备中,这个区域就叫缓冲区。但这样会造成一个结果,就是我们写的数据很有可能一部分留在缓冲区中。所以需要在最后或者合适的位置,调用flush(刷新)操作,将数据刷到设备中。 |
说明
OutputStream同样只是一个抽象类,要使用还需要具体的实现类。跟上述一样本篇博客只讲从文件中读取,所以使用FileOutputStream。
示例3
import java.io.FileOutputStream;
import java.io.IOException;public class Exe_02 {public static void main(String[] args) throws IOException {//创建一个输出流FileOutputStream outputStream=new FileOutputStream("C:/Temp/基尼太美.txt");//在文件中写入一些内容outputStream.write(189);outputStream.write(188);outputStream.write(187);outputStream.write(186);//刷新一下缓冲区outputStream.flush();//关闭流outputStream.close();}
}
运行结果
import java.io.FileInputStream;
import java.io.IOException;public class Exe_03 {public static void main(String[] args) throws IOException {FileInputStream inputStream=new FileInputStream("C:/Temp/基尼太美.txt");while(true){int data=inputStream.read();if(data==-1){//返回-1,读取结束break;}System.out.println(data);}//关闭流inputStream.close();}
}
示例4
import java.io.FileWriter;
import java.io.IOException;/*** 基于字符的输出流*/
public class Exe_04 {public static void main(String[] args) throws IOException {FileWriter fileWriter=new FileWriter("C:/Temp/基尼太美.txt");fileWriter.write("Cause I got a crush on you who you");//换行符需要手动添加fileWriter.write("\n");fileWriter.write("你是我的我是你的谁");fileWriter.write("\n");fileWriter.write("再多一眼看一眼就会爆炸");fileWriter.write("\n");fileWriter.write("再近一点靠近点快被融化");//清空缓冲区fileWriter.flush();//关闭流fileWriter.close();}
}
4.2、PrinterWriter简化写操作
示例5
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;/***PrinterWriter简化写操作*/
public class Exe_06 {public static void main(String[] args) throws IOException {//创建一个输出流FileOutputStream outputStream=new FileOutputStream("C:/Temp/基尼太美.txt");//根据输出流,创建一个PrinterWriterPrintWriter printWriter=new PrintWriter(outputStream);//写数据,自带换行符printWriter.println("Cause I got a crush on you who you");printWriter.println("再近一点靠近点快被融化");printWriter.println("再多一眼看一眼就会爆炸");printWriter.println("你是我的我是你的谁");//关闭流printWriter.close();outputStream.close();}
}
五、小程序练习
示例1
扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件 。
import java.io.File;
import java.io.IOException;
import java.util.Scanner;public class Exe_07 {public static void main(String[] args) throws IOException {//让用户输入一个路径System.out.println("请输入一个文件路径");Scanner sc=new Scanner(System.in);//获取路径字符串String rootPath=sc.nextLine();//根据字符串创建一个File对象File rootFile=new File(rootPath);//判断路径是否有效if(!rootFile.exists()){System.out.println("对不起,您输入的路径是无效路径!!!");return;}//判断是不是一个有效目录if(!rootFile.isDirectory()){System.out.println("对不起,你输入的路径不是一个有效目录");return;}//让用户输入一个要找的关键字System.out.println("请输入你要删除的关键字");String keyWords=sc.nextLine();//判断输入是否为空if(keyWords==null){System.out.println("关键字不能为空");return;}//扫描文件scan(rootFile,keyWords);}private static void scan(File rootFile, String keyWords) throws IOException {//先获取root目录下的所有子文件以及目录File[] files=rootFile.listFiles();//判断数据是否为空if(files==null||files.length==0){//不做任何操作return;}//遍历数组检查操作for (File item:files) {//检查file对象是否是文件还是目录if(item.isFile()){//检查文件名是否包含关键字String fileName=item.getName();if(fileName.contains(keyWords)){//找到了,询问用户是否需要删除文件System.out.println("找到了"+item.getCanonicalFile()+",包含关键字"+keyWords+",是否删除文件(Y/N)?");//接收用户请求Scanner scanner=new Scanner(System.in);String result=scanner.nextLine();//处理操作if(result.toLowerCase().equals("y")){//删除文件item.delete();System.out.println("删除文件"+item.getCanonicalFile()+"成功!!!");}else{return;}}}else{//如果目标文件是一个目录,递归区扫描目录文件scan(rootFile,keyWords);}}}
}
示例2
普通文件的复制
import java.io.*;
import java.util.Scanner;public class Exe_08 {public static void main(String[] args) {//让用户输入一个路径System.out.println("请输入源文件路径");Scanner sc=new Scanner(System.in);//获取路径字符串String sourcePath=sc.nextLine();//根据字符串创建一个File对象File sourceFile=new File(sourcePath);//判断文件是否有效if(!sourceFile.exists()){System.out.println("源文件无效,请重新输入!!");return;}//获取目标输入的目标文件路径System.out.println("请输入要复制到的目标文件路径");String targetPath=sc.nextLine();// 根据目标路径创建File对象File targetFile=new File(targetPath);// 判断目标路径是否有效if (targetFile.exists()) {System.out.println("目标文件已存在,请重新输入.");return;}// 判断目标文件的父目录必须存在if(!targetFile.getParentFile().exists()){System.out.println("目标文件的目录不正确");return;}//创建输入输出流try {InputStream inputStream=new FileInputStream(sourceFile);OutputStream outputStream=new FileOutputStream(targetFile);//读取源文件内容byte[] bytes=new byte[1024];while(true){//获取读取的长度和内容int len = inputStream.read(bytes);if(len==-1){break;}//把读取的文件写入目标文件中,从0~lenoutputStream.write(bytes, 0, len);}//刷新缓冲区outputStream.flush();//打印日志System.out.println("复制成功"+sourceFile.getCanonicalFile()+"--->"+targetFile.getCanonicalFile());//关闭流inputStream.close();outputStream.close();} catch (IOException e) {throw new RuntimeException(e);}}
}
相关文章:

Java中操作文件(二)
目录 一、什么是数据流 二、InputStream概述 2.1、方法 2.2、说明 三、FileInputStream概述 3.1、构造方法 3.2、利用Scanner进行字符串读取,简化操作 四、OutputStream概述 4.1、方法 4.2、PrinterWriter简化写操作 五、小程序练习 示例1 示例…...

springboot+vue在线考试系统(java项目源码+文档)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的在线考试系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风歌&a…...

样式方案:在 Vite 中接入现代化的 CSS 工程化方案
上一小节,我们使用 Vite 初始化了一个 Web 项目,迈出了使用 Vite 的第一步。但在实际工作中,仅用 Vite 官方的脚手架项目是不够的,往往还需要考虑诸多的工程化因素,借助 Vite 本身的配置以及业界的各种生态,…...

C#获取根目录实现方法汇总
以下是C#获取不同类型项目根目录的实现方法汇总,以及在 .NET Core 中获取项目根目录的方法: 控制台应用程序 string rootPath Environment.CurrentDirectory; string rootPath AppDomain.CurrentDomain.BaseDirectory; string rootPath Path.GetFul…...

vue获取当前坐标并通过天地图逆转码为省市区
因为需求需要获取用户当前的地理位置用于分析 通过原生的navigator.geolocation.getCurrentPosition获取经纬度 这个方法在谷歌浏览器会失效(原因未知),目前ie浏览器是可以获取的 getCurrentPosition() {if (navigator.geolocation) {var o…...

【MySQL】事务及其隔离性/隔离级别
目录 一、事务的概念 1、事务的四种特性 2、事务的作用 3、存储引擎对事务的支持 4、事务的提交方式 二、事务的启动、回滚与提交 1、准备工作:调整MySQL的默认隔离级别为最低/创建测试表 2、事务的启动、回滚与提交 3、启动事务后未commit,但是…...

计算机由于找不到d3dx9_35.dll,无法启动软件游戏的三个修复方法
在打开游戏的时候,计算机提示由于找不到d3dx9_35.dll,无法正常启动运行。这个是为什么呢?d3dx9_35.dll是DirectX 9.0里面的一个动态连结库文件,它包含了Direct3D、DirectPlay几个组件的二进制文件,为软件提供了多媒体图…...

第三章 模型篇:模型与模型的搭建
写在前面的话 这部分只解释代码,不对线性层(全连接层),卷积层等layer的原理进行解释。 尽量写的比较全了,但是自身水平有限,不太确定是否有遗漏重要的部分。 教程参考: https://pytorch.org/tutorials/ https://githu…...

深度学习一些简单概念的整理笔记
大概看了一点动手学深度学习,简单整理一些概念。 一些问题 测试结果 Precision-Recall曲线定性分析模型精度average precision(AP) 平均精度 Precision :检索出来的条目中有多大比例是我们需要的。 一些概念 损失函数(loss function&…...

Vue3中引入Element-plus
安装 npm install element-plus --save完整引入 打包后体积很大,适合学习,不适合生产。 此方法对于 vite 和 cli 脚手架创建的vue3均适用 // main.ts import { createApp } from vue //引入element-plus import ElementPlus from element-plus //引入…...

如何查看 Facebook 公共主页的广告数量上限?
作为Facebook的资深人员,了解如何查看公共主页的广告数量上限对于有效管理和优化广告策略至关重要。本文将详细介绍如何轻松查看Facebook公共主页的广告数量上限,以帮助您更好地掌握广告投放策略。 一、什么是Facebook公共主页的广告数量上限?…...

U-Boot移植 (2)- LCD 驱动修改和网络驱动修改
文章目录 1. LCD 驱动修改1.1 修改c文件配置1.2 修改h文件配置1.3 编译测试 2. 网络驱动修改2.1 I.MX6U-ALPHA 开发板网络简介2.2 网络 PHY 地址修改2.3 删除 uboot 中 74LV595 的驱动代码2.4 添加开发板网络复位引脚驱动2.5 更新 PHY 的连接状态和速度2.6 烧写调试2.7 测试一下…...

Ubuntu 23.10 现在由Linux内核6.3提供支持
对于那些希望在Ubuntu上尝试最新的Linux 6.3内核系列的人来说,今天有一个好消息,因为即将发布的Ubuntu 23.10(Mantic Minotaur)已经重新基于Linux内核6.3。 Ubuntu 23.10的开发工作于4月底开始,基于目前的临时版本Ubu…...

Python 学习之NumPy(一)
文章目录 1.为什么要学习NumPy2.NumPy的数组变换以及索引访问3.NumPy筛选使用介绍筛选出上面nb数组中能被3整除的所有数筛选出数组中小于9的所有数提取出数组中所有的奇数数组中所有的奇数替换为-1二维数组交换2列生成数值5—10,shape 为(3,5)的二维随机浮点数 NumP…...

Nftables栈溢出漏洞(CVE-2022-1015)复现
背景介绍 Nftables Nftables 是一个基于内核的包过滤框架,用于 Linux 操作系统中的网络安全和防火墙功能。nftables 的设计目标是提供一种更简单、更灵活和更高效的方式来管理网络数据包的流量。 钩子点(Hook Point) 钩子点的作用是拦截数…...

【C++】 Qt-事件(上)(事件、重写事件、事件分发)
文章目录 事件重写事件事件分发 事件 事件(event)是由系统或Qt本身在不同的时刻发出的。比如,当用户按下鼠标,敲下键盘,或窗口需要重新绘制的时候,都会发出一个相应的事件。一些事件是在对用户操作做出响应…...

k8s部署springboot
前言 首先以SpringBoot应用为例介绍一下k8s的部署步骤。 1.从代码仓库下载代码,比如GitLab; 2.接着是进行打包,比如使用Maven; 3.编写Dockerfile文件,把步骤2产生的包制作成镜像; 4.上传步骤3的镜像到远程…...

备战秋招002(20230704)
文章目录 前言一、今天学习了什么?二、关于问题的答案1.线程池2.synchronized关键字3、volatile 总结 前言 提示:这里为每天自己的学习内容心情总结; Learn By Doing,Now or Never,Writing is organized thinking. …...

游泳买耳机买什么的比较好,列举几款实战性好的游泳耳机
对于运动用户来说,在运动时都会选择听一些节奏感比较强的音乐,让自己运动是更有活力。现在已经是三伏天中的前伏期间,不少人会选择在三伏天的日子里进行减肥瘦身,耳游泳已经成为很多人都首选运动,游泳是非常好的有氧运…...

【无线传感器】使用 MATLAB和 XBee连续监控温度传感器无线网络研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

Java基础-多线程JUC-生产者和消费者
1. 生产者与消费者 实现线程轮流交替执行的结果; 实现线程休眠和唤醒均要使用到锁对象; 修改标注位(foodFlag); 代码实现: public class demo11 {public static void main(String[] args) {/*** 需求&#…...

day2 QT按钮与容器
目录 按钮 1、QPushButton 2、QToolButton 3、QRadioButton 4、QCheckBox 示例 容器 编辑 1. QGroupBox(分组框) 2. QScrollArea(滚动区域) 3. QToolBox(工具箱) 4. QTabWidget(选…...

JPA 批量插入较大数据 解决性能慢问题
JPA 批量插入较大数据 解决性能慢问题 使用jpa saveAll接口的话需要了解原理: TransactionalOverridepublic <S extends T> List<S> saveAll(Iterable<S> entities) {Assert.notNull(entities, "Entities must not be null!");List<…...

为啥离不了 linux
Linux与Windows都是十分常见的电脑操作系统,相信你对它们二者都有所了解!在你的使用过程中,是否有什么事让你觉得在Linux上顺理成章,换到Windows上就令你费解?亦或者关于这二者你有任何想要分享的,都可以在…...

基于分形的置乱算法和基于混沌系统的置乱算法哪种更安全?
在信息安全领域中,置乱算法是一种重要的加密手段,它可以将明文进行混淆和打乱,从而实现保密性和安全性。常见的置乱算法包括基于分形的置乱算法和基于混沌系统的置乱算法。下面将从理论和实践两方面,对这两种置乱算法进行比较和分…...

pve使用cloud-image创建ubuntu模板
首先连接pve主机的终端 下载ubuntu22.04的cloud-image镜像 wget -P /opt https://mirrors.cloud.tencent.com/ubuntu-cloud-images/jammy/current/jammy-server-cloudimg-amd64.img创建虚拟机,id设为9000,使用VirtIO SCSI控制器 qm create 9000 -core…...

shiro入门
1、概述 Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。借助 Shiro 您可以快速轻松地保护任何应用程序一一从最小的移动应用程序到最大的 Web 和企业应用程序。 作用:Shiro可以帮我们完成 :认证、授权、加密、会话管理、与 Web 集成、…...

开源 sysgrok — 用于分析、理解和优化系统的人工智能助手
作者:Sean Heelan 在这篇文章中,我将介绍 sysgrok,这是一个研究原型,我们正在研究大型语言模型 (LLM)(例如 OpenAI 的 GPT 模型)如何应用于性能优化、根本原因分析和系统工程领域的问题。 你可以在 GitHub …...

Gitlab保护分支与合并请求
目录 引言 1、成员角色指定 1、保护分支设置 2、合并请求 引言 熟悉了Git工作流之后,有几个重要的分支,如Master(改名为Main)、Develop、Release分支等,是禁止开发成员随意合并和提交的,在此分支上的提交和推送权限仅限项目负责…...

ad18学习笔记九:输出文件
一般来说提供给板卡厂的文件里要包括以下这些文件 1、装配图 2、bom文件 3、gerber文件 4、转孔文件 5、坐标文件 6、ipc网表 AD_PCB:Gerber等各类文件的输出 - 哔哩哔哩 原点|钻孔_硬件设计AD 生成 Gerber 文件 1、装配图 如何输出装配图? 【…...