目录
一 File类概述
import java.io.File;
/**
* File类:定位文件,进行删除,获取文本本身信息等操作,但是不能读写文件内容
*
* IO流 : io流技术可以对硬盘中的文件进行读写
*
* 总体学习思路: 先学会使用File类定位以及操作文件本身,然后学习io流读写文件数据
*
* (File类使用--->方法递归--->字符集--->io流的作用,分类)
*
* @author 黄佳乐
*
*/
public class Main {public static void main(String[] args) {
/**File类概述
*
* 1: File类在包java.io.File下,代表操作系统的文件对象(文件,文件夹)
* 2: File类提供了诸如:定位文件,获取文件本身的信息,删除文件,创建文件(文件夹)等功能
*
* */
/**===============1:创建File类对象===============================*/
File f = new File("D:\\英雄时刻\\1203764531\\英雄时刻_20180916-17点56分31s.avi") ;
//双引号中间写的是这个文件的路径(在计算机找到所需的文件-->右键该文件-->属性-->安全-->对象名称后面的就是该文件路径)
long size = f.length(); //获取文件字节大小
System.out.println(size); //37977272
/** ===============2 :File类创建对象支持绝对路径并且支持相对路径(重点!!!)=============*/
//绝对路径就是上面的那一种方法,直接把该文件在你电脑里的位置放进来,但是如果在不同的电脑上呢?放文件的位置就可能不一样,所以就用到了相对路径
/**
* 总的来说呢,就是先在src里面创建一个file,然后....写成下面这样,但是运行不了 ,不知道错在哪里,
* 按道理应该是6个字节,可是打印出来是0,算了不管了。先学会绝对路径就行了
*/
File f2 = new File("file-io-app/src/date") ;
System.out.println(f2.length());
//========================================================
f.delete() ; //删掉f这个文件,我试一下,看一下能不能真的把我电脑上面的这个文件给删掉,嘻嘻~
//卧槽!!!牛逼,我电脑上的这个文件真的被删了!叼,不知道还能不能找回来啊。。
//=======================================
boolean r = f.exists() ; //判断f这个文件路径存不存在,存在返回true,否则反之(f文件被我删掉了,所以是false)
System.out.println(r) ;
File f3 = new File("D:\\360Downloads") ; //重新创一个试一下
System.out.println(f3.exists()) ; //true(奈斯)
}}
二 File类常用方法
import java.io.File;
import java.text.SimpleDateFormat;/**
* File类常用API:
*
* @author 黄佳乐
*
*/
public class Main{
public static void main(String[] args) {
// 1: 绝对路径创建一个文件对象
File f1 = new File("C:\\Users\\黄佳乐\\Desktop\\Pictures (1)\\915220_171122043_2.jpg") ;
// 2: 获取它的绝对路径
System.out.println(f1.getAbsolutePath()) ; //因为我上面用的就是绝对路径,所以打印出来的路径和上面一样
//打印内容 ---> C:\Users\黄佳乐\Desktop\Pictures (1)\915220_171122043_2.jpg
// 3: 获取文件定义的时候使用的路径
System.out.println(f1.getPath()); // C:\Users\黄佳乐\Desktop\Pictures (1)\915220_171122043_2.jpg
// 4: 获取文件的名称(带后缀)
System.out.println(f1.getName()); // 915220_171122043_2.jpg
// 5:获取文件的大小(字节个数)
System.out.println(f1.length()); // 157735
// 6: 获取文件的最后修改时间
long time = f1.lastModified() ;
//此时这个时间time并不是我们所熟悉的时间格式,所以在打印出来的时候,我们还需要对时间格式化
System.out.println("格式化后的时间为"+new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(time)) ;
//格式化后的时间为2020/08/27 16:52:16
// 7: 判断该文件路径是否存在
System.out.println(f1.exists()) ; //true
// 8: 删除该文件(delete)
/**这个可不兴乱用啊*/
}
}
三 File常用方法2
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;/**
* File类常用API2:
*
* @author 黄佳乐
*
*/
public class Main{
public static void main(String[] args) throws IOException {
File f1 = new File("D:\\aaa\\date.tax") ;
// 1: 创建一个新文件,成功返回true,否则反之
System.out.println(f1.createNewFile()) ; //true(这个系统怕你出错,所以需要丢出异常)
/**这个表示在文件D盘下的aaa文件下创建一个date.text文件
* 返回为true,这说明date文件创建成功
* 当然了,如果这个文件已经有了,就不创建了
*/
// 2: mkdirs创建多级目录(重点)
File f2 = new File("D:/aaa/bbb/ccc") ;
System.out.println(f2.mkdirs()) ; //true
/**
* 这个表示我在D盘中的aaa文件里面创建了一个bbb文件里面再创建了一个ccc文件的这样一个二级目录(可以更多级)
* 返回为true,表示创建成功
* 另外还有一个mkdir只能创建一级目录,所以一般不用它
*
*/
// 3: delete只能删除空文件夹,不能删除非空文件夹
/**我们在前面将的是delete删除的是文件,而这里是删除文件夹*/
File f3 = new File("D:/aaa") ;
System.out.println(f3.delete()) ; //false
/**
* 这里返回的是false,不能删除,因为我要删除的f3文件是D盘里面的aaa文件,但是aaa文件还有其它东西,所以不能删
*
*/
//重新删一个空的文件夹
File f4 = new File("D:/aaa/bbb/ccc") ; //true
/**
* d盘里面的aaa文件夹里面的bbb文件夹里面的ccc文件夹是我上面创建的,而里面什么都没有,所以可以删
* 返回的是true,删除成功
*/
}
}
四 File类遍历
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;/**
* File类遍历:
*
* @author 黄佳乐
*
*/
public class Main{
public static void main(String[] args) throws IOException {
/**==============遍历方法一===============*/
// 1 :先定位一个你需要遍历目录
File f1 = new File("D:/aaa") ;
// 2: 将aaa文件夹全部转化为数据元素存储在一个数组里面
String [] names = f1.list() ;
//3 ;开始遍历数组
for(String name : names) {
System.out.println(name) ;
}
/**
* 打印内容:
* bbb
date.tax
因为这个只能遍历一级目录,所以虽然bbb文件夹里面还有,但是也遍历不到
*/
/**=================遍历方法二===============*/
// 1 : 获取当前对象目录下的所有“一级文件对象”到一个文件对象数组中去返回(重点)
//先将所有对象文件存在一个文件数组中去
File[] files = f1.listFiles() ;
//然后再遍历这个文件数组
for(File f : files) {
System.out.println(f.getAbsolutePath()) ; //这个得到的是他的一级文件对象的路径
}
System.out.println(Arrays.toString(files)) ; //files数组里面存放的全是路径
//那么我们再看看前面的那个names数组,以此来比较一下这两个的区别
System.out.println(Arrays.toString(names)) ; //这个names数组里面存放的就是文件名称
/** listFiles()的注意事项:
* 1:当调用者不存在时,返回的时null(直接打印File类数组的名称)
* 2:当调用者是一个文件时,返回的是null
* 3:当调用者是一个空文件夹时,返回的是一个长度为0的数组
* 4:当调用者是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回(如上代码)
* 5: 当调用者是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏内容
*
*/
}
}
五 非规律化递归问题:文件搜索
import java.io.File;
/**
* 非规律化递归问题:寻找文件路径。
*
* @author 黄佳乐
*
*/
public class Main{
public static void main(String [] args) {
//将寻找文件的代码专门用一个方法来实现
//传入目录和文件名称(目录是你需要找的文件放在哪个盘里面,文件名称就是你要找的文件的名称)
searchFile(new File("D:/"),"找的文件.exe") ; //目录可以理解为路径,就是new一个File类,在加上路径
}
//寻找文件方法
private static void searchFile(File dir, String fileName) {
// TODO Auto-generated method stub
//1: 判断提供的文件目录是不是一个目录,也有可能别人乱输入的
if(dir != null && dir.isDirectory()) //如果dir不是空字符并且dir是一个目录
{
//满足条件的话就可以开始找了
/**先讲一下寻找的大概思路吧:
*
* 1:我给的目录是D盘,那么我肯定要先遍历D盘目录下的所有一级文件对象,
* 2:然后我就要一一判断所有的以及文件对象哪些是文件,哪些是文件夹,
* 3:如果是文件的话,那么我就要把它和我要找的文件进行比较,看是不是我要找的文件。
* 4:如果它是一个文件夹的话,那么我又要进入这个文件夹里面,和上面一样,继续遍历所有的文件对象,要判断是文件还是文件夹
* 5:当我在讲到上一步的时候,其实就是开始重复上面的操作了,那么我们就可以用递归来解决这个问题了,这也就是本节的主要内容了。
*
*
*/
//既然要遍历,那么肯定要先把目录里面的内容装到数组里才能遍历了
File[] files = dir.listFiles() ;
//判断数组里面是否存在一级文件对象
if(files != null && files.length>0) //如果数组里面有文件对象并且装的不是空字符才可以进行寻找
{
//进行遍历寻找
for(File f : files)
{
//判断当前遍历到的文件对象是文件还是文件夹
if(f.isFile()) //如果遍历到的文件对象是一个文件,那么就要判断它是不是我们要找的文件
{
if(f.getName().contains(fileName)) //这里用了模糊比较contains,只要有相同的内容就找出来,没有用equals是因为用户输入的名称可能会有写偏差,不可能每一字都输入正确
{
System.out.println("找到了文件: "+f.getAbsolutePath()) ;
}
}
else //如果找的不是文件,而是一个文件夹的话,那么又要重复上面的操作,那么直接调用 自身函数就行了,也就是“递归”
{
//现在的文件目录就是当前找到的文件夹路径,而我们需要寻找的文件名称还是不变的
searchFile(f.getAbsoluteFile(),fileName) ;
/**ok!完美的代码在这里就结束了 !!!*/
}
}
}
}
else
{
System.out.println("对不起,您当前搜索的位置不是文件夹!");
}
}
}
六 编码和解码
import java.util.Arrays;
public class Main{
public static void main(String [] args) {
String r = "我爱你中国abc" ; //创建字符串
byte[] rs = r.getBytes() ; //编码:把文字转成字节,因为有很多字节,所有用byte数组来存储他们的字节
System.out.println(rs.length) ; //因为这默认的是UTF-8编码,所有一个中文三个字节,一个英文单词一个字节,所以总共有五个中文和三个英文,也就是13个字节
System.out.println(Arrays.toString(rs)) ; //打印的就是他们的编码,中文开头是负数,所以系统知道往后读三个字节。
//2:解码(把字节转化成对应的中文形式。编码前和编码后的字符集必须一致,也就是你用的UTF-8编码也必须用UTF-8解码)
String st = new String(rs) ; //这个就是解码的方式,默认的字符集就是UTF-8
System.out.println(st) ;//我爱你中国abc
}
}