🙉专栏推荐:Java入门知识🙉
🙉 内容推荐:JUC常见类 🙉
🐹今日诗词:东风吹柳日初长,雨馀芳草斜阳🐹
⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏
⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏
目录
[read(byte [] bytes)方法有参版本](#read(byte [] bytes)方法有参版本)
[read(bytep[] bytes, int off, int len)](#read(bytep[] bytes, int off, int len))
什么是IO
这个不是靠感觉来的, 有人为的规定
什么是文件
文件夹是不是文件?是文件: 文件夹被称作目录文件, 也是文件的一种
文件的存储
文件存储背后的数据结构是一个多叉树
文件的路径
绝对路径
windows从此电脑出发, 此电脑到指定文件的路径称为绝对路径
相对路径
从某一文件出发, 某一文件到指定文件的路径被称为相对路径
文件检索
检索通过 ./ 和 ../ 两个基础操作检索
举例:
- 在bin目录下查找qq.exe文件
2. 在bin目录的上一级目录(QQ目录)查找qq.exe
3. 在其他目录下查找qq.exe
文本文件和二进制文件
文本文件: 存储文本数据, 这些数据是合法的字符
二进制文件: 存啥都行(本质上是01都构成的)
如何区分文本文件和二进制文件
方法: 使用记事本打开, 乱码的是二进制文件, 不乱码的就是文本文件
Java操作文件
Java标准库内置了File类, 可以用来对文件进行操作
我们来看看File的属性和参数
File类
patSeparator
pathSeparator: 分割符
File的构造方法
有三个构造方法
我们来看看第二个如何使用吧!
常见函数方法
文件创建
基准目录
基准目录: 通常是程序当前工作的目录
文件删除
还有一种删除方式deleteOnExit() 这种删除方式是程序运行完毕后才会删除文件
创建一级目录
通过mkdir()方法创建出一级目录
多级目录就是目录里面套目录
创建多级目录
通过mkdirs()方法创建多级目录
文件重命名
通过renameTo()方法进行文件重命名
读写文件,打开关闭文件
Java中读文件写文件打开关闭文件和"流"这样的类相关
流(stream)分成字节流和字符流
字节流: 以字节为单位读写数据
字符流: 以字符为单位读写数据
字节流读文件: InputStream
字节流写文件: OutputStream
字符流写文件: Writer
字符流读文件: Reader
字节流和字符从文件中读数据方法相同: read()
字节流和字符从文件中写数据方法相同: write()
字节流读数据
InputStream类: 这个类可以打开一个文件
类里的方法可以对文件进行读取数据的操作
正确使用方法: 虽然他是一个抽象类需要实现read()方法, 但是这样很麻烦,而且耦合性很大,因此标准库提供了它的子类, 已经帮我们实现好了, 这个子类就是FileInputStream
read()方法无参版本
read(byte [] bytes)方法有参版本
read(bytep[] bytes, int off, int len)
关闭文件
打开文件, 用完之后要关闭
关闭文件: close()
文件描述符表
文件描述符表: 记录文件的IO信息
每打开文件时就会消耗资源记录信息, 关闭问价就会释放资源
close()方法是一个非常重要的方法, 打开文件之后一定要记得关闭, 某些情况下即使写了close方法也不一定会执行到, 比如下面这种情况
文件没有及时关闭的影响: 大部分情况下没啥影响, 如果多次打开文件,不去关闭文件, 导致文件描述符表被占满, 占满之后执行打开文件操作就会失败,
解决办法
可以把close()方法放到finally中
这种写法不是很优雅, 有一种更好的写法try with resource
注意: 并不是所有的类都能放到try( ) 里, 只有实现了Closeable接口的类才可以, 这种写法在{ }
的代码执行完毕后会自动调用close方法
字节流写数据
OutputStream类: 这个类可以打开文件, 并且类里的方法可以向文件写入数据
OutputStream类中的write方法可以让我们向文件里写入数据
字符流读数据
Reader类用于读取字符流数据, 并且会自动打开对应的文件
类里的read方法可以读取字符类型的数据
read方法有四种版本
Unicode和Utf8编码
字符流写数据
Writer类: 可以打开指定文件, 如果不存在就会创建一个, 之后可以使用Writer类里的方法向文件中写入数据
write方法有四个版本
字符流和字节流与Scanner的爱情火花
以前我们都是Scanner scanner = new Scanner(System.in)的方式去输入信息
现在学了字节流和字符流读写数据, 因此可以让他们配合使用
文件搜索功能
文件的基础操作我们已经了解了, 我们可以基于这些方法写一个文件搜索功能
明确需求:
输入一个路径
输入一个关键词
在这个路径下查找文件, 这个文件名和关键词相同
文件复制功能
这个功能就比较简单了
要求: 输入两个路径复制路径和目的路径, 然后将复制路径文件的内容复制到目的路径文件中
解决步骤:
创建目的文件
读取文件内容
将内容复制到指定目录文件中
javaimport java.util.*; import java.io.*; //复制文件操作 public class Solution { public static void main(String[] args) throws IOException { //输入两个文件路径, 复制路径和目标路径 Scanner scanner = new Scanner(System.in); System.out.println("请输入要复制的文件路径: "); String src = scanner.next(); System.out.println("请输入目的路径: "); String des = scanner.next(); //判断路径是否合法 File srcfile = new File(src); if (!srcfile.isFile()) { System.out.println("输入复制文件的路径不合法"); return; } File desfile = new File(des); if(!desfile.getParentFile().isDirectory()) { //因为目的文件本事就不存在,所以判断它上一级目录文件存不存在 System.out.println("输入的目的路径非法"); return; } //1.创建文件 //这里通过写的方式自动创建文件 OutputStream outputStream = new FileOutputStream(desfile); //2.读取文件内容 InputStream inputStream = new FileInputStream(srcfile); //3.写入文件内容 int a = 0; while (a != -1) { byte[] bytes = new byte[1024]; a = inputStream.read(bytes); outputStream.write(bytes); } } }
测试一下
文件内容搜索功能
要交:
输入一个路径和关键词, 在这个路径下, 查找文件内容(不是文件名)包含关键词的文件
解题步骤
判断路径是否非法
遍历文件
遍历文件内容
返回文件路径
javaimport java.util.*; import java.io.*; public class Solution { public static void main(String[] args) throws IOException { Scanner scanner = new Scanner(System.in); System.out.println("请输入要搜索的路径: "); String path = scanner.next(); System.out.println("请输入文件内容的关键词: "); String str = scanner.next(); //1.判断路径是否存在 File pathfile = new File(path); if (!pathfile.exists()) { System.out.println("搜索路径非法!"); return; } //2. 遍历路径下的所有文件 SearchFile(pathfile, str); } public static void SearchFile(File pathfile, String str) throws IOException { if (pathfile == null) { return; } if (pathfile.isDirectory()) { File[] files = pathfile.listFiles(); //如果是一个目录文件就继续递归 for (File file : files) { SearchFile(file, str); } } else { //是普通文件, 就遍历文件内容 Searchstr(pathfile, str); } } public static void Searchstr(File pathfile, String str) throws IOException{ Reader reader = new FileReader(pathfile); int a = 0; StringBuilder tmp = new StringBuilder(); while( a != -1) { a = reader.read(); tmp.append((char) a); if (tmp.indexOf(str) >= 0) { System.out.println("找到了符合条件的文件: " + pathfile.getAbsolutePath()); return; } } } }
运行结果
美图分享
✨🎆谢谢你的阅读和耐心!祝愿你在编程的道路上取得更多的成功与喜悦!"🎆✨🎄
⭐️点赞收藏加关注,学习知识不迷路⭐️
🎉✔️💪🎉✔️💪🎉✔️💪🎉✔️💪🎉
👍😏⛳️点赞☀️收藏⭐️关注😏👍
👍😏⛳️点赞☀️收藏⭐️关注😏👍
👍😏⛳️点赞☀️收藏⭐️关注😏👍
🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️🙆♂️