一、File、IO流
File是java.io.包下的类,file类的对象,用于代表当前操作系统的文件(可以代表文件、文件夹),使用File可以操作文件及文件夹。
注意:File只能对文件本身进行操作,不能读写文件里的数据。
IO流是用于读写数据的。(读写文件、网络中的数据)
1.1认识File类
//目标:创建File对象代表文件(文件/目录),获取文件,目录信息
public class FileDemo1 {
public static void main(String[] args) throws IOException {
//1.创建file对象,去代表某个文件
File f1 = new File("D:\\JavaCode\\JavaLearnDay01\\day11_FileAnd_IO\\1.png");
System.out.println(f1.length()); // 获取字节个数
System.out.println(f1.getAbsolutePath());
//2.可以使用相对路径定位文件对象:只要带盘符的都是绝对路径
//相对路径:不带盘符,默认是在idea工程下去找文件
File f2 = new File("day11_FileAnd_IO\\src\\kfc.txt");
System.out.println(f2.length());
//File也可以新建文件
File f3 = new File("D:\\JavaCode\\JavaLearnDay01\\day11_FileAnd_IO\\2.txt");
System.out.println(f3.exists());//判断文件是否存在
System.out.println(f3.createNewFile());//把这个文件创建出来
//File新建文件夹 只能创建一级文件夹
File f4 = new File("day11_FileAnd_IO\\src\\kkk");
System.out.println(f4.mkdir());//mkdirs可以创建多级文件
//创建对象代表存在的文件,然后删除它
File f5 = new File("D:\\JavaCode\\JavaLearnDay01\\day11_FileAnd_IO\\1.txt");
System.out.println(f5.delete());
//获取某个目录下全部一级文件名称
File f6 = new File("D:\\JavaCode\\JavaLearnDay01");
String[] names = f6.list();
// for (String name : names) {
// System.out.println(name);
// }
File[] files = f6.listFiles();
for(File file : files) {
System.out.println(file.getName());
}
}
}
1.2 方法递归、文件搜索
import java.io.File;
//需求,想找到d盘里有没有kfc.txt
//使用递归搜索
public class FileDemo2 {
public static void main(String[] args) {
File f = new File("D://JavaCode");
search(f, "kfc.txt");
}
public static void search(File dir, String name) {
//1。判断极端情况
if (dir == null || !dir.exists() || !dir.isDirectory()) {
return;
}
//2.获取该目录下所有的一级文件或文件夹对象
File[] files = dir.listFiles();
//3.判断当前目录下是否存在一级文件对象,存在才能继续遍历
if (files != null && files.length > 0) {
for (File file : files) {//开始遍历
if (file.isFile()) {//遍历到文件了,判断是否是kfc.txt
if (file.getName().equals(name)) {
System.out.println("找到目标文件" + file.getAbsolutePath());
}
}else{
search(file, name);//不是文件,则继续遍历
}
}
}
}
}
二、字符集
学习IO流读写数据的前置知识,了解数据在底层是如何存储的
2.1字符集的编码,解码操作
import java.io.IOException;
import java.util.Arrays;
//写程序实现字符的编码与解码
public class CharSet1 {
public static void main(String[] args) throws IOException {
//1.编码
String name = "疯狂星期四KFCvivo50!";
byte[] bytes = name.getBytes("GBK"); //指定字符集,java默认是utf-8
System.out.println(Arrays.toString(bytes));
System.out.println(bytes.length);
//2.解码
String decode = new String(bytes, "GBK");
System.out.println(decode);
}
}
三、IO流
3.1认识IO流
I指的是input,负责把数据从内存(程序)输入到磁盘、网络中去,O则相反,指的是把数据数出来。
四大金刚本身是抽象类,要使用他们的实现类来做功能
3.2文件字节输入流
作用:把磁盘文件中的数据,以字节的形式读入到内存中去。
//目标:读取字节数据
public class FileInputStream1 {
public static void main(String[] args) throws IOException {
//1.创建文件字节输入流管道,与文件接通
InputStream irs = new FileInputStream("day11_FileAnd_IO\\2.txt");
//2.读取文件中的字节并输出:每次读取一个字节
//定义一个变量来记住每次读取的一个字节
// int b ;
// while((b = irs.read()) != -1){
// System.out.println((char)b);
// }
//每次只读取一个字节的问题:性能较差,并且读取汉字输出一定会乱码
//3.定义一个字节数组,用于每次读取字节,
// byte[] buffer = new byte[2]; // 代表每次读几个字节
// //定义一个变量,用来记住每次读了多少个字节
// int len;
// while ((len = irs.read(buffer)) != -1) {
// //把读取的字节转换成字符串输出
// String s = new String(buffer,0,len);//读取多少,输出多少,0表示从第一个位置开始,len代表倒多少个
// System.out.println(s);
//
// }
// //每次读取多个字节,可以提升性能,但依然无法避免读取汉字输出乱码的问题。存在截断汉字字节的可能性
//java提供了一次性读完全部字节的方法:public byte[] readAllBytes(),可以直接把文件的全部字节读取到一个数组中返回
byte[] all = irs.readAllBytes();
String s2 = new String(all);
System.out.println(s2);
}
}
3.3文件字节输出流
//目标:学会文件字节输出流
public class FileOutputStream01 {
public static void main(String[] args) throws IOException {
//1.创建文件字节输出流管道与目标文件接通
OutputStream os = new FileOutputStream("day11_FileAnd_IO\\out.txt");
//2.写入字节
os.write(97);
os.write("\r\n".getBytes());//换行,这是固定搭配
os.write('a');
// os.write('我'); 会乱码
byte[] bytes= {97,96,98};
os.write(bytes); // 写入一个字节数组
os.close();//用完之后,要关闭
}
}