day21_IO
今日内容
零、 复习昨日
一、作业
二、File
三、IO流
四、字节输入&输出流
零、 复习昨日
复习
一、作业
见代码
二、File
2.1 介绍
文件和目录(文件夹) 路径名的抽象表示形式。
即使用路径来表示一个文件或者一个文件夹对象
路径:
- 相对路径,相对于当前项目的项目名下
- 绝对路径,按照磁盘来确定
2.2 构造方法
- File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
- File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
- File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
public static void main(String[] args) throws IOException {
// 以子父级路径来创建文件对象
File file = new File("E:\\A", "a.txt");
System.out.println(file.exists() );
// 先创建父文件对象
File parent = new File("E:\\A");
File file1 = new File(parent, "a.txt");
}
private static void show1() throws IOException {
// 以路径创建文件对象
File file1 = new File("a.txt");// 相对
File file2 = new File("E:\\a.txt");// 绝对路径
// 判断是否存在
System.out.println(file1.exists( ));
System.out.println(file2.exists( ));
// 创建文件
file1.createNewFile();
file2.createNewFile();
System.out.println("-- over --" );
}
2.3方法
创建功能
- boolean createNewFile() 当且仅当不存在此路径名表示的
文件
时,创建一个新的空文件。- boolean mkdir()
创建
此抽象路径名指定的目录/文件夹
。- boolean mkdirs()
创建多层级的文件夹
。
private static void show3() throws IOException {
File file = new File("b.txt");
// 创建文件对象
boolean newFile = file.createNewFile( );
System.out.println(newFile );
File file2 = new File("cDir");
// 创建文件夹对象
boolean mkdir = file2.mkdir( );
System.out.println(mkdir);
File file3 = new File("dDir\\d2Dir\\d3Dir");
// 创建多层文件夹对象
boolean mkdir2 = file3.mkdirs( );
System.out.println(mkdir2);
}
获取功能
- File getAbsoluteFile() 返回以绝对路径代表文件对象
- **String getAbsolutePath() **返回以绝对路径代表文件路径字符串
- String getName() 返回文件或目录的名称。
- String getPath()返回构造方法中的文件名
- String[] list()返回一个字符串数组,数组内是文件夹里面的文件或文件夹的名字
场景: 列出A文件夹下的所有记事本文件 (判断字符串后缀)- File[] listFiles()返回一个文件对象数组,数组内是文件夹里面的每个文件对象
- long lastModified() 返回此文件/文件夹最后一次被修改的时间,返回的毫秒值
- long length() 返回由此文件的字节长度。
private static void show4() throws IOException {
// File file = new File("E:\\A\\a.txt");
File file = new File("a.txt");
// - File getAbsoluteFile()返回此抽象路径名的绝对路径名形式。
File file1 = file.getAbsoluteFile( );
System.out.println(file1);
// - String getAbsolutePath()返回此抽象路径名的绝对路径名字符串。
String absolutePath = file.getAbsolutePath( );
System.out.println(absolutePath );
// - String getName()返回由此抽象路径名表示的文件或目录的名称。
String name = file.getName( );
System.out.println(name );
// - String getPath() 返回的构造方法中的路径
System.out.println(file.getPath());
// ---- list(),listFiles() 主要是针对文件夹对象操作的 ------
// 使用文件对象,调用这两个方法,返回的是null
File file2 = new File("E:\\A");
// - String[] list()返回一个字符串数组,这些字符串是文件夹内文件或文件夹名字
String[] list = file2.list( );
System.out.println(Arrays.toString(list ) );
// 场景: 列出A文件夹下的所有记事本文件 (判断字符串后缀)
// - File[] listFiles()返回一个文件对象数组,数组内是文件夹内文件或文件夹对象
File[] files = file2.listFiles( );
System.out.println(Arrays.toString(files ) );
// 场景: 删除文件内的所有文件
File file3 = new File("E:\\A\\a.txt");
// - long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。
long l = file3.lastModified( );
System.out.println("毫秒值:" + l );
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String format = sdf.format(new Date(l));
System.out.println(format );
// - long length() 返回由此抽象路径名表示的文件的长度。
System.out.println(file3.length() );
}
判断功能
- boolean exists() 测试此抽象路径名表示的文件或目录是否存在。
- boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录。
- boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。
- boolean isHidden() 测试此抽象路径名指定的文件是否是一个隐藏文件。
private static void show5() throws IOException {
File file = new File("E:\\A\\e.txt");
// - boolean exists() 测试此抽象路径名表示的文件或目录是否存在。
System.out.println(file.exists() );
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() );
}
删除&重命名
- boolean renameTo(File dest) 移动并重命名
- boolean delete() 删除此抽象路径名表示的文件或目录。
private static void show6() throws IOException {
// - boolean renameTo(File dest) 移动并重命名
File file = new File("E:\\A\\a.txt");
// File file2 = new File("E:\\A\\A.txt");
File file2 = new File("E:\\AA.txt");
file.renameTo(file2);
// - boolean delete() 删除此抽象路径名表示的文件或空目录。
// 删除不走回收站
File file1 = new File("E:\\A\\b.jpg");
boolean delete = file1.delete( );
System.out.println(delete );
File file3 = new File("E:\\A");
boolean delete3 = file3.delete( );
System.out.println(delete3 );
}
以上是这些方法,最重要是
- 构造方法
- 判断是否存在 exists
- 创建文件 createNewFIile,创建文件夹mkdir
- 获得绝对路径 getAbsolutePath
- 删除 delete()
2.4 练习
1 设计方法,传入文件路径.列出该文件夹下的所有记事本文件 (单层文件夹)
// 传入文件路径.列出该文件夹下的所有记事本文件 (单层文件夹)
public static void printTxt(String path) {
// 创建文件对象
File file = new File(path);
// 获得每个文件名字符串 list()
String[] list = file.list( );
// 通过String类endsWith()
for (String s : list) {
if (s.endsWith("txt")) {
// 输出txt文件
System.out.println(s );
}
}
}
2 设计方法,传入文件路径.删除该文件夹下的所有文件(只是删文件,不删文件夹)
// 传入文件路径.删除该文件夹下的所有文件(只是删文件,不删文件夹)
public static void deleteFile(String path) {
File file = new File(path);
File[] files = file.listFiles( ); // 查到文件夹下所有的文件对象
for (File f : files) {
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 指定。
方法
- int read() 一次读取一个字节
- void close() 关流
public static void main(String[] args) throws IOException {
// FileInputStream fis = new FileInputStream("a.txt");
FileInputStream fis = new FileInputStream(new File("a.txt"));
// read(),一次读取一个字节
// int a1 = fis.read();
// System.out.println(a1 );
//
// int a2 = fis.read();
// System.out.println(a2 );
//
// int a3 = fis.read();
// System.out.println(a3 );
//
// // 读完返回-1,即结束
// int a4 = fis.read();
// System.out.println(a4 );
int n = -1;
while ( (n = fis.read()) != -1) {
System.out.println( (char)n );
}
// 关流
fis.close();
}
read() 一次读一个,有点"慢"
read(byte[] ) 一次读取一个数组大小的数据,比较快
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("a.txt");
// byte[] arr = new byte[4];// 长度为4的数组,一次读取4个字节
// read(byte[]) 一次可以读取数组长度个数的数据,存入数组,返回读取的数据个数
// int len = fis.read(arr);
// System.out.println(Arrays.toString(arr ));
byte[] arr = new byte[4];
int len = -1;
while ((len = fis.read(arr)) != -1) {
String s = new String(arr, 0, len);
System.out.println(s );
}
fis.close();
}
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("c.txt");
FileOutputStream fos = new FileOutputStream("c.txt",true);
// 写出一个字节
//fos.write(97);
// 写出一个数组内全部数据
byte[] bytes = {65,66,67,68};
fos.write(bytes);
fos.close();
}
4.3 使用捕获异常的方式编程[必须熟练]
private static void show3_trycatch() {
FileInputStream fis = null;
try {
fis = new FileInputStream("a.txt");
int a = -1;
while((a = fis.read()) != -1) {
System.out.println(a );
}
} catch (Exception e) {
System.out.println("读取数据报错啦 - " + e.getMessage() );
} finally {
try {
fis.close( );
}catch (Exception e) {
System.out.println("关流异常!" + e.getMessage() );
}
}
}
4.4 练习: 拷贝图片
将D:\justdoit.jpg图片拷贝一份到E:\jiushigan.jpg
思路: 从d盘读取,写到e盘
// 边读边写
public static void copy() throws IOException {
FileInputStream fis = new FileInputStream("E:\\justdoit.jpg");
FileOutputStream fos = new FileOututStream("D:\\jiushigan.jpg");
int a = -1;
while((a = fis.read()) != -1) {
fos.write(a);
}
fis.close();
fos.close();
}
改造成trycatch代码再写一遍
五、 总结
重点: 字节输入输出流,标准几行代码
特别熟练: try-catch写代码
理解: IO流
:\jiushigan.jpg
思路: 从d盘读取,写到e盘
// 边读边写
public static void copy() throws IOException {
FileInputStream fis = new FileInputStream("E:\\justdoit.jpg");
FileOutputStream fos = new FileOututStream("D:\\jiushigan.jpg");
int a = -1;
while((a = fis.read()) != -1) {
fos.write(a);
}
fis.close();
fos.close();
}
改造成trycatch代码再写一遍
五、 总结
重点: 字节输入输出流,标准几行代码
特别熟练: try-catch写代码
理解: IO流