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,一经查实,立即删除!

相关文章

早起能给我带来了什么

现在我早已养成习惯&#xff0c;每天不用闹钟也能自然醒来。有时5点起&#xff0c;有时4点半起&#xff0c;最早4点起&#xff0c;通常不晚于5点半。 相比在7点左右起床&#xff0c;我每天多出了2小时&#xff0c;按一天8小时工作时长计算&#xff0c;每年可以多出约90个工作日…

Spring懒加载Bean机制

一、概述 默认情况下Spring容器启动时就会创建被它管理的Bean&#xff0c;但是有的时候被Spring管理的Bean并不需要再容器启动的时候被创建&#xff0c;而是当对象第一次被访问的时候进行创建&#xff0c;这种场景就可以使用懒加载实现。 也就是说&#xff1a;容器启动的时候…

现场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 的设…

【SQLite3】常用API

SQLite3常用API 数据库的打开和关闭 数据库的打开&#xff08;sqlite3_open函数&#xff09; sqlite3_open() 函数用于打开一个 SQLite 数据库文件的函数&#xff0c;函数原型如下&#xff1a; int sqlite3_open(const char *filename, /* 数据库文件的文件名&#xff0c…

.net6+ 在单文件应用程序中获取程序集位置

一般来说,获取执行程序集的位置&#xff0c;您可以调用: var executableDirectory System.Reflection.Assembly.GetExecutingAssembly().Location;如果发布为单个文件, 会提示如下警告 warning IL3000: System.Reflection.Assembly.Location always returns an empty string…

解析Java中1000个常用类:EnumMap类,你学会了吗?

在线工具站 推荐一个程序员在线工具站&#xff1a;程序员常用工具&#xff08;http://cxytools.com&#xff09;&#xff0c;有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具&#xff0c;效率加倍嘎嘎好用。 程序员资料站 推荐一个程序员编程资料站&#xff1a;…

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 #生成一个身份校…

计算机网络 5.4中继器 5.5集线器

第四节 中继器 一、认识中继器 1.作用&#xff1a;对信号整形、放大&#xff0c;使之传播更远的距离。 2.特点&#xff1a; ①由中继器连接起来的两端必须采用相同介质访问控制协议。 ②理论上中继器的使用是无限的&#xff0c;但实际只能在规定的范围内有效工作&#xff0…

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;向大家展示了服务机器人的美…

一文全解Nginx

一文全解Nginx 一文全解 Nginx 1. 技术介绍 Nginx&#xff08;发音为"engine-x"&#xff09;是一个高性能的开源 Web 服务器软件&#xff0c;同时也可以用作反向代理、负载均衡器和 HTTP 缓存。它最初由俄罗斯的 Igor Sysoev 开发&#xff0c;并于 2004 年首次公开…

在Qt中使用C++编程与传统C++编程的区别

引言 C作为一种强大的编程语言&#xff0c;被广泛应用于系统编程、游戏开发、嵌入式系统等领域。而Qt作为一个跨平台的应用开发框架&#xff0c;通过其丰富的功能库和高效的开发工具&#xff0c;使得C开发变得更加高效和便捷。本文将深入探讨在Qt中使用C编程与传统C编程的区别…

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…