存储数据的方案File和文件数据的操作IO流,学习字节流和字符流,了解框架和IO框架Commons IO
目录
1.File
是java.io包下的类,File类的对象,代表当前操作系统的文件。只能对文件本身进行操作,不能读写文件里存储的数据
(1)创建对象
构造器 | 说明 |
public File (String pathname) | 根据文件路径创建文件对象 |
public File(String parent,String child) | 根据父路径和子路径名字创建文件对象 |
public File(FIle parent,String child) | 根据父路径对应文件对象和子路径名字创建文件对象 |
package File_IO.file;
import java.io.File;
public class Text {
public static void main(String[] args) {
//1.创建文件对象
// 路径分割符 \\
File f1 = new File("C:\\Users\\22935\\IdeaProjects\\JAVA_study\\data.txt");
System.out.println(f1.length()); //文件大小 字节个数
//File对象是可以之地啊一个不存在的文件路径
File f2= new File("D:/resource");
System.out.println(f2.length());
System.out.println(f2.exists()); //判断是否为空文件 //false
//需要定位的文件在模块里 如何定位
//绝对路径 //带盘符
// File f4 = new File("C:\\Users\\22935\\IdeaProjects\\JAVA_study\\Collection\\src\\File_IO\\file\\data.txt");
//相对路径(重点)不带盘符 默认到工程下去找文件
File f4 = new File("JAVA_study\\Collection\\src\\File_IO\\file\\data.txt");
System.out.println(f4.length());
}
}
(2)常用方法
【1】判断类型,获取信息
方法名 | 说明 |
public boolean exists() | 判断当前文件对象,对应的的文件路径是否存在,存在返回ture |
public boolean isFile() | 判断当前文件对象指代的是否是文件,是则返回ture |
public boolean isDirectory() | 判断当前文件对象指代的是否是文件夹,是则返回true |
public String getName() | 获取文件的名称(包含后缀) |
public long length() | 获取文件的大小,返回字节个数 |
public long lastModified() | 获取文件的最后修改时间 |
public String getPath() | 获取创建文件对象时,使用的路径 |
public String getAbsolutePath() | 获取绝对路径 |
package File_IO.file;
import java.io.File;
import java.text.SimpleDateFormat;
public class Text1 {
public static void main(String[] args) {
File f1 = new File("C:\\Users\\22935\\IdeaProjects\\JAVA_study\\data.txt");
//public boolean exists() 判断当前文件对象,对应的的文件路径是否存在,存在返回ture
System.out.println(f1.exists());
//public boolean isFile() 判断当前文件对象指代的是否是文件,是则返回ture
System.out.println(f1.isFile());
//public boolean isDirectory() 判断当前文件对象指代的是否是文件夹,是则返回true
System.out.println(f1.isDirectory());
//public String getName() 获取文件的名称(包含后缀)
System.out.println(f1.getName());
//public long length() 获取文件的大小,返回字节个数
System.out.println(f1.length());
//public long lastModified() 获取文件的最后修改时间
long time = f1.lastModified();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH :mm:ss");
System.out.println(sdf.format(time));
//public String getPath() 获取创建文件对象时,使用的路径
System.out.println(f1.getPath());
//public String getAbsolutePath() 获取绝对路径 //相对路径可以转换到绝对路径
System.out.println(f1.getAbsoluteFile());
}
}
【2】创建文件,删除文件
方法名 | 说明 |
public boolean creatNewFile() |
创建一个新文件,内容为空 创建成功返回true |
Public boolean mkdir() |
用于创建文件夹 注意只能创建一级文件夹 |
public boolean mkdirs() |
用于创建文件夹 注意 可以创建多级文件夹 |
public boolean delete() |
删除文件,空文件 注意 不能删除非空文件 |
package File_IO.file;
import java.io.File;
import java.io.IOException;
public class Text2 {
public static void main(String[] args) throws IOException {
//1.public boolean creatNewFile() 创建一个新文件,内容为空 创建成功返回true
//如果文件已经创建 那么此时再进行创建会返回失败
File f1 = new File("C:/Users/22935/IdeaProjects/JAVA_study/data2.txt");
System.out.println(f1.createNewFile());
//2.Public boolean mkdir() 用于创建文件夹 注意只能创建一级文件夹
File f2 = new File("D:/resource");
System.out.println(f2.mkdir());
//3.public boolean mkdirs() 用于创建文件夹 注意 可以创建多级文件夹
File f3 = new File("D:/resource/aaa/bb/cc");
System.out.println(f3.mkdirs());
//4.public boolean delete() 删除文件,空文件 注意 不能删除非空文件
//空文件夹也可以删除
System.out.println(f1.delete());
}
}
【3】遍历文件夹
方法名 | 说明 |
Public string[ ] list() | 获取当前目录下所有的一级文件名称到一个字符串数组 |
public File[ ] listFiles() | 获取当前目录下所有等待一级文件对象到一个对象数组中 |
package File_IO.file;
import java.io.File;
public class Text3 {
public static void main(String[] args) {
//1.public String [] list() 获取当前目录下所有的一级文件名称到一个字符串数组
File f1 = new File("D:/23130405班");
String [] name = f1.list();
for (String s : name) {
System.out.println(s);
}
//2.public File [] listFile() (重点) 获取当前目录下所有等待一级文件对象到一个对象数组中
File [] files = f1.listFiles();
for (File file : files) {
System.out.println(file.getAbsolutePath());
}
}
}
使用listfiles方法的注意事项
- 当主调是文件或路径不存在时,返回null。
- 当主调是空文件时,返回一个长度为零的数组。
- 当主调是一个有内容的文件夹时,将里面一所有的一级文件和文件夹的路径都放在file数组中返回
- 当主调是一个文件夹里面有隐藏文件时,将里面所有的文件和文件路径都放在file数组中,包括隐藏文件
- 当主调是一个文件夹,但没有权限访问该文件夹时返回null。
2.方法递归
方法递归是一种算法,广泛使用,形式上来看是方法调用自身的形式
(1)递归形式
- 直接递归:方法自己调用自己
- 间接递归:调用其他方法,其他方法又调回自己
(2)应用
需求:计算n的阶乘
package File_IO.file;
public class Text4 {
public static void main(String[] args) {
System.out.println(fun(5));
}
public static int fun(int n){
if(n == 1){return 1;}
else {return fun(n-1)*n;}
}
}
(3)算法思想
算法三要素
- 递归公式
- 递归的终结点
- 递归的方向必须走向终结点
(4)*文件搜索
需求:从D盘中,搜索找到“QQ.exe”这个文件,找到后输出其位置
package File_IO.file;
import java.io.File;
public class Text5 {
public static void main(String[] args) {
search(new File("D:/"),"QQ.exe");
}
public static void search(File file,String filename){
//1.拦截非法情况
if(file == null || !file.exists() || file.isFile()){
return;
}
File [] files = file.listFiles();
if(files != null && files.length != 0){
for (File f : files) {
if(f.isFile()){
if(f.getName().equals(filename)) {
System.out.println("已找到文件位置");
System.out.println(f.getAbsolutePath());
}
}
else{
search(f,filename);
}
}
}
}
}
需求:删除非空文件夹
package File_IO.file;
import java.io.File;
public class Text6 {
public static void main(String[] args) {
//目标 删除非空文件夹,独立功能独立成方法
File file = new File("D:/");
deleteDir(file);
}
public static void deleteDir(File dir){
if(dir == null ||!dir.exists()){
return;
}
if(dir.isFile()){
dir.delete();
return;
}
File[] files = dir.listFiles();
if(files == null){
return;
}
if(files.length == 0){
dir.delete();
return;
}
for (File file : files) {
if(file.isFile()){
file.delete();
}
else{
deleteDir(file);
}
}
dir.delete();
}
}
3.字符集
(1)字符集介绍
标准Ascll字符集
美国信息交换标准化码 英文,符号 共128个字符 首尾是0
GBK(汉字内码)
包含两万多个汉字字符(一个中文字符编码成两个字节的形式)兼容Ascll字符集
Uniccode字符集
(统一码,万国码)国际组织制定2,可以容纳世界上所有文字,所有字符集
UTF-32 4个字节表示一个字符 空间占用比较大 通讯效率低
UTF-8 采用可变编码方案 分四个长度区 1,2ÿ