Java进阶-File、递归、IO流

目录

前言

File类概述

File类创建对象

绝对路径和相对路径

File类常用API

判断文件类型、获取文件信息

创建文件、删除文件功能

遍历文件夹

方法递归

递归的形式和特点

递归的算法流程、核心要素

常见案例

经典问题-猴子吃桃问题

非规律化递归案例-文件搜索

非规律化递归案例-啤酒问题

字符集

常见字符集介绍

字符集的编码、解码操作

IO流概述

字节流的使用

文件字节输入流(每次读取一个字节)

文件字节输入流(每次读取一个字节数组)

​编辑

文件字节输入流(一次读完全部字节)

文件字节输出流(写字节数据到文件)

文件拷贝

资源释放的方式

try-catch-finally

try-catch-resource

字符流的使用

文件字符输入流(一次读取一个字符)

文件字符输入流(一次读取一个字符数组)

文件字符输出流


前言

学习路线

File类概述

File类创建对象

代码演示

注意:文件路径有常见的3种不同的写法

绝对路径和相对路径

文件路径也分为绝对路径和相对路径

  • 绝对路径:从盘符开始
  • 相对路径:不带盘符,默认直接到当前工程下的目录寻找文件

File类常用API

判断文件类型、获取文件信息

代码参考

public static void main(String[] args) {//1.绝对路径创建一个文件对象File f1 = new File("C:\\Users\\pcy\\Desktop\\pic_router.png");//a.获取他的绝对路径System.out.println(f1.getAbsolutePath());//b.获取文件定义的时候使用的路径System.out.println(f1.getPath());//c.获取文件的名称,带后缀System.out.println(f1.getName());//d.获取文件的大小:字节个数System.out.println(f1.length());//e.获取文件的最后修改时间long time = f1.lastModified();//时间毫秒值//解析时间毫秒值System.out.println("最后修改时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time));//f.判断是文件还是文件夹System.out.println(f1.isFile());//是否是文件System.out.println(f1.isDirectory());//是否是文件夹File f2 = new File("src\\data.txt");//a.获取他的绝对路径System.out.println(f2.getAbsolutePath());//b.获取文件定义的时候使用的路径System.out.println(f2.getPath());//c.获取文件的名称,带后缀System.out.println(f2.getName());//d.获取文件的大小:字节个数System.out.println(f2.length());//e.获取文件的最后修改时间long time2 = f2.lastModified();//时间毫秒值//解析时间毫秒值System.out.println("最后修改时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time2));//f.判断是文件还是文件夹System.out.println(f1.isFile());//是否是文件System.out.println(f1.isDirectory());//是否是文件夹System.out.println("----------------------");File f3 = new File("E:/");System.out.println(f3.exists());System.out.println(f3.isFile());System.out.println(f3.isDirectory());}

创建文件、删除文件功能

代码参考

    public static void main(String[] args) throws IOException {File f = new File("src\\data.txt");System.out.println(f.createNewFile());//已经有了,返回false//a.创建新文件,创建成功返回true,反之不需要这个,以后文件写出去的时候都会自动创建File f1 = new File("src\\data2.txt");//创建成功返回trueSystem.out.println(f1.createNewFile());//b.mkdir创建一级目录File f2 =  new File("src\\aaa");//在src下创建aaa目录System.out.println(f2.mkdir());//创建成功//c.mkdirs创建多级目录File f3 = new File("src\\aaa\\bbb\\ccc");//在src下创建aaa\bbb\ccc三级目录System.out.println(f3.mkdirs());//创建成功//d.删除文件或空文件夹System.out.println(f1.delete());//删除成功,被占用一样可以删除//只能删除空文件夹不能删除非空的File f4 = new File("src\\aaa\\bbb");System.out.println(f4.delete());//删除失败,因为aaa里面有bbb不是空文件夹}

遍历文件夹

方法递归

递归的形式和特点

死循环会导致递归方法无限调用自己,无法终止,最后出现栈内存溢出

直接递归

间接递归

递归的算法流程、核心要素

用案例去理解

常见案例

  • 计算1-n的和

经典问题-猴子吃桃问题

非规律化递归案例-文件搜索

非规律化递归案例-啤酒问题

代码参考

public class RecursionDemo06 {//定义一个静态的成员变量用于存储可以买的酒数量public static int totalNumber;//总数量public static int lastBottleNumber;//记录每次剩余的瓶子个数public static int lastCoverNumber;//记录每次剩余的盖子个数public static void main(String[] args) {//1.拿钱买酒buy(10);}public static void buy(int money){//2.看可以立马卖多少瓶int buyNumber = money/2;//5totalNumber += buyNumber;//3.把盖子和瓶子换算成钱//统计本轮总的盖子数和瓶子数int coverNumber = lastCoverNumber + buyNumber;int bottleNumber = lastBottleNumber + buyNumber;//4.统计可以换算的总金额int allMoney = 0;if(coverNumber >= 4){allMoney += (coverNumber / 4)*2;}lastCoverNumber =coverNumber % 4;if(lastBottleNumber >= 4){allMoney += (bottleNumber / 2)*2;}lastBottleNumber =bottleNumber % 2;if(allMoney >= 2){buy(allMoney);}}
}

字符集

常见字符集介绍

字符集的编码、解码操作

代码参考

public class Test {public static void main(String[] args) throws UnsupportedEncodingException {//1.编码:把文字转换成字节(使用指定的编码)String name = "abc";byte[] bytes = name.getBytes("GBK");//指定编码System.out.println(bytes.length);System.out.println(Arrays.toString(bytes));//2.解码String rs= new String(bytes);System.out.println(rs);}
}

IO流概述

字节流的使用

文件字节输入流(每次读取一个字节)

改进

文件字节输入流(每次读取一个字节数组)

注:当第三次读取的时候,因为前两次读完只剩下cd了,读完cd之后第三个位置还是原来第二次读取的c,没被覆盖掉,所以输出就是cdc

解决方案:

改进

出现问题:读取中文会出现乱码

我占了三个字节,一次读取3个字节时,先读abc,再读ab,但是发现不够了,读取我的时候就会出现乱码

文件字节输入流(一次读完全部字节)

 针对上述乱码问题的解决方案:一次读完全部字节

代码参考

文件字节输出流(写字节数据到文件)

代码参考

public static void main(String[] args) throws Exception {//1.创建一个文件字节输出流管道与目标文件接通
//        OutputStream os = new FileOutputStream(
//                "E:\\仓库\\advanced-java-learning\\file-io-app\\src\\out04.txt");//先清空之前的数据,写新的数据进去//如果要追加数据OutputStream os = new FileOutputStream("E:\\仓库\\advanced-java-learning\\file-io-app\\src\\out04.txt",true);//2.写数据出去//a.public void write(int a):写一个字节出去os.write('a');os.write(98);
//        os.write('徐');//写一个字节时不能写中文的,会乱码噢ab�aabcos.write("\r\n".getBytes());//换行//b.public void write(byte[] buffer):写一个字节数组出去byte[] buffer = {'a',97,98,99};os.write(buffer);byte[] buffer2 = "我是中国人".getBytes();os.write(buffer2);os.write("\r\n".getBytes());//换行//c.public void write(byte[] buffer int pos,int len):写一个字节数组的一部分出去byte[] buffer3 = {'a',97,98,99};os.write(buffer,0,3);//从0开始写三个os.write("\r\n".getBytes());//换行//写数据,必须刷新数据
//        os.flush();//刷新之后可以继续使用流os.close();//用完之后必须关闭,释放资源,不然会占用内存,关闭已经包含刷新,关闭之后不可以使用了}

文件拷贝

资源释放的方式

try-catch-finally

代码参考

public static void main(String[] args) {InputStream is = null;OutputStream os = null;try {//            System.out.println(10/0);//1.定义一个字节输入流管道与源文件接通is = new FileInputStream("D:\\Huawei Share\\Huawei Share\\手机截屏录屏\\SVID_20220304_220736_1.mp4");//2.创建字节输出流管道与目标文件接通os = new FileOutputStream("D:\\new.mp4");//3.定义一个字节数组转移数据byte[] buffer =new byte[1024];int len;//记录每次读取的字节数while((len=is.read(buffer))!= -1){os.write(buffer,0,len);}System.out.println("复制完成了!");} catch (Exception e) {e.printStackTrace();} finally {//无论代码是否正常结束,都要最后执行这里System.out.println("--------finally--------");//4.关闭流try {if(os!=null) os.close();//一定要判断是否非空,因为有可能在还没有创建流的时候就出问题抛异常了} catch (IOException e) {e.printStackTrace();}try {if(is!=null) is.close();} catch (IOException e) {e.printStackTrace();}}}

try-catch-resource

//法一
public class TryCatchResourceDemo02 {public static void main(String[] args) {try (//这里面只能放资源对象,用完会自动调用资源对象的close方法关闭资源(即使出现异常)//1.定义一个字节输入流管道与源文件接通InputStream is = new FileInputStream("D:\\Huawei Share\\Huawei Share\\手机截屏录屏\\SVID_20220304_220736_1.mp4");//2.创建字节输出流管道与目标文件接通OutputStream os = new FileOutputStream("D:\\new.mp4");
//                int age = 23;//不是资源,报错){//3.定义一个字节数组转移数据byte[] buffer =new byte[1024];int len;//记录每次读取的字节数while((len=is.read(buffer))!= -1){os.write(buffer,0,len);}System.out.println("复制完成了!");} catch (Exception e) {e.printStackTrace();}}
}//法二
public class TryCatchResourceDemo03 {public static void main(String[] args) throws Exception {//这里面只能放资源对象,用完会自动调用资源对象的close方法关闭资源(即使出现异常)//1.定义一个字节输入流管道与源文件接通InputStream is = new FileInputStream("D:\\Huawei Share\\Huawei Share\\手机截屏录屏\\SVID_20220304_220736_1.mp4");//2.创建字节输出流管道与目标文件接通OutputStream os = new FileOutputStream("D:\\new.mp4");try (is;os){//3.定义一个字节数组转移数据byte[] buffer =new byte[1024];int len;//记录每次读取的字节数while((len=is.read(buffer))!= -1){os.write(buffer,0,len);}System.out.println("复制完成了!");} catch (Exception e) {e.printStackTrace();}}
}

字符流的使用

文件字符输入流(一次读取一个字符)

文件字符输入流(一次读取一个字符数组)

文件字符输出流

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络原理】UDP协议 | UDP报文格式 | 校验和 | UDP的特点 | 应用层的自定义格式

文章目录 一、UDP协议1.UDP的传输流程发送方接收方 2.UDP协议报文格式:长度受限校验和如何校验:CRC算法:循环冗余算法md5算法: 2.UDP的特点 二、开发中常见的自定义格式1.xml(古老)2.json(最流行…

java案例-读取xml文件

需求 导入依赖 <dependencies><!-- dom4j --><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency> </dependencies>代码 SAXReader saxReade…

Ansible自动化

Ansible自动化 自动化的需求&#xff1a; 1. 在什么样的场景下需要自动化&#xff1f; 批量化的工作&#xff1a; 装软件包、配置服务、升级、下发文件… 2. 为什么在自动化工具中选择ansible&#xff1f; 对比shell脚本&#xff1a; 相对于用shell的脚本来实现自动化&#x…

跨平台桌面客户端开发框架

跨平台桌面客户端开发框架允许开发者创建能够在多个操作系统上运行的桌面应用程序。以下是一些流行的跨平台桌面客户端开发框架。这些框架各有优势&#xff0c;选择哪个框架取决于项目需求、团队的技术栈以及对特定特性的偏好。 1.Electron &#xff1a; 使用JavaScript, HTML…

uniapp视频播放器(h5+app)

关于uniapp视频播放器遇到的一些问题&#xff0c;mark下。 中途遇到了很多问题&#xff0c;如果有相同的伙伴遇到了类似的&#xff0c;欢迎交流 官方的video播放器在app上不友好&#xff0c;有以下功能不支持。 loadedmetadata、controlstoggle不支持导致只能手写控制层。 不…

python学习之词云图片生成

代码实现 import jieba import wordcloudf open("D:/Pythonstudy/data/平凡的世界.txt", "r", encoding"utf-8") t f.read() print(t) f.close() ls jieba.lcut(t) txt " ".join(ls)w wordcloud.WordCloud(font_path"D:/cc…

【webrtc】MessageHandler 8: 基于线程的消息处理:处理音频输入输出断开

m98代码,看起来m114 去掉了MessageHandler :音频的录制和播放 都使用了on message,但只是用来通知并处理流的断开的。AAudioRecorder AAudioRecorder 处理流断开 OnErrorCallback :有可能 错误回调是别处来的,是其他线程, 但是这个错误的处理要再自己的线程执行: 音频播…

Docker:centos7安装docker

官网&#xff1a;https://www.docker.com/官网 文档地址 - 确认centos7及其以上的版本 查看当前系统版本 cat /etc/redhat-release- 卸载旧版本 依照官网执行 - yum安装gcc相关 yum -y install gccyum -y install gcc-c- 安装需要的软件包 yum install -y yum-utils- 设置s…

Flask简介

Flask简介 安装概述使用PyCharm创建一个Flask程序 Flask程序的基本结构初始化路由和视图函数启动服务器请求-响应循环 安装 概述 Flask算是小型框架&#xff0c;小到可以称为“微框架”。Flask 非常小&#xff0c;因此你一旦能够熟练使用它&#xff0c;很可能就能读懂它所有的…

小米笔记本文件夹里是空白怎么办?分享原因及解决方案

随着科技的不断发展&#xff0c;笔记本电脑已成为我们日常生活和工作中不可或缺的一部分。而小米&#xff0c;作为知名的科技品牌&#xff0c;其笔记本产品凭借其出色的性能和合理的价格&#xff0c;受到了广大用户的喜爱。然而&#xff0c;在使用过程中&#xff0c;有时我们可…

Android AOSP探索之Ubantu下Toolbox的安装

文章目录 概述安装Toolbox解决运行的问题 概述 由于最近需要进军android的framework,所以需要工具的支持&#xff0c;之前听说江湖上都流传source insight,我去弄了一个破解版&#xff0c;功能确实强大&#xff0c;但是作为多年android开发的我习惯使用android studio。虽然使…

Delta lake with Java--利用spark sql操作数据2

上一篇文章尝试了建库&#xff0c;建表&#xff0c;插入数据&#xff0c;还差删除和更新&#xff0c;所以在这篇文章补充一下&#xff0c;代码很简单&#xff0c;具体如下&#xff1a; import org.apache.spark.sql.SaveMode; import org.apache.spark.sql.SparkSession;publi…

网盘——分享文件——界面设计

本文主要讲解网盘中文件操作的分享文件部分&#xff0c;主要包含两方面的设计&#xff1a;分享文件界面设计和逻辑设计。 1、界面设计 1.1、添加一个类 1.2、引入头文件 #include <QPushButton> #include <QHBoxLayout> #include <QVBoxLayout> #include …

C++ 矩阵

目录 了解矩阵的数学原理&#xff08;大学线性代数&#xff09; 矩阵及转置矩阵 矩阵乘法 矩阵快速幂 相伴矩阵模板 [相伴矩阵,快速矩阵幂]CSES1722 Fibonacci Numbers 了解矩阵的数学原理&#xff08;大学线性代数&#xff09; 矩阵及转置矩阵 这里A就是一个矩阵&…

C++中的异常

目录 1.C语言传统的处理错误的方式 2. C异常概念 3. 异常的使用 3.1 异常的抛出和捕获 3.2 异常的重新抛出 3.3异常安全 3.4 异常规范 4.自定义异常体系 5.C标准库的异常体系 6.异常的优缺点 7.func&#xff08;&#xff09; throw();的方式规范化 1.C语言传统的处理…

如何判断第三方软件测试公司是否具有资质

在软件开发的过程中&#xff0c;软件测试是确保软件质量、稳定性和用户体验的关键环节。许多企业选择将软件测试工作交给专业的第三方软件测试公司来完成&#xff0c;以确保测试的准确性和公正性。但是&#xff0c;如何判断一个第三方软件测试公司是否具有资质呢&#xff1f;以…

idea中使用GlassFish服务器启动项目

idea中使用GlassFish服务器进行测试 1.项目背景 当前在研究openMDM项目, 不过该项目不是springboot项目, 并且是使用GlassFish进行war部署的, 但是需要在idea中进行项目的二次开发,故需要进行idea启动项目并且进行开发和调试 2.GlassFish是什么 GlassFish是一个web服务器, …

基于ssm+vue+Mysql的药源购物网站

开发语言&#xff1a;Java框架&#xff1a;ssmJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.…

使用Gitbook生成电子书

背景 《Google工程实践文档》相对原文Google’s Engineering Practices documentation &#xff0c;部分内容过时了。需要更新中文版&#xff0c;并使用Gitbook把Markdown文件转换成对应的PDF电子书。   上一次生成PDF电子书是5年前&#xff0c;当时生成电子书的环境早已不在…

东莞酷得 遥控小车电子方案技术关键要点

遥控玩具车的软件技术开发是一个综合性的过程&#xff0c;涉及到无线通信技术、硬件设计、软件编程、用户交互设计等多个方面。开发者需要具备跨学科的知识和技能&#xff0c;以确保最终产品的性能和用户体验。 遥控玩具车的软件技术开发涉及以下几个关键要点&#xff1a; 1、…