一、文件操作(遍历文件)
import java.io.File;
public class Demo {
public static void main(String[] args) {
File d = new File("d:\\");
File[] files = d.listFiles();//获得d盘下所有第一层的文件
listFiles(files);
System.out.println("找不到avi文件");
}
public static void listFiles(File[] files) {
if (files != null && files.length > 0) {
for (File file:files) {
if (file.isFile()) {
if (file.getName().endsWith(".avi")) {
//找到一个以.avi结尾的文件
if (file.length() > 100 * 1024 * 1024) {//大于一百兆的文件
System.out.println("找到了一个avi文件");
file.delete();
System.out.println(file.getAbsolutePath() + "已删除");
}
}
} else {//是文件夹
File[] files2 = file.listFiles();//递归子文件夹
listFiles(files2);//子文件里面的文件
}
}
}
}
}
二、文件过滤器
- FileFilter
public class Demo {
public static void main(String[] args) {
File d = new File("d:\\");
listFiles(d);
System.out.println("找不到avi文件");
}
public static void listFiles(File file) {
//1、创建一个过滤器 并描述规则
FileFilter filter = new AVIFileFilter();
//2、 通过文获取子文件
File[] files = file.listFiles(filter);
if (files != null && files.length >= 0) {
for (File f:files) {
if (f.isDirectory()) {
listFiles(f);
} else {
System.out.println("发现一个txt文件" + f.getAbsolutePath());
}
}
}
}
static class AVIFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
if (pathname.getName().endsWith(".txt") || pathname.isDirectory())
return true;
return false;
}
}
}
三、相对路径和绝对路径
public class Demo {
//相对路径和绝对路径
//绝对路径:从盘符开始,是一个完整的路径,例如: C://a.txt
//相对路径: 在Java中相当于项目的目录路径,这是一个不完整的路径,在Java开发中很常用
public static void main(String[] args) {
File file1 = new File("C://a.txt");
File file2 = new File("a.txt");
System.out.println("file1的路径:" + file1.getAbsolutePath());
System.out.println("file2的路径:" + file2.getAbsolutePath());
}
}
四、流的分类
1.流的方向分类:
- input输入流
- output输出流
2、流的类型:字节流和字符流
-
字节流(操作中文时会出现乱码,除了读取中文的时候,我们都应该使用字节流)
–输入流: InputStream(顶级父类)
-
把硬盘里面的文件输入到内存中
-
FileInputStream fis = new FileInputStream("c://a.txt"); /*while(true) {//读取一个字符 byte b = (byte) fis.read(); if(b == -1) break; System.out.println((char)b); }*/ byte[] bytes = new byte[10]; fis.read(bytes); System.out.println(new String(bytes)); fis.read(bytes); System.out.println(new String(bytes)); fis.read(bytes); System.out.println(new String(bytes)); fis.close(); /** 文件内容: AjhtBgdsgCDEFkjAdawdBCjgDE AjhtBgdsgC //第一次读取10个字节 DEFkjAdawd //第二次读取10个字节 BCjgDEdawd //第三次读取的时候只剩下BCjgDE,这6个字母会覆盖在第二次的前六个字母,所以第三次的后四个字母和前面的一次一样的 **/ //----------------解决方案-----------------------------------// int len = fis.read(bytes); System.out.println(new String(bytes, 0, len)); //-------------------------------循环读取------------------------// byte[] bytes = new byte[10];//后面的学习中,数组一般开1024的大小 int len = fis.read(bytes); while(len != -1) { System.out.println(new String(bytes, 0, len)); len =fis.read(bytes); } fis.close();
–输出流: OutputStream
-
FileOutputStream的使用
public class InOutPutDemo { /** * 一切皆字节 * 计算机中的任何数据(文本、图片、视频、音乐)都是按照二进制形式存储的 * 数据传输的时候也是按照二进制的形式的 * 任何流都是二进制 * @param args */ public static void main(String[] args) throws IOException { FileOutputStream fos = new FileOutputStream("d://a.txt",true);//不要true就是不追加的写 // byte[] bytes = {65, 66, 67, 68}; byte[] bytes = "ABCDEF".getBytes(); fos.write(bytes); byte[] bytes1 = "lkjhgg".getBytes(); fos.write(bytes1, 1,2);//从1下标开始写入两个人内容 fos.close(); System.out.println("已经写出"); } }
-
-
字符流(读取文字的时候使用字符流)
–输入流: Reader
-
public static void main(String[] args) throws IOException { FileReader fr = new FileReader("b.txt"); /*一次读一个字符 int c = fr.read(); System.out.println((char) c); c = fr.read(); System.out.println((char) c); fr.close();*/ /*循环实现 while(true) { int c = fr.read(); if (c == -1) break; System.out.print((char)c); }*/ //读一组数据 char[] chars = new char[100]; int len = fr.read(chars); String text = new String(chars, 0, len); System.out.println(text); System.out.println(len); fr.close(); }
–输出流: Writer(字符输出流需要刷新)
-
FileWriter fw = new FileWriter("c://b.txt"); fw.write('a');//字符 fw.write("锄禾日当午,汗滴禾下土"); fw.write("床前明月光,疑是地上霜"); fw.write("\n"); FileWriter fw2 = (FileWriter) fw.append("你好啊");//设置追加 //调用append方法会返回一个对象,和之前的对象一样 fw.append("\n"); fw2.append("合肥市WiFi回家");//相当于fw.append("你好啊").append(); System.out.println("写入成功"); fw.flush();//需要刷新,否则会存在缓冲区中,不会写入到文件中 fw.close(); System.out.println(fw == fw2);//两个对象一样的
-
3、转换流
–输入流的转换
-
public class changDEmo { //转换流 //字节流 “装饰” 为字符流 :使用了装饰者模式 public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("c://a.txt"); //将字节转换为字符输入流 //参数1: 要转换字节流 //参数2: 指定编码名称 InputStreamReader isr = new InputStreamReader(fis,"UTF-8"); while(true) { int c = isr.read(); if (c == -1) break; System.out.print((char)c); } } }
–输出流的转换
-
FileOutputStream fos = new FileOutputStream("c://a.txt"); OutputStreamWriter osw = new OutputStreamWriter(fos); osw.write("床前明月光"); osw.flush();//输出流记得刷新 osw.close();
4、打印流(Print)和缓存读取流(BufferedReader)
- 打印流
//字符输出,打印流
/*字节打印流
PrintStream ps = new PrintStream("c://c.txt");
ps.println("客户交付未可厚非");
ps.close();*/
/* 字符打印流
PrintWriter pw = new PrintWriter("c://c.txt");
pw.println("你说的话突然");
pw.flush();
pw.close();
}*/
//转换流
FileOutputStream fos = new FileOutputStream("c://c.txt");
PrintWriter pw = new PrintWriter(fos);
pw.println("锄禾日当午,汗滴禾下土");
pw.println("锄禾日当午,汗滴禾下土");
pw.println("锄禾日当午,汗滴禾下土");
pw.flush();
pw.close();
- 缓存读取流
//缓存读取流,将字符输入流转换为带有缓存,可以一次读取一行的缓存读取字符流
FileReader fr = new FileReader("c://c.txt");//字符输入流
BufferedReader br = new BufferedReader(fr);//转换为缓存读取流
String line = null;//没有内容的话返回null
while((line = br.readLine()) != null) {//String line = br.readLine();如果没有内容了会返回结果null
System.out.println(line);
}
五、收集异常日志(控制台的报错打印到文件中去)
public class demo {
public static void main(String[] args) throws IOException {
try {
String s = null;
System.out.println(s.toString());
}catch (Exception e) {
FileWriter fw = new FileWriter("c://buf.txt", true);//字符输出流设置追加模式
BufferedWriter bw = new BufferedWriter(fw);//字符输出流转化为缓存输出流
PrintWriter pw = new PrintWriter(bw);//Print Writer无法直接设置追加模式,需要转化
SimpleDateFormat simpleFormatter = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");//设置时间格式
pw.println("Error" + " " +simpleFormatter.format(new Date()));//获取当前时间
e.printStackTrace(pw);
pw.flush();
pw.close();
}
}
}