今日内容
上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili
同步笔记沐沐霸的博客_CSDN博客-Java2301
零、 复习昨日
一、作业
二、File
三、IO流
四、字节输入&输出流
零、 复习昨日
见晨考
一、作业
见答案
二、File
2.1 介绍
File,通过一个路径代表文件或者文件夹
File类是文件(file)和目录(directory)路径名的抽象表示形式。
说人话: 一个File类代表一个文件或者一个文件夹的路径
特殊之处:
- 但是这个路径不一定要真实存在
- 路径有分
- 绝对路径 (带完整路径,盘符等信息)
- 相对路径 (没有盘符,只有文件名等信息,相对于当前项目名下)
2.2 构造方法
- File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
- File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
- File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
/**
* 测试构造方法
*/
private static void testConstructor() {
// 通过字符串代表文件/文件夹对象
File file = new File("E:\\a.txt");
System.out.println(file );
// 通过父级路径+ 子级路径代表 一个文件/文件夹对象
File file2 = new File("E:\\A","a.txt"); // E:\A\a.txt
// 以上这种,比较适合后续做文件上传使用
String fuPath = "E:\\A";
File parent = new File(fuPath);
File file3 = new File(parent, "a.txt"); // E:\A\a.txt
}
2.3方法
创建功能
- boolean createNewFile() 当且仅当不存在此路径名表示的
文件
时,创建一个新的空文件。- boolean mkdir()
创建
此抽象路径名指定的目录/文件夹
。- boolean mkdirs()
创建多层级的文件夹
。
/**
* 创建文件/文件夹的方法
*/
private static void testCreate() throws IOException {
// 通过字符串代表文件对象
File file = new File("E:\\a.txt");
// 创建不存在的新文件
boolean newFile = file.createNewFile( );
System.out.println("是否创建成功? " + newFile );
// 创建文件夹,不能使用已经存在的文件对象去调用方法
File file2 = new File("E:/B");
boolean mkdir = file2.mkdir( );
System.out.println("创建文件夹? " + mkdir );
// 创建多层文件夹
File file3 = new File("E:\\C\\CC\\CCC");
boolean mkdir1 = file3.mkdirs( );
System.out.println("创建多层文件夹? " + mkdir1 );
}
获取功能
- File getAbsoluteFile()返回此抽象路径名的绝对路径名形式。
- String getAbsolutePath()返回此抽象路径名的绝对路径名字符串。
- String getName()返回由此抽象路径名表示的文件或目录的名称。
- String getPath()将此抽象路径名转换为一个路径名字符串。
- String[] list()返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。场景: 列出A文件夹下的所有记事本文件 (判断字符串后缀)
- File[] listFiles()返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
- long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。
- long length() 返回由此抽象路径名表示的文件的长度。
/**
* 测试关于获得内容的方法
*/
private static void testGet() {
File file = new File("E:\\a.txt");// 绝对路径
// 相对路径,相对于当前项目根路径
File file2 = new File("a.txt");
// - File getAbsoluteFile()返回此抽象路径名的绝对路径名形式。
File absoluteFile = file2.getAbsoluteFile( );
System.out.println(absoluteFile );
// - String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。
String absolutePath = file2.getAbsolutePath( );
System.out.println(absolutePath );
// - String getName()返回由此抽象路径名表示的文件或目录的名称。
System.out.println(file.getName() );
System.out.println(file2.getName() );
// - String getPath() 获得构造方法中的路径
System.out.println(file.getPath() );
System.out.println(file2.getPath() );
System.out.println("----------------" );
File aDir = new File("E:\\A");
// - String[] list()返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。场景: 列出A文件夹下的所有记事本文件 (判断字符串后缀)
String[] arr = aDir.list( );
System.out.println(Arrays.toString(arr ) );
// - File[] listFiles()返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
File[] files = aDir.listFiles( );
System.out.println(Arrays.toString(files ) );
File aFile = new File("E:\\A\\a.txt");
// - long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。
System.out.println(aFile.lastModified() );
long l = aFile.lastModified( );
// 由指定毫秒值创建Date对象
Date lastModified = new Date(l);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
String format = sdf.format(lastModified);
System.out.println(format );
// - long length() 返回由此抽象路径名表示的文件的长度。
System.out.println( aFile.length());
}
判断功能
- boolean exists() 测试此抽象路径名表示的文件或目录是否存在。
- boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录。
- boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。
- boolean isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。
/**
* 测试判断功能
*/
private static void testPanduan() throws IOException {
// - boolean exists() 测试此抽象路径名表示的文件或目录是否存在。
File file = new File("b.txt");
// 如果不存在时,创建该文件
if (!file.exists()) {
file.createNewFile();
}
// - boolean isDirectory() 判断是否是文件夹
System.out.println(file.isDirectory() );
// - boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。
System.out.println(file.isFile() );
// - boolean isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。
System.out.println("是否隐藏? " + file.isHidden() );
File file1 = new File("E:\\IDEA-WorkSpaceJava2301\\day21");
String[] list = file1.list( );
for (String s : list) {
System.out.println(s );
}
}
删除&重命名
- boolean renameTo(File dest) 重新命名此抽象路径名表示的文件。
- boolean delete() 删除此抽象路径名表示的文件或目录。
private static void test() {
File file = new File("E:\\A");
// - boolean delete() 删除此抽象路径名表示的文件或目录。
// 只能删除空文件夹
boolean delete = file.delete( );
System.out.println(delete );
File file1 = new File("E:\\a.txt");
// - boolean renameTo(File dest) 重新命名此抽象路径名表示的文件。
// 改后路径与原来一致,就是单纯重命名
// file1.renameTo(new File("E:\\aaa.txt"));
// 改后路径与原来不一致,那就是移动并重命名
file1.renameTo(new File("E:\\B\\aaa.txt"));
}
2.4 练习
1 设计方法,传入文件路径.列出该文件夹下的所有记事本文件 (单层文件夹)
public static void findTxt(String path){
File file = new File(path);
if(!file.exists()) {
System.out.println("该路径指定的文件不存在!");
return;
}
if(!file.isDirectory()) {
System.out.println("该路径指定的文件不是文件夹!");
return;
}
String[] nameArr = file.list();
for(String name : nameArr) {
if(name.endsWith("txt")) {
System.out.println("记事本文件: " + name);
}
}
}
2 设计方法,传入文件路径.删除该文件夹下的所有文件(只是删文件,不删文件夹)
public static void deleteFile(String path){
File file = new File(path);
if(!file.exists()) {
System.out.println("该路径指定的文件不存在!");
return;
}
if(!file.isDirectory()) {
System.out.println("该路径指定的文件不是文件夹!");
return;
}
File[] fileArr = file.listFiles();
for(File f : fileArr) {
if(f.isFile()) {
f.delete();
}
}
}
ps: 该题可以扩展,给定路径删除该文件夹
三、IO流
流的概念:
在程序中,数据需要传输(移动),⽐如磁盘上的数据需要出现在显⽰器上,就需要进⾏数据传输。 在Java中进⾏数据传输的技术就是“流”.
IO - Input & Output - 输入 & 输出
IO按类型分类
- 字节流
- 字节输入流
- 字节输出流
- 字符流
- 字符输入流
- 字符输出流
IO按方向分类
- 输入流
- 输出流
四、字节输入&输出流
字节输入流和字节输出流顶层设计是
抽象类
- InputStream 输入字节流
- 一般使用其子类FileInputStream
- OutputStream 输出字节流
- 一般使用其子类FileOutputStream
4.1 FileInputStream
FileInputStream
用于读取诸如图像数据之类的原始字节流(二进制文件)
构造方法
FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
FileInputStream in = new FileInputStream("a2.txt");
File file = new File("a2.txt");
FileInputStream in2 = new FileInputStream(file);
方法
- int read() 一次读取一个字节
- void close() 关流
public static void main(String[] args) throws IOException {
// 以文件创建流
FileInputStream in = new FileInputStream("a.txt");
// 开始读取
// 一次读取一个字节
// int i1 = in.read();
// System.out.println((char)i1 );
//
// int i2 = in.read( );
// System.out.println((char)i2 );
//
// int i3 = in.read( );
// System.out.println((char)i3 );
//
// // 读到末尾(读完了)返回-1
// int i4 = in.read( );
// System.out.println(i4 );
int r = -1;
while((r = in.read()) != -1) {
System.out.println((char)r );
}
// 关流,释放资源
in.close();
}
read() 一次读一个,有点"慢"
read(byte[] ) 一次读取一个数组大小的数据,比较快
public static void main(String[] args) throws IOException {
// 以文件创建流
FileInputStream in = new FileInputStream("a.txt");
byte[] bytes = new byte[4];
System.out.println(Arrays.toString(bytes ) );
// 可以将元素一次读取到数组中
in.read(bytes);
System.out.println(Arrays.toString(bytes ) );
}
4.2 FileOutputStream
FileOutputStream是文件输出流,用于将数据写入
File
适合用于写入诸如图像数据之类的原始字节的流(二进制)
构造方法
- FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
- FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
- FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。
- FileOutputStream(String name, boolean append) 创建一个向具有指定 name 的文件中写入数据的输出文件流。
方法
- void write(int b) 将指定字节写入此文件输出流。
- void close() 关闭此文件输出流并释放与此流有关的所有系统资源。
public static void main(String[] args) throws IOException {
// FileOutputStream fos = new FileOutputStream("a.txt");
// 构造方法中参数2, boolean append,意思是是否对该文件内容追加写入
// 指定true,追加内容到原文件
// 指定false,覆盖原文件内容
// 不指定的话默认是false
// 特殊的,写出的文件即使不存在,也会先创建文件再写入
FileOutputStream fos = new FileOutputStream("c.txt",true);
// 写一个
//fos.write(67);
// 支持一次写多个数据
byte[] bytes = {65,66,67,68,69};
fos.write(bytes);
fos.close();
System.out.println("写完啦~" );
}
4.3 使用捕获异常的方式编程
public static void main(String[] args) {
FileInputStream in = null;
try {
in = new FileInputStream("a.txt");
int r = -1;
while((r = in.read()) != -1) {
System.out.println(r );
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try{
in.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
4.4 练习: 拷贝图片
将D:\justdoit.jpg图片拷贝一份到E:\jiushigan.jpg
思路: 从d盘读取,写到e盘
public static void main(String[] args) throws Exception {
// 将读取转为输入字节流
FileInputStream in = new FileInputStream("E:\\B\\justdoit.jpg");
// 将图片写出
FileOutputStream out = new FileOutputStream("E:\\C\\jiushigan.jpg");
int r = -1;
while ((r = in.read()) != -1) {
out.write(r);
}
in.close();
out.close();
System.out.println("拷贝完毕" );
}
改造成trycatch代码再写一遍
五、 总结
file 关于文件操作
会创建文件对象,创建文件夹/文件,判断文件夹/文件
输入/输出字节流
6行标准代码
会说: 什么是IO, 怎么分类,分别适合场景