1、File类
File类是对文件操作的类,是文件和目录路径名的抽象表示形式,能够创建文件(目录),删除文件(目录),重命名文件(目录)
注意:
删除目录的时候,如果目录有文件,不能完成删除,必须先把文件删除了,才能删除该目录。
删除是直接删除,不进回收站
特点:
File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身
只有IO流才能访问文件的内容
File对象可以作为参数传递给IO流的构造函数
File类的常见构造方法:
public File(String pathname)
以pathname为路径创建File对象,可以是绝对路径或者相对路径,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储。
绝对路径:window下据对路径带盘符,linux下带根目录/
相对路径:相对当前位置的路径
public File(String parent,String child)
以parent为父路径,child为子路径创建File对象
文件操作相关
createNewFile() 创建新文件
delete() 删除文件
访问文件名:
getName() //能够得到文件名
getPath() //得到文件的路径+文件名
getAbsoluteFile() //得到绝对路径,返回File对象,可以继续操作文件
getAbsolutePath() //得到绝对路径,返回字符串
getParent() //得到文件的路径
renameTo(File newName) //文件重命名
文件检测
exists() //判断文件是否存在
canWrite() //判断文件是否可写
canRead() //判断文件是否可读
isFile() //判断是否一个文件
isDirectory() //判断是否一个目录
获取常规文件信息
lastModified() //最后一次修改时间
length() //文件的长度
目录操作相关
mkDir() //创建目录
mkDirs() //创建多级目录
list() //列出目录下的文件
listFiles() //列出目录下的文件对象
2、递归
方法递归:
1、方法调用本身
2、递归调用要有出口,否则就是死循环
/**
* 求出10的阶乘
* 10*9*8*7*6*5*4*3*2*1
*
* 注意递归得有出口:
* 出口条件是:a==1
*
* @author Administrator
*
*/
public class DiGui02 {
public static void main(String[] args) {
System.out.println(mul(10));
}
public static int mul(int a){
if(a==1){
return 1;
}
else{
return a*mul(a-1);
}
}
}
案例:递归删除某个目录下所有的txt文件,包含子目录
/**
* 需求:
* 删除桌面目录abc下所有目录的txt文件
*
*
* @author Administrator
*
*/
public class FileTest02 {
public static void main(String[] args) {
File file=new File("C:\\Users\\Administrator\\Desktop\\abc\\");
FileTest02.delFileTxt(file);
}
public static void delFileTxt(File f){
File[] files=f.listFiles();
for (File file2 : files) {
if(file2.isDirectory()){
delFileTxt(file2);
}else{
if(file2.getPath().endsWith(".txt")){
file2.delete();
}
}
}
}
}
3、IO
IO:输入输出流
四大基类:Reader,Writer,InputStream,OutputStream
分类:
流向不同:
输入流
InputStream
Reader
输出流
OutputStream
Writer
按类型不同
字节流
InputStream
OutputStream
字符流
Reader
Writer
JAVA中流操作基本上都是派生自以上四个基类,命名规则基本上如下:
XXXXReader
XXXXWriter
XXXXInputStream
XXXXOutputStream
备注:
对于文本文件,应使用字符Reader、Writer流
对于二进制文件,应使用字节InputStream、OutputStream流
3.1 FileInputStream
字节输入流InputStream常用方法:
int read() //读取一个字节
int read(byte[] b) //一次性读多个字节到缓冲区数组
int read(byte[] b, int off, int len)
代码示例:
/*
* 读入数据步骤:
* 1、使用文件输入流打开指定文件
* 对于文本文件,应使用字符输入流FileReader流
* 对于二进制文件,应使用字节输入流FileInputStream流
* 2、读取文件数据
* 3、关闭输入流
*
*/
InputStream inputStream = new FileInputStream("C:\\Users\\Administrator\\Desktop\\abc.txt");
//一次读一个字节
int read=0;
while((read = inputStream.read()) !=-1){
System.out.print((char)(read));
}
inputStream.close();
System.out.println();
inputStream = new FileInputStream("C:\\Users\\Administrator\\Desktop\\abc.txt");
//解决一次读一个字节中文乱码的方法
byte[] byte1 = new byte[inputStream.available()];
for (int i = 0; (read = inputStream.read()) !=-1;i++ ) {
byte1[i]=(byte)read;
}
System.out.println(new String(byte1));
System.out.println();
inputStream = new FileInputStream("C:\\Users\\Administrator\\Desktop\\abc.txt");
//一次读一个缓冲区
byte[] b=new byte[4096];
while((read=inputStream.read(b)) != -1){
System.out.println(new String(b, 0, read));
}
3.2 FileOutputStream
字节输出流OutputStream常用方法:
void write(int b);// 向流中写一个字节
void write(byte[] b);//向流中写一个数组
void write(byte[] b, int offset, int length);
void flush(); //把数据从OS缓冲区刷入硬盘
void close(); 需要先刷新,再关闭此流
常用实现类:FileOutputStream
换行
windown \r\n
linux \n
通常情况下只需要\n即可换行
内容追加
new FileOutputStream(String path, boolean append)
append true表示向文件追加内容
不写或者false,覆盖源文件的内容
代码实例:
OutputStream out = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\abc.txt");
//一次写一个字节
out.write(97);
out.write(98);
out.write(99);
out.write(100);
out.close();
out = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\abc.txt");
//按缓冲区来写
//换行
// windown \r\n
// linux \n
// 通常情况下只需要\n即可换行
out.write("中国足球队真没就了\r\n".getBytes());
out.write("就是穆里尼奥来了都不行\r\n".getBytes());
out.close();
3.3 FileReader
字符输入流:Reader
int read() // 读取一个字符
int read(char [] c) //一次性读多个字符到缓冲区数组
int read(char [] c, int off, int len)
常用实现类:FileReader
代码示例:
Reader reader = new FileReader("C:\\Users\\Administrator\\Desktop\\abc.txt");
//一次对一个字符
int r=0;
while((r=reader.read()) != -1){
System.out.print((char)r);
}
System.out.println();
reader = new FileReader("C:\\Users\\Administrator\\Desktop\\abc.txt");
//按缓冲区来读
char[] c=new char[4096];
while((r=reader.read(c)) != -1){
System.out.print(new String(c,0,r));
}
3.4 FileWriter
字符输出流:Writer
void write(int c);// 向流中写一个字节/字符
void write(char[] cbuf);//向流中写一个数组
void write(char[] buff, int offset, int length);
void flush(); //把数据从OS缓冲区刷入硬盘
void close(); 需要先刷新,再关闭此流
常用实现类:FileWriter
因为字符流直接以字符作为操作单位,所以 Writer 可以用字符串来替换字符数组,即以 String 对象作为参数
void write(String str);
void write(String str, int off, int len);
换行
windown \r\n
linux \n
通常情况下只需要\n即可换行
内容追加
new FileWriter(String path, boolean append)
append true表示向文件追加内容
不写或者false,覆盖源文件的内容
代码示例:
FileWriter writer = new FileWriter("C:\\Users\\Administrator\\Desktop\\abc.txt");
//一次写一个字符
writer.write(97);
writer.write(98);
writer.write(99);
writer.write(100);
writer.flush();
writer.close();
//一次写一个缓冲区
writer = new FileWriter("C:\\Users\\Administrator\\Desktop\\abc.txt",true);
char[] c= {'我','爱','你','中','国'};
writer.write(c);
writer.flush();
writer.close();
//一次写一个字符串
writer = new FileWriter("C:\\Users\\Administrator\\Desktop\\abc.txt",true);
writer.write("我们都是中国人....\r\n");
writer.write("我们都是中国人....\r\n");
writer.write("我们都是中国人....\r\n");
writer.flush();
writer.close();