java IO流(1)

一. 文件类

java中提供了一个File类来表示一个文件或目录(文件夹),并提供了一些方法可以操作该文件

1. 文件类的常用方法 

File(String pathname)构造方法,里面传一个路径名,用来表示一个文件
boolean canRead()判断文件是否是可读文件
boolean canWrite()判断文件是否是可写文件
boolean exists()判断文件或目录是否存在
String getAbsolutePath()获取文件的绝对路径
String getName()获取文件名
String getParent()获取文件的上级目录
boolean isDirectory()判断是不是文件夹
boolean isFile()判断是不是文件
Long lastModified()返回文件最后一次的修改时间,由于返回值是Long类型,配合Date的构造方法,可观察时间
Long length()返回文件有多少个字节
boolean isHidden()判断文件是不是隐藏文件
boolean delete()删除文件或文件夹,注意删除文件夹时必须保证文件夹是空的,否则删除失败
boolean mkdir()创建单级文件夹
boolean mkdirs()创建多级文件夹

2. 删除整个文件夹

public class FileDemo2 {public static void main(String[] args) throws IOException {//递归删除文件夹中的文件和文件夹File f = new File("E:/download");DeleteFile(f);}public static void DeleteFile(File files) {File[] file = files.listFiles();for (File f : file) {if (f.isDirectory()) {DeleteFile(f);} else {f.delete();//删除文件}}files.delete();
}

当文件夹不为空时调用delete方法删除是不成功的,要想删除文件夹,必须保证文件夹为空,即要先删除我文件夹中的文件和文件夹,这就要使用递归来删除 

二. 输入输出概念

输入输出是一个相对概念,要有一定的参照物才能说清楚到底是输入还是输出,比如:我们将文件中的内容读到java程序中,对于java程序来讲是输入,但对于硬盘上的文件来讲则是输出,所以我们一般规定,把硬盘上的文件读到java程序中是输入,从java程序中写回硬盘上是输出

三. 流的分类

1.输入流和输出流

按照数据传输的方向,流可以分为输入流输出流

输入流:往程序中读叫输入流

输出流:从程序中往外写叫输出流

2. 字节流和字符流

从读取文件的单位不同分为字节流字符流

字节流:是以一个个字节为单位读取文件,可以读取任意的文件,这是因为,在计算机中任何类型的数据都是以字节存储的

字符流:是以一个个字符为单位读取文件,只能读文本文件

注意:在java中有InputStream和OutputStream,Reader和Writer四个抽象类,只要是以InputStream和OutPutStream结尾的都是字节流,以Reader和Writer结尾的都是字符流

3. 节点流和处理流

根据封装类型不同流分为节点流处理流

节点流:就是直接对数据进行读写操作的流,FileInputStream,FileOutputStream,FileReader等

处理流(包装流):对节点流进行封装,可以提高节点流对数据操作的效率,BufferReader等带Buffer的流

四. 读写文件

1. 用文件输入字节流和文件输出字节流读写文件

1.1 一个一个字节读文件

public class StreamDemo1 {public static void main(String[] args) throws IOException {//输入,从硬盘上把文件读入到程序/*File file = new File("D:/demo.txt");FileInputStream inputStream1 = new FileInputStream(file);*///文件输入字节流FileInputStream inputStream = new FileInputStream("E:/demo.txt");//输入管道//文件输出字节流FileOutputStream outputStream = new FileOutputStream("D:/demo.txt");//输出管道int b = 0;while((b = inputStream.read())!=-1){outputStream.write(b);}inputStream.close();//关闭通道outputStream.close();}
}

由于上述方法每次是一个一个字节去读文件,效率非常低,所以java还提供每次读一个byte数组个字节大小,数组的长度可以自己定,但不建议太大内存装不下,也不建议太小效率低

2.1 一次读一个byte数组(高效文件读写)

public class StrteamDemo2 {public static void main(String[] args) throws IOException {FileInputStream inputStream = new FileInputStream("E:/demo.txt");FileOutputStream outputStream = new FileOutputStream("D:/demo.txt");byte[] bytes = new byte[10];int size = 0;while((size = inputStream.read(bytes))!=-1){outputStream.write(bytes,0,size);}inputStream.close();outputStream.close();}
}

注意:当写文件时调用的是write(byte b[], int off, int len),而不是write(byte b[]),调用第二个有可能会导致最后一次数组中还留有上次的元素,导致读完后的文件和原文件不同

2. 用包装流封装节点流读取文件

public class StreamDemo3 {public static void main(String[] args) throws IOException {//FileInputStream 直接封装数据,称为节点流(最基础去读数据的流)FileInputStream inputStream = new FileInputStream("E:/demo.txt");//BufferedInputSteam封装的是一个节点流对象,可以提供缓冲功能,称为处理流/包装流//缓冲字节输入流 默认缓冲区大小是8192个字节,可以自定义缓冲区大小BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);FileOutputStream outputStream = new FileOutputStream("D:/demo.txt");BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);byte[] bytes = new byte[10];int size = 0;while((size = bufferedInputStream.read(bytes))!=-1){bufferedOutputStream.write(bytes,0,size);}//包装流一定要关闭,否则有可能导致数据停留在底层缓冲区//没有真正刷新缓冲区写入到文件中bufferedInputStream.close();bufferedOutputStream.close();}
}

2.1 BufferedInputStream和BufferedOutputStream读写文件底层

在包装流的底层也提供了一个缓冲数组默认长度是8192个字节,当我们去读文件时,如果一次读的字节个数比底层的缓冲数组少,那么他不会直接将读到的内容写入到文件中,而是先放到缓冲数组中,等到底层缓冲数组满时,才会写入到文件中,这样可以大大提高效率,这也是包装流的作用,但如果我们自己定义的byte数组比底层缓冲数组大,那么不会用到底层的缓冲数组,而是直接将读到的内容写入到文件中,下面是源码

注意:

1. 包装流使用完毕后一定要关闭,否则有可能导致数据停留在底层缓冲区,没有真正刷新缓冲区写入到文件中,因为真正写入文件中是flushBuffer()方法中的write,而close()方法中调用了这个方法,如果仅仅只是上述源码,当我们最后一次读取数据时,如果缓冲数组没装满是不会调用flushBuffer(0方法,所以为了确保一定调用了flushBuffer(0方法,使用完必须调用close()方法来关闭包装流

2.底层缓冲数组可以自定义大小,在构造方法的第二个参数中

五. 对文件进行分割与合并

/*写一个方法,将feige.exe文件分割为每份1MB大小的若干份(最后一份可以不满1MB),存储在一个temp的文件夹中(每份文件名自己定义,例如1.temp 2.temp), 然后再写一个方法,将temp文件夹中的若干份合并为一个文件fg.exe
*/
public class HomeWork4 {public static void main(String[] args) throws IOException {File file1 = new File("E:/feige.exe");File file2 = new File("E:/temp");SplitFile(file1);MergeFile(file2);}public static void SplitFile(File file) throws IOException {File file1 = new File("E:/temp");if(!file1.exists()){file1.mkdir();}FileInputStream inputStream = new FileInputStream(file);int length = (int)Math.ceil(file.length()/(1024*1024*1.0));int size = 0;byte[] bytes = new byte[1024];for (int i = 0; i < length; i++) {FileOutputStream outputStream = new FileOutputStream("E:/temp/"+(i+1)+".temp");for (int j = 0; j <1024; j++) {if((size = inputStream.read(bytes))!=-1){outputStream.write(bytes,0,size);}}outputStream.close();}inputStream.close();}public static void MergeFile(File file) throws IOException {File file1 = new File("E:/Merge");if(!file1.exists()){file1.mkdir();}File[] files = file.listFiles();int size = 0;byte[] bytes = new byte[1024];FileOutputStream outputStream = new FileOutputStream("E:/Merge/fg.exe");for(File file2 : files){FileInputStream inputStream = new FileInputStream(file2);while((size = inputStream.read(bytes))!=-1){outputStream.write(bytes,0,size);}inputStream.close();}outputStream.close();}
}

六. 数据输入输出字节流

数据输入输出字节流即:DataInputStream和DataOutputStream,他们除了是字节流,同时也是包装流(处理流),用于对节点流进行便捷处理的流

DataInputStreamreadUTF()直接将读到的数据转为字符串形式,不用自己将字节数组转换成字符串
DataOutputStreamwriteUFT(String s)直接将数据以字符串形式写出,不用自己将字节数组转换成字符串

 

 

 

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

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

相关文章

现场Live震撼!OmAgent框架强势开源!行业应用已全面开花

第一个提出自动驾驶并进行研发的公司是Google&#xff0c;巧的是&#xff0c;它发布的Transformer模型也为今天的大模型发展奠定了基础。 自动驾驶已经完成从概念到现实的华丽转变&#xff0c;彻底重塑了传统驾车方式&#xff0c;而大模型行业正在经历的&#xff0c;恰如自动驾…

基于S32K144驱动NSD8381

文章目录 1.前言2.芯片介绍2.1 芯片简介2.2 硬件特性2.3 软件特性 3.测试环境3.1 工具3.2 架构 4.软件驱动4.1 SPI4.2 CTRL引脚4.3 寄存器4.4 双极性步进电机驱动流程 5.测试情况6.参考资料 1.前言 最近有些做电磁阀和调光大灯的客户需要寻找国产的双极性步进电机驱动&#xf…

Android 15 应用适配默认全屏的行为变更(Android V的新特性)

简介 Android V 上默认会使用全面屏兼容方式&#xff0c;影响应用显示&#xff0c;导致应用内跟导航标题重合&#xff0c;无法点击上移的内容。 默认情况下&#xff0c;如果应用以 Android 15&#xff08;API 级别 35&#xff09;为目标平台&#xff0c;在搭载 Android 15 的设…

python破解字母已知但大小写未知密码

python穷举已知字符串中某个或多个字符为大写的所有情况 可以使用递归函数来实现这个功能。以下是一个示例代码&#xff1a; def generate_uppercase_combinations(s, index0, current):if index len(s):print(current)returngenerate_uppercase_combinations(s, index 1, …

图神经网络dgl和torch-geometric安装

文章目录 搭建环境dgl的安装torch-geometric安装 在跑论文代码过程中&#xff0c;许多小伙伴们可能会遇到一些和我一样的问题&#xff0c;就是文章所需要的一些库的版本比较老&#xff0c;而新版的环境跑代码会报错&#xff0c;这就需要我们手动的下载whl格式的文件来安装相应的…

数字信号处理及MATLAB仿真(3)——量化的其他概念

上回书说到AD转换的两个步骤——量化与采样两个步骤。现在更加深入的去了解以下对应的概念。学无止境&#xff0c;要不断地努力才有好的收获。万丈高楼平地起&#xff0c;唯有打好基础&#xff0c;才能踏实前行。 不说了&#xff0c;今天咱们继续说说这两个步骤&#xff0c;首先…

cloudflare tunnels tcp

这里是官网的说明Cloudflare Tunnel Cloudflare Zero Trust docs 根据实际情况安装环境 tunnels除了http,https协议是直接暴露公网&#xff0c;tcp是类似ssh端口转发。 在需要内网穿透的局域网找一条机子部署代理 我这边是window cloudflared tunnel login #生成一个身份校…

windows上传app store的构建版本简单方法

我们在上传app store上架&#xff0c;或上传到testflight进行ios的app测试的时候&#xff0c;需要mac下的上传工具上传ipa文件到app store的构建版本上。 然而windows电脑这些工具是无法安装的。 因此&#xff0c;假如在windows上开发hbuilderx或uniapp的应用&#xff0c;可以…

Mobile ALOHA: 你需不需要一个能做家务的具身智能机器人

相信做机器人的朋友最近一段时间一定被斯坦福华人团队这个Mobile ALOHA的工作深深所震撼&#xff0c;这个工作研究了一个能做饭&#xff0c;收拾衣服&#xff0c;打扫卫生的服务机器人&#xff0c;完成了传统机器人所不能完成的诸多任务&#xff0c;向大家展示了服务机器人的美…

el-date-picker 设置默认值为当前日期

this.listQuery.Date new Date().toISOString().substr(0, 10); <el-date-picker v-model"listQuery.Date" format"yyyy-MM-dd" value-format"yyyy-MM-dd" type"date" placeholder"选择日期" change"getList()&qu…

【MySQL】4.MySQL 的数据类型

MySQL 的数据类型 一.数据类型分类在这里插入图片描述二.注意点1.char VS varchar2.datetime VS timestamp3.enum 和 set 的使用方法 一.数据类型分类 二.注意点 1.char VS varchar char 的意义是直接开辟固定大小的空间&#xff0c;浪费磁盘空间&#xff0c;但是效率高varcha…

WEB05Web开发HTMLCSS

Web前端开发 什么是 Web &#xff1f; Web&#xff1a;全球广域网&#xff0c;也称为万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站。 Web 网站的工作流程 W3C 万维网联盟&#xff08; World Wide Web Consortium &#xff09;&#xff0c;创建于1994年1…

OpenEarthMap:全球高分辨率土地覆盖制图的基准数据集(开源来下载!!!)

OpenEarthMap由220万段5000张航拍和卫星图像组成&#xff0c;覆盖6大洲44个国家97个地区&#xff0c;在0.25-0.5m的地面采样距离上人工标注8类土地覆盖标签。我们提供8类标注:裸地、牧场、已开发空间、道路、树木、水、农业用地和建筑。类选择与现有的具有亚米GSD的产品和基准数…

电源纹波相关

什么是纹波&#xff1f;什么是噪声&#xff1f; 这种叠加在直流稳定量上的交流分量就称为纹波。 纹波的危害 电源纹波能影响设备性能和稳定性 纹波会导致电器上产生谐波&#xff0c;降低电源的使用效率&#xff1b; 高频电源纹波可能会产生浪涌电压或电流&#xff0c;影响设…

android deep links即scheme uri跳转以及googlePlay跳转配置

对于googlePlay的Custom URL就是googlePlay上APP网址&#xff1a; https://play.google.com/store/apps/details?idcom.yourapp如果是国内一些应用&#xff0c;则考虑market://包名等方式&#xff0c;自行百度。 对于Android URI Scheme&#xff1a; 首先需要在Manifest xm…

浅尝Apache Mesos

文章目录 1. Mesos是什么2. 共享集群3. Apache Mesos3.1 Mesos主节点3.2 Mesos代理3.3 Mesos框架 4. 资源管理4.1 资源提供4.2 资源角色4.3 资源预留4.4 资源权重与配额 5. 实现框架5.1 框架主类5.3 实现执行器 6. 小结参考 1. Mesos是什么 Mesos是什么&#xff0c;Mesos是一个…

【国产AI绘图】快手把“可图”大模型开源了,这是一款支持中文的SDXL模型

Kolors 是由 Kuaishou Kolors 团队&#xff08;快手可图&#xff09;开发的基于潜在扩散的大规模文本到图像生成模型。经过数十亿对文本图像的训练&#xff0c;Kolors 在视觉质量、复杂语义的准确性以及中英文字符的文本渲染方面&#xff0c;与开源和专有模型相比都具有显著优势…

Hi6276 无Y应用电源方案IC

Hi6276 combines a dedicated current mode PWM controller with integrated high voltage power MOSFET.Vcc low startup current and low operating current contribute to a reliable power on startup design with Hi6276. the IC operates in Extended ‘burst mode’ to …

【初中数学选讲】绝对值的几何意义例题(20240503-01)

初中数学选讲&#xff1a;绝对值的几何意义例题&#xff08;20240503-01&#xff09; 1. 练习题目1.1 题目描述1.2 分析 2 答题2.1 定义2.2 分段讨论2.2.1 情况1&#xff1a; x x x点在 a a a点左侧&#xff08; x < a , m ∣ x − a ∣ x<a,\ \ m\left|x-a\right| x<…

六、数据可视化—首页、列表页制作(爬虫及数据可视化)

六、数据可视化—首页、列表页制作&#xff08;爬虫及数据可视化&#xff09; 1&#xff0c;首页制作&#xff08;1&#xff09;创建新项目选择flask框架&#xff08;2&#xff09;下载模板&#xff08;3&#xff09;导入flask框架中进行改写&#xff08;4&#xff09;访问服务…