一、现在存在的问题
思路:
二、File类
1、创建File对象
绝对路径和相对路径
可以创建文件或文件夹
public static void main(String[] args) {
//1、创建File对象(指定了文件的路径)
//路径写法:C:\Users\wujianrenn\Desktop\周杰伦\052de5feb53988cc2d5ecfefdc3efaf7.jpg
// C:/Users/wujianrenn/Desktop/周杰伦/052de5feb53988cc2d5ecfefdc3efaf7.jpg
File f= new File("C:\\Users\\wujianrenn\\Desktop\\周杰伦\\052de5feb53988cc2d5ecfefdc3efaf7.jpg");//95171
// 第一个杠是告诉第二个杠,你就是个杠
long size = f.length();//是文件的字节大小
System.out.println(size);
//2、File创建对象,支持绝对路径,支持相对路径(重点)
File f1 = new File("C:\\Users\\wujianrenn\\Desktop\\周杰伦\\052de5feb53988cc2d5ecfefdc3efaf7.jpg");//绝对路径
System.out.println(f1.length());
//相对路径:一般定位模块中的文档的。。。相对到工程下!!!
File f2 = new File("file-io-app/src/data.txt");
System.out.println(f2.length());
//3、File创建对象,可以是文件也可以是文件夹
File f3 = new File("C:\\Users\\wujianrenn\\Desktop\\周杰伦");
System.out.println(f3.exists());//判断这个路径是否存在,这个文件夹是否存在
}
NOTE:“/” 和“\\”的作用一样的
2、File类的常用API
(1)判断文件类型,获取文件信息
目标:File类的获取功能API
* -public String getAbsolutePath() : 返回此File的绝对路径名字符串
* -public String getPath() : 获取创建文件对象的时候用的路径
* -public String getName() : 返回由此File表示的文件或目录的名称
* -public long length() : 返回由此File表示的文件的长度
public static void main(String[] args) {
//1、绝对路径创造一个文件对象
File f1 = new File("C:\\Users\\wujianrenn\\Desktop\\周杰伦\\052de5feb53988cc2d5ecfefdc3efaf7.jpg");
//2、获取它的绝对路径
System.out.println(f1.getAbsolutePath());
//3、获取文件定义的时候使用的路径
System.out.println(f1.getPath());
//4、获取文件的名称,带后缀
System.out.println(f1.getName());//052de5feb53988cc2d5ecfefdc3efaf7.jpg
//5、获取文件的大小,字节个数
System.out.println(f1.length());//95171
//6、获取文件的最后修改时间
long time = f1.lastModified();
System.out.println("最后修改时间:" + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(time));
//最后修改时间:2021/10/10 22:45:31
//7、判断文件是文件类型的还是文件夹()
System.out.println(f1.isFile());//true
System.out.println(f1.isDirectory());//false 文件夹
System.out.println(f1.isAbsolute());//true
File file = new File("D/");
System.out.println(file.isFile());
System.out.println(file.isDirectory());
File file1 = new File("D:/aaa");
System.out.println(file1.isFile()); // false
System.out.println(file1.isDirectory()); // false
System.out.println(file1.exists()); // false
System.out.println("-------------------------");
File f2 = new File("file-io-app\\src\\data.txt");
// a.获取它的绝对路径。
System.out.println(f2.getAbsolutePath());
// b.获取文件定义的时候使用的路径。
System.out.println(f2.getPath());
// c.获取文件的名称:带后缀。
System.out.println(f2.getName());
// d.获取文件的大小:字节个数。
System.out.println(f2.length()); // 字节大小
// e.获取文件的最后修改时间
long time1 = f2.lastModified();
System.out.println("最后修改时间:" + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(time1));
// f、判断文件是文件还是文件夹
System.out.println(f2.isFile()); // true
System.out.println(f2.isDirectory()); // false
System.out.println(f2.exists()); // true
File file3 = new File("D:/");
System.out.println(file3.isFile()); // false
System.out.println(file3.isDirectory()); // true
System.out.println(file3.exists()); // true
File file4 = new File("D:/aaa");
System.out.println(file4.isFile()); // false
System.out.println(file4.isDirectory()); // false
System.out.println(file4.exists()); // false
}
(2)创建文件。删除文件功能
* 目标:File文件的创建和删除的方法
* - public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,
* 创建一个新的空文件。 (几乎不用的,因为以后文件都是自动创建的!)
* - public boolean delete() : 删除由此File表示的文件或目录。 (只能删除空目录)
* - public boolean mkdir() : 创建由此File表示的目录。(只能创建一级目录)
* - public boolean mkdirs() : 可以创建多级目录(建议使用的)
先创建文件对象,再创建文件夹
public static void main(String[] args) {
File f1 = new File("src\\data.txt");
//a.创建新文件,创建成功返回true ,反之 ,不需要这个,以后文件写出去的时候都会自动创建
try {
System.out.println(f1.createNewFile());//false(因为data文件本身就存在,所以创建失败)
// false
} catch (IOException e) {
e.printStackTrace();
}
File f2 = new File("src\\data02.txt");
try {
System.out.println(f2.createNewFile());
} catch (IOException e) {
e.printStackTrace();
}
//b.mkdir 创建一级目录
File f3 = new File("D:/CAD/aaa");
System.out.println(f3.mkdir());//true
//c.mkdir 创建多级目录(重点)
File f4 = new File("D:/CAD/bbb/ccc/ddd");
System.out.println(f4.mkdirs());
//d.删除文件或者空文件夹
System.out.println(f1.delete());
File f5 = new File("C:\\Users\\wujianrenn\\Desktop.jpg");
System.out.println(f5.delete());//占用(处在打开的状态)一样可以删除
//e.只能删除空文件夹,不能删除非空文件夹
File f6 = new File("D:/CAD/aaa");
System.out.println(f6.delete());
}
(3)遍历文件夹
* 目标:File针对目录的遍历
* - public String[] list(): * 获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回。
* - public File[] listFiles()(常用):
* 获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回(重点)(是对象)
public static void main(String[] args) {
//1、定位一个一级目录
File f1 = new File("D:/soft");
String[] names = f1.list();
for (String name : names) {
System.out.println(name);
}
//.idea
System.out.println("---------------------");
//2、一级文件对象
//获取当前目录下所有的“一级文件对象”到一个文件对象数组中去返回(重点)
File[] files = f1.listFiles();
for (File file : files) {
System.out.println(file);//默认取绝对路径
}
//D:\soft\.idea
System.out.println("---------------------------");
//注意事项 listFiles只能用于一级文件目录
File dir = new File("D:/aaaa");
File[] files1 = dir.listFiles();
System.out.println(files1);//null
//当调用者不存在时,返回null
File dir1 = new File("C:\\\\Users\\\\wujianrenn\\\\Desktop\\\\周杰伦\\\\052de5feb53988cc2d5ecfefdc3efaf7.jpg\"");
File[] files2 = dir1.listFiles();
System.out.println(files2);//null
//当调用者是一个文件时,返回null
File dir2 = new File("D:/CAD/aab");
File[] files3 = dir2.listFiles();
System.out.println(files3);//[java.io.File;@4b1210ee
System.out.println(Arrays.toString(files3));//[]
//当调用者是一个空文件夹时,返回长度为0的数组
}
三、练习题
需求:统计一个文件夹中每种文件的个数并打印。
* 打印格式如下:
* txt:3个
* doc:4个
* jpg:6个
* 分析:需要进行遍历,判断文件的类型,模糊定位
//定位目录
File f1 = new File("C:\\Users\\wujianrenn\\Desktop\\周杰伦");
String[] names = f1.list();
int a = 0;
int b = 0;
int c = 0;
for (String name : names) {
if(name.contains("jpg")){
a++;
}
if(name.contains("jfif")){
b++;
}
if(name.contains("png")){
c++;
}
}
System.out.println("jpg = " + a);
System.out.println("jfif = " + b);
System.out.println("png = " + c);
/**
*jpg = 12
* jfif = 20
* png = 4
*/
}
四、字符集
1、基础知识
计算机底层不可以直接存储字符的。计算机中底层只能存储二进制(0、1)
二进制是可以转换成十进制的
结论:计算机底层可以表示十进制编号。计算机可以给人类字符进行编号存储,这套编号规则就是字符集。
ASCII字符集:
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码):包括了数字、英文、符号。
ASCII使用1个字节存储一个字符,一个字节是8位,总共可以表示128个字符信息,对于英文,数字来说是够用的。
GBK:
window系统默认的码表。兼容ASCII码表,也包含了几万个汉字,并支持繁体汉字以及部分日韩文字。
注意:GBK是中国的码表,一个中文以两个字节的形式存储。但不包含世界上所有国家的文字
Unicode码表:
unicode(又称统一码、万国码、单一码)是计算机科学领域里的一项业界字符编码标准。
容纳世界上大多数国家的所有常见文字和符号。
由于Unicode会先通过UTF-8,UTF-16,以及 UTF-32的编码成二进制后再存储到计算机,其中最为常见的就是UTF-8。
注意 :
Unicode是万国码,以UTF-8编码后一个中文一般以三个字节的形式存储。
UTF-8也要兼容ASCII编码表。
技术人员都应该使用UTF-8的字符集编码。
编码前和编码后的字符集需要一致,否则会出现中文乱码。
2、字符集的编码解码操作
public static void main(String[] args) throws UnsupportedEncodingException {
//1、编码:把文字转换成字节(使用指定的编码)(默认的)
String name = "abc我爱你中国";//中文以负数的形式存在 [97, 98, 99, -26, -120, -111, -25, -120, -79, -28, -67, -96, -28, -72, -83, -27, -101, -67]
byte[] bytes = name.getBytes();//默认编码(UTF-8),以字符集的形式
System.out.println(bytes.length);
System.out.println(Arrays.toString(bytes));
//2、解码:把字节转换成对应的中文形式(编码前的形式必须与编码的形式一致,否则会出问题的,崩溃,乱码)
String rs = new String(bytes);//默认的UTF-8形式
System.out.println(rs);//abc我爱你中国
byte[] bytes1 = name.getBytes("GBK");
String rs1 = new String(bytes1);//默认的UTF-8形式
System.out.println(rs1);//abc�Ұ����й�
// 崩了,因为此刻是改过的GBK编码(中文字符占2个字节大小)
// 而默认的编码形式是UTF-8(中文字符占3个字节大小)
}