目录
1. File类
1.1 File对象创建
1.2 File判断和获取方法
1.3 创建和删除方法
1.4 遍历文件夹
2. 字符集
2.1 ASCII字符集
2.2 GBK字符集
2.3 Unicode字符集
2.4 UTF-8
2.5 字符集小结
2.6 编码和解码
3. IO流(字节流)
3.1 IO流概述
3.2 FileInputStream
3.3 FileOutputStream
3.4 FileReader
3.5 FileWriter
3.6 缓冲流
3.7 转换流
3.8 打印流
3.9 其他流
3.10 IO资源释放
3.11 IO框架
3.12 总结
1. File类
1.1 File对象创建
注意:
- 路径中"\"要写成"\\", 路径中"/"可以直接用
- File对象可以指代一个不存在的文件路径
- 路径中带盘符是绝对路径,不带盘符是相对路径
1.2 File判断和获取方法
1.3 创建和删除方法
/**
* 目标:掌握File创建和删除文件相关的方法。
*/
public class FileTest3 {
public static void main(String[] args) throws Exception {
// 1、public boolean createNewFile():创建一个新文件(文件内容为空),
创建成功返回true,反之。
File f1 = new File("D:/resource/itheima2.txt");
System.out.println(f1.createNewFile());
// 2、public boolean mkdir():用于创建文件夹,
注意:只能创建一级文件夹
File f2 = new File("D:/resource/aaa");
System.out.println(f2.mkdir());
// 3、public boolean mkdirs():用于创建文件夹,
注意:可以创建多级文件夹
File f3 = new File("D:/resource/bbb/ccc/ddd/eee/fff/ggg");
System.out.println(f3.mkdirs());
// 3、public boolean delete():删除文件,或者空文件,
注意:不能删除非空文件夹。
System.out.println(f1.delete());
System.out.println(f2.delete());
File f4 = new File("D:/resource");
System.out.println(f4.delete());
}
}
1.4 遍历文件夹
- 当主调是文件时,或者路径不存在时,返回null
- 当主调是空文件夹时,返回一个长度为0的数组
- 当主调是一个有内容的文件夹时,将里面所有一级文件和文件夹路径放在File数组中,并把数组返回
- 当主调是一个文件夹,且里面有隐藏文件时,将里面所有文件和文件夹的路径放在FIle数组中,包含隐藏文件
- 当主调是一个文件夹,但是没有权限访问时,返回null
2. 字符集
2.1 ASCII字符集
2.2 GBK字符集
中国人为了在计算机中存储中文,也编了一个中国人用的字符集叫做GBK字符集,这里面包含2万多个汉字字符,GBK中一个汉字采用两个字节来存储,为了能够显示英文字母,GBK字符集也兼容了ASCII字符集,在GBK字符集中一个字母还是采用一个字节来存储。
需要我们注意汉字和字母的编码特点:
- 如果是存储字母,采用1个字节来存储,一共8位,其中第1位是0
- 如果是存储汉字,采用2个字节来存储,一共16位,其中第1位是1
例如存储 我i你
后续各个国家也有了自己的字符集,这就很混乱。
2.3 Unicode字符集
为了解决各个国家字符集互不兼容的问题,由国际化标准组织牵头,设计了一套全世界通用的字符集,叫做Unicode字符集。在Unicode字符集中包含了世界上所有国家的文字,一个字符采用4个字节存储。
2.4 UTF-8
在Unicode字符集中,采用一个字符4个字节的编码方案,又造成另一个问题:如果是说英语的国家,他们只需要用到26大小写字母,加上一些标点符号就够了,本身一个字节就可以表示完,用4个字节就有点浪费。
于是又对Unicode字符集中的字符进行了重新编码,一共设计了三种编码方案。分别是UTF-32、UTF-16、UTF-8; 其中比较常用的编码方案是UTF-8 。
- UTF-8是一种可变长的编码方案,共分为4个长度区
- 英文字母、数字占1个字节,兼容(ASCII编码)
- 汉字字符占3个字节
- 极少数字符占4个字节
2.5 字符集小结
ASCII字符集:《美国信息交换标准代码》,包含英文字母、数字、标点符号、控制字符
特点:1个字符占1个字节
GBK字符集:中国人自己的字符集,兼容ASCII字符集,还包含2万多个汉字
特点:1个字母占用1个字节;1个汉字占用2个字节
Unicode字符集:包含世界上所有国家的文字,有三种编码方案,最常用的是UTF-8
UTF-8编码方案:英文字母、数字占1个字节兼容(ASCII编码)、汉字字符占3个字节
2.6 编码和解码
就是起翻译作用,代码通过编码成二进制文件,电脑可以读懂。二进制文件解码成代码。
但是得用同一套字符集,不然会乱码。
/**
* 目标:掌握如何使用Java代码完成对字符的编码和解码。
*/
public class Test {
public static void main(String[] args) throws Exception {
// 1、编码
String data = "a我b";
byte[] bytes = data.getBytes(); // 默认是按照平台字符集(UTF-8)进行编码的。
System.out.println(Arrays.toString(bytes));
// 按照指定字符集进行编码。
byte[] bytes1 = data.getBytes("GBK");
System.out.println(Arrays.toString(bytes1));
// 2、解码
String s1 = new String(bytes); // 按照平台默认编码(UTF-8)解码
System.out.println(s1);
String s2 = new String(bytes1, "GBK");
System.out.println(s2);
}
}
3. IO流(字节流)
3.1 IO流概述
File类只能操作文件,却不能操作文件中的内容。
IO流的作用就是对文件或网络中的数据进行读、写操作,输入流(读数据)和输出流(写数据)。
分为两大派系:字节流和字符流。
IO流的体系:
3.2 FileInputStream
读取文件全部字节,但一般不会这么干。
3.3 FileOutputStream
没啥可说的,注意在new FilOutputStream的时候,第二个参数觉得是覆盖写还是追加写。默认false,覆盖。
一个主要方法:void write(byte/bytes)、void write(bytes,0,length)
3.4 FileReader
3.5 FileWriter
注意:FileWrite写完数据必须flush() 才能把数据保存到文件中。
3.6 缓冲流
缓冲流就是对原始流的包装,其实是一个东西。
BufferReader特有方法:String readLine(),读取一行数据,如果没有,返回null。
BuffreWriter特有方法: void newLine(),换行
注意:并不是高级流性能就好。
3.7 转换流
用FileReader读数据时默认只能读取UTF-8编码的数据,不然会乱码。
就可以用 转换流InputStreamReader和OutputStreamWriter。
分析一波InputSteamReader,InputStream时字节流,Reader是字符流,什么意思?就是将字节流转换为字符流,并且可以自定义编码方式。
// 1、得到文件的原始字节流(GBK的字节流形式)
InputStream is = new FileInputStream("io-app2/src/itheima06.txt");
// 2、把原始的字节输入流按照指定的字符集编码转换成字符输入流
Reader isr = new InputStreamReader(is, "GBK");
// 3、把字符输入流包装成缓冲字符输入流
BufferedReader br = new BufferedReader(isr);
OutputStreamWriter用法一样。
3.8 打印流
// 1、创建一个打印流管道
// PrintStream ps =
// new PrintStream("io-app2/src/itheima08.txt", Charset.forName("GBK"));
// PrintStream ps =
// new PrintStream("io-app2/src/itheima08.txt");
PrintWriter ps =
new PrintWriter(new
FileOutputStream("io-app2/src/itheima08.txt", true));
ps.print(97); //文件中显示的就是:97
ps.write(97); //文件中显示a,发现和前面println方法的区别了吗?
以前常用的System.out.println("xxx");Sysytem类里面有一个静态变量out,out就是一个打印流PrintStream,默认打印到控制台。
还可以更改打印位置。
PrintStream ps = new PrintStream("io-app2/src/itheima09.txt");
System.setOut(ps);
System.out.println("烈士暮年");
就是打印到文件中。
3.9 其他流
此外还有数据量和系列化流等。
3.10 IO资源释放
流使用完一定要释放资源。
在JDK17之前释放流需要
try{
//有可能产生异常的代码
}catch(异常类 e){
//处理异常的代码
}finally{
//释放资源的代码
//finally里面的代码有一个特点,不管异常是否发生,finally里面的代码都会执行。
}
这样写出的代码多且乱。
JDK17之后这样写,会自动释放资源。
try(资源对象1; 资源对象2;){
使用资源的代码
}catch(异常类 e){
处理异常的代码
}
//注意:注意到没有,这里没有释放资源的代码。它会自动是否资源
3.11 IO框架
commons-io:由apache开源基金组织提供了一组有关IO流小框架,可以提高IO流的开发效率。
JAR包中工具类举例:
3.12 总结
上面说了这么多类型的流, 现实中要用到的时候大多用BufferReader和BufferWriter,构造方法里面要有低级流。文章来源:https://www.toymoban.com/news/detail-697473.html
要指定字符集时可以用转换流。文章来源地址https://www.toymoban.com/news/detail-697473.html
到了这里,关于Java File类和IO流的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!