File类
File类 : File代表计算机中所有的文件和文件夹的类
//文件和目录路径名的抽象表示形式。
File的构造方法
File(String pathname) : 传入文件/文件夹的路径,让File对象指向路径结尾的文件/文件夹;
File(String parent, String child) : 以子父路径的形式 传入文件/文件夹的路径,让File对象指向路径结尾的文件/文件夹;
File(File parent, String child) : : 以子父路径的形式 传入文件/文件夹的路径,让File对象指向路径结尾的文件/文件夹; //父路径以File类型的对象表示
File 对象创建干了哪些事情:
1. file对象产生了
2. 在堆内存中开辟了内存空间
3. 如果路径结尾的文件/文件夹存在 : 不会覆盖源文件和文件夹
如果路径结尾的文件/文件夹不存在 : 不会创建文件和文件夹
File类的自定义常量
static String pathSeparator
static char pathSeparatorChar
static String separator
static char separatorChar
相对路径和绝对路径
绝对路径 : 绝对能找到目标文件/文件夹的路径 -> 完整路径
特点 : 一定以盘符开头
相对路径 : 以一个相对位置出发,找到目标文件/文件夹的路径 -> 表示起来会更加简单
在IO流技术中,相对路径的起点 : Project 的根目录(IDEA和Eclipse是一样的) //往相对路径的起点内去找(弊端)
特点 : 没有用盘符开头的路径
前置路径是当前项目的根目录\\"abc.txt"
File的创建功能
boolean createNewFile() : 创建新文件,返回创建是否成功; //一定创文件
//文件存在,返回false,创建失败
boolean mkDir() : 创建单级文件夹,返回创建是否成功;//一定创建文件夹
boolean mkDirs() : 创建多级文件夹,返回创建是否成功;//一定创建文件夹,也能创建单级文件夹
File的删除功能
boolean delete() : 删除File对象指向的文件/文件夹 返回删除是否成功 //不走回收站!
File的获取功能
File getAbsoluteFile() : 获取File对象的绝对路径,但是以File对象的形式进行返回
String getAbsolutePath() : 获取File对象的绝对路径,但是以String对象的形式进行返回
String getName() : 获取File对象指向的文件/文件夹的名称
String getParent() : 获取File对象指向的文件/文件夹的父路径,返回以String对象的形式进行返回
File getParentFile() : 获取File对象指向的文件/文件夹的父路径,返回以File对象的形式进行返回
String getPath() : 获取创建File对象时传入的路径
long length() : 获取File对象指向的文件的大小(所占字节数) //文件夹没有大小
long lastModified() : 获取File对象指向的文件/文件夹的最后修改时间 //毫秒值
File的判断功能
boolean exists() : 判断File对象指向的文件/文件夹是否存在
boolean isAbsolute(): 判断创建File对象时使用的是否是绝对路径
boolean isDirectory() : 判断File对象指向的是否是一个文件夹
boolean isFile() : 判断File对象指向的是否是一个文件
boolean isHidden() : 判断File对象指向的文件/文件夹是否是隐藏的
File的遍历功能(文件夹遍历)
File[] listFiles() : 获取File对象指向的文件夹下 根目录中 所有的文件和文件夹对象,并存储到File数组中 //单级文件夹的遍历
FIle的遍历功能(带过滤条件的遍历)
File[] listFiles(FileFilter filter) : 获取File对象指向的文件夹下 根目录中 所有的文件和文件夹对象,并存储到File数组中
//单级文件夹的遍历
//带过滤条件的文件夹遍历
FileFilter : 过滤器接口
抽象方法 : boolean accept(File file)//重写accept方法的逻辑就是过滤条件,返回true允许通过,存储到数组中,返回false就拒绝通过,数组中就没有这个file对象
多级文件夹遍历
import java.io.File;
import java.io.FileFilter;
/*
递归的出口 : file对象指向的是一个文件
递归的规律 : 不断遍历文件夹的过程
递归编写的技巧 :
先写出口
再写规律
*/
public class Demo {
public static void main(String[] args) {
//创建File对象 -> 指向文件夹
File file = new File("文件夹路径");
//第一次调用传入根目录
getFileNames(file);
}
public static void getFileNames(File root){
//先写出口
if (root.isFile()){//判断传入的file对象是一个文件
System.out.println("文件有 = " + root.getName());
return;//结束方法
}
System.out.println("文件夹有 = " + root.getName());
//如果能下来说明,一定是一个文件夹
//写规律
File[] files = root.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(".xmind") || pathname.isDirectory();
}
});
//遍历files数组
for (File file : files) {//file: 子文件,子文件夹
getFileNames(file);
}
}
}
IO流
IO流 : 用来让Java代码连接硬盘数据的技术名称; //流 : 水流
IO流的分类 :
1. 流向来分 -> 参照物 : 当前Java代码
I: Input/Reader 输入
O: Output/Writer 输出
2. 操作的文件类型来分
//字节流 : XxxxStream
字节文件 : 字节流操作字节文件 //计算机中所有的文件都是字节文件
//字符流 : XxxxReader/XxxxWriter
字符文件 : 字符流操作字符文件 //计算机中字节文件内有很多 字符文件
字符文件 : 文件内全是字符 //字节流操作字符文件不是那么方便!!
字符文件如何鉴别 : 能用windows自带的记事本工具打开并能阅读文件
.txt,.java,.xml,.hmtl,.css,.md ...
常见流的类型 :
Reader : 字符输入流
OutputStream : 字节输出流
BufferedWriter : 高效字符输出流
InputStreamReader : 字符输入流 -> 转换流 : 字节流通往字符流的桥梁(字符流的本质其实就是字节流 + 编码格式)
字节流
字节输入流的根节点 : InputStream
字节输出流的根节点 : OutputStream
普通字节流:
FileInputStream/FileOutputStream : 文件字节输入/输出流
高效字节流:
BufferedInputStream/BufferedOutputStream : 高效字节输入/输出流
FileOutputStream文件字节输出流
构造方法 :
FileOutputStream(String name) : 创建FileOutputStream对象,并让这个对象指向传入路径结尾的文件
String name : 目标文件的路径 -> String 类型;
FileOutputStream(File file) : 创建FileOutputStream对象,并让这个对象指向传入路径结尾的文件
File file : 目标文件的路径 -> File 对象
创建FileOutputStream对象做了哪些事情:
1. 创建了对象
2. 开辟了内存空间
3. 让fos对象指向了路径结尾的文件
4. 当文件不存在,会帮你创建文件
当文件存在,会重新创建新文件并覆盖老文件
FileOutputStream的写数据的方法
FileOutputStream的写数据的方法 : write
void write(int b) : 一次写一个字节
void write(byte[] bys) : 一次写一个字节数组
void write(byte[] bys,int offset,int length) : 一次写一个字节数组的一部分
int offset : 从数组的哪个索引开始写数据
int length : 写几个字节
1. 如何写字符串
String --> byte[] :
byte[] getBytes() : 平台默认的编码格式进行转换 (UTF-8 : 一个中文占用3个字节)
byte[] getBytes(String charsetName) : 指定的编码格式进行转换 (GBK: 一个中文占用2个字节)
2. 如何写换行符 -> "\r\n"
write("\r\n".getBytes())
3. 如何追加写
FileOutputStream(File file, boolean append)
FileOutputStream(String name, boolean append)
boolean append : 追加写开关 主动传入true ,可以追加写
FileInputStream 文件字节输入流
构造方法:
FileInputStream(String name)
FileInputStream(File file)
输入流指向的源文件必须存在!! //若文件不存在则报错!!
FileInputStream 的读数据的方法
FileInputStream 的读数据的方法 : read
int read() : 一次读一个字节
int read(byte[] bys) : 一次读一个字节数组
int read(byte[] bys,int offset,int length) : 一次读一个字节数组的一部分
注意 :
1. 如果文件中有换行符,read方法也是能读到的
2. 当读到了文件的末尾,read方法的返回值是 -1
FileInputStream 一次读一个字节的标准代码
public class 普通字节流一次一个字节复制文件 {
public static void main(String[] args) throws IOException {
//创建流对象
FileInputStream fis = new FileInputStream("源文件");
FileOutputStream fos = new FileOutputStream("目标文件");
//循环读写
//定义int类型的变量by,用来存每次读到的字节
int by;
while((by = fis.read()) != -1){
//读了多少写多少
fos.write(by);
}
//关流
fis.close();
fos.close();
}
}
FileInputStream 一次读一个字节数组的标准代码
public class 默写_普通字节流一次一个字节数组复制文件 {
public static void main(String[] args) throws IOException {
//创建流对象
FileInputStream fis = new FileInputStream("T_Day21\\test\\童话镇.MP3");
FileOutputStream fos = new FileOutputStream("C:\\Users\\WH-HKB\\Desktop\\童话镇(一次一个字节数组).mp3");
//定义byte数组存储每次读到的字节数据
byte[] bys = new byte[1024];
//定义int变量len统计每次读到的字节个数
int len;
//循环读写
while((len = fis.read(bys)) != -1){
//读了多少写多少
//**void write(byte[] bys,int offset,int length) :
fos.write(bys,0,len);
}
//关流
fis.close();
fos.close();
}
}
BufferedOutputStream/BufferedInputStream
BufferedOutputStream/BufferedInputStream : 高效字节输出/字节输入流
//缓冲区(Buffered) -> BufferedOutputStream : void flush(); 自动刷新,关流也可以刷新
//包装流 : 自己不具备读写能力,真正读写的还是基本流; 高效率只不过是对老流的操作进行了优化
BufferedOutputStream 的构造方法 :
BufferedOutputStream(OutputStream out)
BufferedOutputStream 的写出数据方法 : write
1. 一次写一个字节 : void write(int b)
2. 一次写一个字节数组 : void write(byte[] bys)
3. 一次写一个字节数组的一部分 : void write(byte[] bys,int offset,int length)
BufferedInputStream 的构造方法 :
BufferedInputStream(InputStream in)
BufferedInputStream 的读数据方法 : read
1. 一次读一个字节 : int read();
2. 一次读一个字节数组 : int read(byte[] bys)
3. 一次读一个字节数组的一部分 : int read(byte[] bys,int offset,int length)
高效字节流一次一个字节复制文件:
import java.io.*;
public class 高效字节流一次一个字节复制文件 {
public static void main(String[] args) throws IOException {
//创建流对象
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("目标文件地址"));
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("源文件地址"));
//循环读写 : 一次一个字节
int by; //存储每次读到的字节
while((by = bis.read()) != -1){
//读一个写一个
bos.write(by);
}
//关流
bos.close();
bis.close();
}
}
高效字节流一次一个字节数组复制文件:
import java.io.*;
public class 高效字节流一次一个字节数组复制文件 {
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
//创建流对象
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(""目标文件地址""));
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream("源文件地址"));
//循环读写 : 一次一个字节数组
byte[] bys = new byte[1024];
int len;
while ((len = bis.read(bys)) != -1){
bos.write(bys,0,len);
}
//关流
bos.close();
bis.close();
long end = System.currentTimeMillis();
System.out.println(end - start);
}
}