java基础总结
day18 IO流01 File类 字符编码 IO流操作(四大基流,字节流,字符流)
File类
- File课理解为文件和文件夹(目录),用于表示磁盘中某个文件或文件夹的路径。该类包含了文件的创建、删除、重命名、判断是否存在等方法。
- Windows: 默认情况下是不区分大小写的,使用”\”来分割目录路径。但是在Java中一个”\”表示转义,所以在Windows系统中就得使用两个”\\”。
操作File常见方法:
-
String getName():获取文件名称
-
String getPath():获取文件路径
-
String getAbsolutePath():获取绝对路径
-
File getParentFile():获取上级目录文件
-
boolean exists():判断文件是否存在
-
boolean isFile() :是否是文件
-
boolean isDirectory():判断是否是目录
-
boolean delete() :删除文件
-
boolean mkdirs():创建当前目录和上级目录
-
File[] listFiles() :列出所有文件对象
字符编码
发展:
ASCII编码表(英文符号有限)
-> GB2312编码表(使用两个字节一起来表示一个汉字)
-> Unicode是国际统一编码(某一个字符在全世界任何地方都是固定的)
常见的字符集
-
ASCII:占一个字节,只能包含128个符号。不能表示汉字。
-
ISO-8859-1:也称之为latin-1,占一个字节,收录西欧语言,不能表示汉字。
-
GB2312/GBK/GB18030:占两个字节,支持中文。
-
ANSI:占两个字节,在简体中文的操作系统中ANSI 就指的是 GBK。
-
UTF-8:是一种针对Unicode的可变长度字符编码,是Unicode的实现方式之一,支持中文。在开发中建议使用。
-
UTF-8 BOM:是微软搞出来的一种编码,不要使用。
存储字母、数字、汉字:
存储字母和数字无论是什么字符集都占1个字节.
存储汉字,GBK家族占两个字节,UTF-8家族占3个字节。
不能使用单字节的字符集(ASCII、ISO-8859-1)来存储中文,否则会乱码。
解码与编码:
注意:一定要保证编码和解码的字符相同,才能正确解码出信息。
经典案例:在表单中填写中文,为什么在服务端看到的是乱码问题。
情景分析,比如浏览器使用UTF-8编码,服务器使用ISO-8859-1编码。
此时编码和解码的字符类型不同,那么乱码就出现了。
先来分析乱码产生的原因:
//编码解码龙哥
//模拟国外服务器用的编码,没有收购中文,导致乱码
String str = "龙哥";
//先解码为二进制
byte[] bytes = str.getBytes("UTF-8");
System.out.println(Arrays.toString(bytes));
//在将二进制转为文字
String s = new String(bytes, "ISO-8859-1");
System.out.println(s);
//解决问题
//将国外浏览器解码后的文字,通过编码转为二进制,在通过utf-8解码成中文
System.out.println("========");
//将文字转为二进制
byte[] bytes1 = s.getBytes("ISO-8859-1");
String s1 = new String(bytes1, "UTF-8");
System.out.println(Arrays.toString(bytes1));
System.out.println(s1);
字节流的IO操作
流向 | 字节流(单位是字节) | 字符流(单位是字符) |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
字节输入流FileInputStream,用于读取文件 字节输入流(程序) –-读取数据---- 文件
字节输出流FileOutputStream,用于写文件 字节输出流 (程序) ----写入信息 ----- 文件
需求:使用文件字节输入流进行输出操作
//作业目的:掌握输出操作
//文件源
File file = new File("src\\IO流01\\第四题\\a.txt");
//拿到文件--》数据,将数据进行输入到程序中,输入流
//管道
//将文件源里输入到程序里,通过管道文件输入流
InputStream inputStream = new FileInputStream(file);
System.out.println((char) inputStream.read());
byte[] buffer = new byte[10]; //每次十个字节
int read = inputStream.read(buffer);
System.out.println(read);
System.out.println(Arrays.toString(buffer));
System.out.println(new String(buffer));
需求:使用文件字节输入流进行输入操作
/* 作业目的:掌握输入操作*/
//文件源
File file = new File("src\\IO流01\\第四题\\a.txt");
//管道
//输出操作,将程序里的数据写入文件源,通过管道
FileOutputStream fileOutputStream = new FileOutputStream(file);
byte[] bytes = new byte[]{97,96};
fileOutputStream.write(65);
fileOutputStream.write(bytes);
String str = "你好啊";
fileOutputStream.write(str.getBytes());
fileOutputStream.close();
字符流的IO操作
字符输入流Reader,用于读取文件 字节输入流(程序) –-读取数据---- 文件
字符输出流Writer,用于写文件 字节输出流 (程序) ----写入信息 ----- 文件
需求:演示字符文件输入流(FileReader)-输入操作
/*作业目的:掌握字符文件输入流(FileReader)-输入操作*/
//演示字符文件输入流
//拿到源头
File file = new File("src\\IO流01\\第四题\\a.txt");
//通过源头获取通道
FileReader fileReader = new FileReader(file);
char[] chars = new char[5];
int len = fileReader.read(chars);
System.out.println(len);
System.out.println(Arrays.toString(chars));
int len2 = fileReader.read(chars);
System.out.println(len);
System.out.println(new String(chars,0,1));
fileReader.close();
需求:演示字符文件输出流(FileWriter)-输出操作
//作业目的:掌握字符文件输出流(FileWriter)-输出操作
File file = new File("src\\IO流01\\第四题\\a.txt");
FileWriter fileWriter = new FileWriter(file);
fileWriter.write(97);
fileWriter.write("牛逼");
fileWriter.write(new char[]{'l','e'});
fileWriter.close();
重点注意:
- 读取字符或者字符的时候的时候,拿到容器里面的东西
- 字节数组或者字符数组,为容器,可以用来被读取,也可以拿取数据
- byte[] b =new byte[1024], new String(b,0,len) ,len是每次读取长度
- char[] c =new char[1024],new String(c,0,len),len是每次读取长度