1.1 文件路径
文件路径分为两种:
1、绝对路径:以C:、D:等盘符开头的,就是我们所说的绝对路径,根据它可以直接找到文件的具体位置。
2、相对路径:需要先指定一个目录作为基准目录,从基准目录出发,看看按照什么样的路径寻找能找到指定文件,这就是相对路径;相对路径通常是以.(当前目录)或者..(当前目录的上级目录)开头的。
1.2 文件类型
常见的文件类型分为两种:
1、文本文件:文件中保存的内容都是字符串,保存的都是合法的内容,简单来说就是打开之后我们能看懂,不是乱码。
2、二进制文件:文件中保存的内容是二进制数据,不要求保存合法的内容,打开文件之后看到一堆乱码就是这种情况。
1.3 文件操作
在Java中,通常通过java.io.file来描述一个文件。
文件的构造方法通常为:File(String pathname)
对文件操作的方法通常有以下几种:
File file = new File("d://text.txt");//构造文件,参数为文件的路径 System.out.println(file.getParent());//返回该文件的父目录文件路径 System.out.println(file.getName());//返回该文件的纯文件名称 System.out.println(file.getPath());//返回该文件的路径 System.out.println(file.getAbsolutePath());//返回该文件的绝对路径 System.out.println(file.getCanonicalPath());//返回修饰过的绝对路径
File f = new File("d:/text.txt"); System.out.println(f.exists());//判断文件是否存在 System.out.println(f.isDirectory());//判断文件是否是一个目录 System.out.println(f.isFile());//判断文件是否为一个普通文件 System.out.println(f.createNewFile());//如果文件不存在,则创建一个新的文件 System.out.println(f.exists()); System.out.println(f.delete());//删除文件 System.out.println(f.exists());
1.4 文件内容的读写
对于文件内容的读写分为字节流和字符流两种类型,下面我们进行分别介绍。
1.4.1 字符流
1、reader(读文件)
2、writer(写文件)
File file = new File("d:/test.txt"); System.out.println(file.exists()); Writer writer = new FileWriter("d:/test.txt");//构造一个写文件对象 writer.write("我在学习文件io");//向文件中写内容 writer.close();//关闭文件 Reader reader = new FileReader("d:/test.txt");//构造一个读文件对象 while(true){//设置循环的目的是因为文件的内容很多,得读很多次,直到读完 int a = reader.read();//read方法返回的是一个int类型的数据 if(a == -1){//当数字的值为-1时,代表文件已经读完,直接结束循环 break; } else{ char c = (char)a;//将整型强制转换为字符型 System.out.println(c);//输出字符 } } reader.close();//关闭文件 Reader reader1 = new FileReader("d:/test.txt"); char[] cbuf = new char[1024];//构造一个字符数组用来存储读出的内容 int n = reader1.read(cbuf);//设置参数,此时每次读都会读一个数组的大小,返回内容字符数 for (int i = 0;i < n;i++){ System.out.print(cbuf[i]);//输出数组中的内容 } reader1.close();//关闭文件
注意:一定要记得关闭文件,否则会使文件资源泄露,类似于内存资源泄露,时间长了可能会出现意想不到的错误!!!
1.4.2 字节流
1、InputStream(读文件)
2、OutputStream(写文件)
File file = new File("d:/test.txt"); System.out.println(file.exists()); InputStream inputStream = new FileInputStream("d:/test.txt");//构造输入字符流对象 while(true){//类似字符流读方法,不断循环读取数据 int a = inputStream.read(); if(a == -1){ break; } else{ char c = (char)a; System.out.println(c); } } Scanner scanner = new Scanner(inputStream,"UTF-8")//读出特定格式的数据 while(scanner.hasNext()){ String s = scanner.next(); System.out.println(s); } inputStream.close();
File file = new File("d:/test.txt"); OutputStream outputStream = new FileOutputStream("d:/test.txt"); outputStream.write('H'); outputStream.write('e'); outputStream.write('l'); outputStream.write('l'); outputStream.write('o'); outputStream.flush();//此处要对缓冲区进行刷新,将缓冲区中的数据立即写入到硬盘中 outputStream.close();
1.5 小工具demo
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入要扫描的根目录"); String rootDirpath = scanner.next(); File file = new File(rootDirpath); if(!file.isDirectory()){ System.out.println("您输入的目录不存在或者不是目录,退出"); return; } System.out.println("请输入要找出的文件名中包含的字符"); String token = scanner.next(); scanDir(file,token); } private static void scanDir(File file, String token) { File[] files = file.listFiles(); if(files == null){ return; } for(File f : files){ System.out.println("当前扫描的文件" + f.getAbsolutePath()); if(f.isFile()){ checkDelete(f,token); } else{ scanDir(f,token); } } } private static void checkDelete(File f, String token) { if(!f.getName().contains(token)){ return; } System.out.println("当前文件为" + f.getAbsolutePath() + "请确认是否要删除(y/n)"); Scanner scanner = new Scanner(System.in); String choice = scanner.next(); if(choice.equals("Y") || choice.equals("y")){ f.delete(); System.out.println("删除完毕"); } else{ System.out.println("取消删除"); }