一、File流的概念
二、IO流的概念
三、File流的常用方法
1.创建对象
import java.io.File;
public class FileTest1 {
public static void main(String[] args) {
//创建一个file对象,指代某一个具体的文件
File f1 = new File ( "E:/FileTest/hz.txt" );
System.out.println ( f1.length () );//返回文件大小 (字节)
//创建一个file对象,指代某一个具体的文件夹
File file2 = new File ( "E:/FileTest" );
System.out.println ( file2.length () );//文件夹本身的大小 而不是文件夹的大小
//file对象可以指带一个不存在的文件路径
File f3 = new File ( "E:/FileTest/aaa.txt" );
System.out.println ( f3.length () );//0
System.out.println ( f3.exists () );//查看文件是否存在//false
//定位的文件在模块中应该如何定位?
//绝对路径:带盘符
File file4 = new File ("D:\\xuexi\\src\\bbb.txt");
//建议使用相对路径:默认直接在工程下寻找文件
new File ( "xuexi\\src\\bbb.txt" );
System.out.println ( file4.length () );// 7
}
}
2.判断文件类型、获取文件信息功能
import java.io.File;
import java.text.SimpleDateFormat;
public class FileTest2 {
public static void main(String[] args) {
//1.创建文件对象指代某个文件
File f1 = new File ( "E:/FileTest/hz.txt" );
//2.public boolean exists():判断当前文件对象,对应的文件路径是否存在 存在返回True
System.out.println ( f1.exists () );//true
//3.public boolean isFile():判断当前文件对象是否为文件,是文件返回true
System.out.println ( f1.isFile () );
//4.public boolean isDirectory() :判断当前文件对象是否为文件夹
System.out.println ( f1.isDirectory () );
//5.public String getName():获取文件的名称包含后缀
System.out.println ( f1.getName () );//hz.txt
//6.public long length():获取文件大小,返回字节个数
System.out.println ( f1.length () );
//7.public long lostModified():获取文件的最后修改时间
System.out.println ( f1.lastModified () );//1695005604267
long time = f1.lastModified ();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat ( "yyyy:MM:dd HH:mm:ss" );
System.out.println ( simpleDateFormat.format ( time ) );//2023:09:18 10:53:24
//8.public String getPath():获取创建文件对象时的绝对的路径
File f2 = new File ( "xuexi\\src\\bbb.txt" );
System.out.println ( f2.getPath () );//返回创建时的路径
System.out.println ( f1.getPath () );
//9.public String getAbsolutePath():获取绝对路径
System.out.println ( f1.getAbsolutePath () );
System.out.println ( f2.getAbsolutePath () );//D:\xuexi\xuexi\src\bbb.txt
}
}
3.创建文件和删除文件
import java.io.File;
import java.io.IOException;
public class FileTest3 {
public static void main(String[] args) throws IOException {
//1.public boolean createFile():创建一个新文件(文件不存在时创建,创建成功返回true)
File f1 = new File ("E:/FileTest/hzzz.txt");
System.out.println ( f1.createNewFile () );
//2.public boolean mkdir():创建文件夹 注意 只能创建一级文件夹
File f2 = new File ( "E:/FileTest/aaa" );
System.out.println ( f2.mkdir () );
//3.public boolean mkdirs():创建文件夹 创建多级文件夹
File f3 = new File ( "E:/FileTest/bbb/ccc/ddd/eee" );
System.out.println ( f3.mkdirs () );
//4.public boolean delete():新建文件、或者空文件 注意 不能删除非空文件夹
System.out.println ( f1.delete () );
System.out.println ( f2.delete () );
}
}
4.遍历文件夹(方法只能遍历一级文件夹,不能遍历2级及以上的文件夹)
import java.io.File;
public class FileTest4 {
public static void main(String[] args) {
//1.public String [] list():获取当前目录下所有的”一级文件名称“到一个字符串数组去返回
File f1 = new File ( "E:/FileTest/bbb" );
String[] names = f1.list ();
for (String name : names) {
System.out.println ( name );
}
//2.public File[] listFiles():获取当前目录下所有的“一级文件”到“另一个文件按对象数组中去返回”(重点)
File[] files = f1.listFiles ();
for (File file : files) {
System.out.println ( file.getAbsolutePath () );
}
}
}
5.用递归的方法遍历文件夹
1.递归方法
2.案例
3.经典的递归问题:猴子吃桃
public class Test1 {
public static void main(String[] args) {
//1.找函数关系式
//f(x)-f(x)/2 -1=f(x+1)
//变形
//2f(x)-f(x)-2=2f(x+1)
//f(x)=2f(x+1)+2
//求f(1)=?
System.out.println ( f ( 1 ) );//1534
System.out.println ( f ( 2 ) );//766
System.out.println ( f ( 3 ) );//382
}
public static int f(int x){
if (x==10){
return 1;
}
return 2*f(x+1)+2;
}
}
4.文件搜索
import java.io.File;
import java.io.IOException;
public class SearchFileTest {
public static void main(String[] args) throws IOException {
searcheFile ( new File ( "D:/" ),"QQ.exe" );
}
/**
*
* @param dir 目录
* @param fileName 要搜索的文件名称
*/
public static void searcheFile(File dir,String fileName) throws IOException {
//1.拦截非法情况
if (dir==null||!dir.exists ()||dir.isFile ()){
return;//代表无法搜索
}
//2.获取当前目录下的全部的一级文件对象
File[] files = dir.listFiles ();
//3.判断当前目录是否存在一级文件对象,以及是否可以拿到一级文件对象
if(files!=null&&files.length>0){
//4.遍历全部一级文件对象
for (File file : files) {
//5.判断文件是否为文件,还是文件夹
if(file.isFile ()){
if (file.getName ().contains ( fileName )){
System.out.println ( file.getAbsolutePath () );
//qq启动!!!!!
Runtime runtime = Runtime.getRuntime ();
runtime.exec ( file.getAbsolutePath () );
}
}else {
//6.是文件夹
searcheFile ( file,fileName );
}
}
}
}
}
5.文件删除
import java.io.File;
public class DeleteFileTest {
public static void main(String[] args) {
}
public static void deleteDir(File dir){
//1.传入的对象是文件夹
if (dir==null||!dir.exists ()){
return;
}
//2.传入的对象是文件
if(dir.isFile ()){
dir.delete ();
return;
}
//1.dir存在且是文件夹,拿到里面的一级文件对象
File[] files = dir.listFiles ();
if (files==null){
return;
}
//2.这是一个存内容的文件夹干掉里面的内容在干掉自己
for (File file : files) {
if (file.isFile ()){
file.delete ();
}else {
deleteDir ( file );
}
dir.delete ();
}
}
}
6.啤酒问题
啤酒两元一瓶,4个盖子可以换一瓶,两个空瓶可以换一瓶,请问十元可以喝多少瓶
public class Test2 {
public static int totalNumber;//总瓶子数
public static int lastBottleNumber;//上轮剩余瓶子数
public static int lastCoverNumber;//上轮剩余瓶盖数
public static void main(String[] args) {
buy ( 10 );
System.out.println (totalNumber);
}
public static void buy(int money){
//1.先买了几瓶
int buyNumber=money/2;
totalNumber+=buyNumber;
//2.把盖子和瓶子换算成钱继续买
//计算本轮的盖子数和瓶子数
int totalBottleNumber=buyNumber+lastBottleNumber;
int totalCoverNumber=buyNumber+lastCoverNumber;
int allMoney=0;
//换算成钱
if (totalBottleNumber>=2){
allMoney+=(totalBottleNumber/2)*2;
}
lastBottleNumber=totalBottleNumber%2;
if (totalCoverNumber>=4){
allMoney+=(totalCoverNumber/4)*2;
}
lastCoverNumber=totalCoverNumber%4;
if (allMoney>=2){
buy ( allMoney );
}
}
}