File类:
import java.io.File; public class FileDemo { /** * @param args */ public static void main(String[] args) { // constructorDemo(); } public static void constructorDemo() { //可以将一个已存在的,或者不存在的文件或者目录封装成file对象。 File f1 = new File("c:\\a.txt"); File f2 = new File("c:\\","a.txt"); File f = new File("c:\\"); File f3 = new File(f,"a.txt"); File f4 = new File("c:"+File.separator+"abc"+File.separator+"a.txt");
路径分隔符:
名称分隔符:
System.out.println(f4); } }
===========================================================================
import java.io.File; import java.io.IOException; import java.text.DateFormat; import java.util.Date; public class FileMethodDemo { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { /* * File对象的常见方法。 * * 1,获取。 * 1.1 获取文件名称。 * 1.2 获取文件路径。 * 1.3 获取文件大小。 * 1.4 获取文件修改时间。 * * 2,创建与删除。 * * 3,判断。 * * 4, 重命名 * */ // getDemo(); // createAndDeleteDemo(); // isDemo(); // renameToDemo(); // listRootsDemo(); } public static void listRootsDemo() { File file = new File("d:\\"); System.out.println("getFreeSpace:"+file.getFreeSpace()); System.out.println("getTotalSpace:"+file.getTotalSpace()); System.out.println("getUsableSpace:"+file.getUsableSpace()); // File[] files = File.listRoots(); // for(File file : files){ // System.out.println(file); // } } public static void renameToDemo() { File f1 = new File("c:\\9.mp3"); File f2 = new File("d:\\aa.mp3"); boolean b = f1.renameTo(f2); System.out.println("b="+b); } public static void isDemo() throws IOException{ File f = new File("aaa"); // f.mkdir(); f.createNewFile(); // boolean b = f.exists(); // System.out.println("b="+b); // 最好先判断是否存在。 因为文件未知的情况下,判断是文件不,不是,判断是目录不,不是。
创建目录:
创建文件名,不一定带扩展名
System.out.println(f.isFile()); System.out.println(f.isDirectory()); } =========================================================================
创建与删除方法。
创建目录方法:
创建文件的方法:
public static void createAndDeleteDemo() throws IOException { File dir = new File("abc\\q\\e\\c\\z\\r\\w\\y\\f\\e\\g\\s"); // boolean b = dir.mkdir();//make directory//创建单级目录 // System.out.println("b="+b); // dir.mkdirs();//创建多级目录 System.out.println(dir.delete());//结果为true,删除的s,因为他把abc\\q\\e\\c\\z\\r\\w\\y\\f\\e\\g当成父目录。 // System.out.println(dir.delete()); // 文件的创建和删除。 // File file = new File("file.txt");//创建个对象 /* * 和输出流不一样(FileoutputStream,除非加true续写),如果文件不存在,则创建,如果文件存在,则不创建。 * */ // boolean b = file.createNewFile(); // System.out.println("b="+b); // boolean b = file.delete();删除是从里到外的删除,如果里面有文件是删除不了的。 // System.out.println("b="+b); } public static void getDemo(){ // File file = new File("E:\\java0331\\day22e\\a.txt"); File file = new File("a.txt"); String name = file.getName(); String absPath = file.getAbsolutePath();//绝对路径。 String path = file.getPath(); long len = file.length(); long time = file.lastModified(); Date date = new Date(time); DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG); String str_time = dateFormat.format(date); System.out.println("parent:"+file.getParent());拿取得文件父目录E:\\java0331\\day22e System.out.println("name:"+name); System.out.println("absPath:"+absPath); System.out.println("path:"+path); System.out.println("len:"+len); System.out.println("time:"+time); System.out.println("str_time:"+str_time); } }
=====================================================
重命名:
public static void renameToDemo() { File f1 = new File("c:\\9.mp3"); 这个就是改变路径的重命名,相当于剪切加移动加重命名。 File f2 = new File("d:\\aa.mp3"); //File f1 = new File("c:\\9.mp3"); 这个就是改变路径的重命名,相当于剪切加移动加重命名。 //File f2 = new File("c:\\aa.mp3");这就是同路径下仅仅的文件重命名。 boolean b = f1.renameTo(f2); System.out.println("b="+b); }
======================================================
listroots方法:
// File[] files = File.listRoots(); // for(File file : files){ // System.out.println(file); // } }
public static void listRootsDemo() { File file = new File("d:\\"); System.out.println("getFreeSpace:"+file.getFreeSpace());这个是获取这个盘的未分配字节数 long型 System.out.println("getTotalSpace:"+file.getTotalSpace());这是返回这个盘的整个总容量的字节数 long型 System.out.println("getUsableSpace:"+file.getUsableSpace());这个是返回这个盘可用的字节数 long型 // File[] files = File.listRoots(); // for(File file : files){ // System.out.println(file); // } }
List方法:
import java.io.File; import cn.itcast.io.p2.filter.FilterByHidden; import cn.itcast.io.p2.filter.SuffixFilter; public class FileListDemo { /** * @param args */ public static void main(String[] args) { listDemo_2(); } public static void listDemo() { File file = new File("c:\\"); /* * 获取当前目录下的文件以及文件夹的名称,包含隐藏文件。 * 调用list方法的File对象中封装的必须是目录。 * 否则会发生NullPointerException * 如果访问的系统级目录也会发生空指针异常。 * * 如果目录存在但是没有内容,会返回一个数组,但是长度为0. * */ String[] names = file.list(); System.out.println(names.length); for(String name : names){ System.out.println(name); } }
}
======================
list是返回全部内容,我需要部分返回或者指定的返回,此时需要过滤器。
接口FilenameFileter:
接口的方法:要覆盖FilenameFileter中的accept的方法。
过滤器提供一个接口,用list过滤器。
==========================================
=======================================
public static void listDemo_3() { File dir = new File("c:\\"); File[] files = dir.listFiles(new FilterByHidden()); for(File file : files){ System.out.println(file); } }
=======================================
Filefilter的accept方法:
过滤隐藏文件的过滤器: import java.io.File; import java.io.FileFilter; public class FilterByHidden implements FileFilter { @Override public boolean accept(File pathname) { return !pathname.isHidden(); } }
===============================================
public static void listDemo_2() { File dir = new File("c:\\"); String[] names = dir.list(new FilterByJava());
for(String name : names){ System.out.println(name); } }
==============================================
Filenamefilter的accept方法:
过滤为java后缀名的过滤器 import java.io.File; import java.io.FilenameFilter; public class FilterByJava implements FilenameFilter { @Override public boolean accept(File dir, String name) { // System.out.println(dir+"---"+name); return name.endsWith(".java"); } }
===========================================================
public static void listDemo_2() { File dir = new File("c:\\"); String[] names = dir.list(new SuffixFilter(".txt"));//你传的是什么后缀名我过滤什么。
for(String name : names){ System.out.println(name); } }
=============================
专门过滤后缀名的过滤器:
import java.io.File; import java.io.FilenameFilter; public class SuffixFilter implements FilenameFilter { private String suffix ; public SuffixFilter(String suffix) { super(); this.suffix = suffix; } @Override public boolean accept(File dir, String name) { return name.endsWith(suffix); } }
=============================================================
新的需求:想列当前目录中所有的子目录和文件(也就是深度遍历)
如果仅对名称的显示没什么其他的操作用第一个,有其他操作用文件的第三个。
import java.io.File; /* * 需求:对指定目录进行所有内容的列出(包含子目录中的内容) * 也可以理解为 深度遍历。 * * */ public class FileTest { /** * @param args */ public static void main(String[] args) { File dir = new File("e:\\demodir"); listAll(dir,0); } public static void listAll(File dir,int level) { System.out.println(getSpace(level)+dir.getName()); //获取指定目录下当前的所有文件夹或者文件对象 level++; //这个变量就是为了用缩进提供的,计数器,增加一次,就多了一级目录 File[] files = dir.listFiles(); for(int x=0; x<files.length; x++){ if(files[x].isDirectory()){ listAll(files[x],level);//进行递归。 } else System.out.println(getSpace(level)+files[x].getName()); } } private static String getSpace(int level) { StringBuilder sb = new StringBuilder(); sb.append("|--"); for(int x=0; x<level; x++){ sb.insert(0,"| "); } return sb.toString(); } }
==========================================================
递归练习:对一个数进行10进制转换为2进制。
就是不断的进行除2,模2的动作。可以用递归形式实现:
public class DiGuiDemo { /** * @param args */ public static void main(String[] args) { /* * 递归: * 函数自身直接或者间接的调用到了自身。 * * 一个功能在被重复使用,并每次使用时,参与运算的结果和上一次调用有关。 * 这时可以用递归来解决问题。 * * * 注意: * 1,递归一定明确条件。否则容易栈溢出。 * 2,注意一下递归的次数。 * */ // show(); // toBin(6); int sum = getSum(9000);/这个方法会调用九千次,就是栈溢出了。
System.out.println(sum); } public static int getSum(int num){ int x = 9; if(num==1) return 1; return num+getSum(num-1); }
递归过程图:
============================================== public static void toBin(int num){ if(num>0){ toBin(num/2); System.out.println(num%2); } }
递归过程图:
================================================ /* public static void show(){ method(); } public static void method(){ show(); } */ }
=================================================
import java.io.File; /* * 删除一个带内容的目录。 * * 原理:必须从最里面往外删。 * 需要进行深度遍历。 * * * */ public class RemoveDirTest { /** * @param args */ public static void main(String[] args) { File dir = new File("e:\\demodir"); // dir.delete(); removeDir(dir); } public static void removeDir(File dir) { File[] files = dir.listFiles(); for(File file : files){ if(file.isDirectory()){ removeDir(file); }else{ System.out.println(file+":"+file.delete()); } } System.out.println(dir+":"+dir.delete()); } }
================================================================
Properties类表示了一个持久的属性集。它没有泛型。他可以和流技术相结合。
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Properties; import java.util.Set; public class PropertiesDemo { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { /* * Map * |--Hashtable * |--Properties: * * Properties集合: * 特点: * 1,该集合中的键和值都是字符串类型。 * 2,集合中的数据可以保存到流中,或者从流获取。 * * 通常该集合用于操作以键值对形式存在的配置文件。 * * */ // methodDemo_4(); // myLoad(); test(); } //对已有的配置文件中的信息进行修改。 /* * 读取这个文件。 * 并将这个文件中的键值数据存储到集合中。 * 在通过集合对数据进行修改。 * 在通过流将修改后的数据存储到文件中。 */ public static void test() throws IOException{ //读取这个文件。 File file = new File("info.txt"); if(!file.exists()){ file.createNewFile(); } FileReader fr = new FileReader(file); //创建集合存储配置信息。 Properties prop = new Properties(); //将流中信息存储到集合中。 prop.load(fr); prop.setProperty("wangwu", "16"); FileWriter fw = new FileWriter(file);//输出流是覆盖文件的,跟创建文件是不一样的。创建文件有就不创建。 prop.store(fw,""); // prop.list(System.out); fw.close(); fr.close(); } //模拟一下load方法。(load方法原理) public static void myLoad() throws IOException{ Properties prop = new Properties(); BufferedReader bufr = new BufferedReader(new FileReader("info.txt")); String line = null; while((line=bufr.readLine())!=null){ if(line.startsWith("#")) continue; String[] arr = line.split("="); // System.out.println(arr[0]+"::"+arr[1]); prop.setProperty(arr[0], arr[1]); } prop.list(System.out); bufr.close(); } public static void methodDemo_4() throws IOException { Properties prop = new Properties(); //集合中的数据来自于一个文件。 //注意;必须要保证该文件中的数据是键值对。 //需要使用到读取流。 FileInputStream fis = new FileInputStream("info.txt"); //使用load方法。 prop.load(fis); prop.list(System.out);//调试方法,就是返回能显示出来有什么东西。 } public static void methodDemo_3() throws IOException { Properties prop = new Properties(); //存储元素。 prop.setProperty("zhangsan","30"); prop.setProperty("lisi","31"); prop.setProperty("wangwu","36"); prop.setProperty("zhaoliu","20"); //想要将这些集合中的字符串键值信息持久化存储到文件中。 //需要关联输出流。 FileOutputStream fos = new FileOutputStream("info.txt"); //将集合中数据存储到文件中,使用store方法。 prop.store(fos, "info");//info 为描述信息(comments)注释就不要写中文信息了。(-->字符 -->unicode码-->再变成16进制,显示出来) fos.close(); } /** * 演示Properties集合和流对象相结合的功能。 */ public static void methodDemo_2(){ Properties prop = new Properties(); //存储元素。 // prop.setProperty("zhangsan","30"); // prop.setProperty("lisi","31"); // prop.setProperty("wangwu","36"); // prop.setProperty("zhaoliu","20"); prop = System.getProperties(); prop.list(System.out); } /* * Properties集合的存和取。 */ public static void propertiesDemo(){ //创建一个Properties集合。 Properties prop = new Properties(); //存储元素。 prop.setProperty("zhangsan","30"); prop.setProperty("lisi","31"); prop.setProperty("wangwu","36"); prop.setProperty("zhaoliu","20"); //修改元素。 prop.setProperty("wangwu","26"); //取出所有元素。 Set<String> names = prop.stringPropertyNames(); for(String name : names){ String value = prop.getProperty(name); System.out.println(name+":"+value); } } }
============================================================
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Properties; /* * 定义功能,获取一个应用程序运行的次数,如果超过5次,给出使用次数已到请注册的提示。并不要在运行程序。 * * 思路: * 1,应该有计数器。 * 每次程序启动都需要计数一次,并且是在原有的次数上进行计数。 * 2,计数器就是一个变量。 突然冒出一想法,程序启动时候进行计数,计数器必须存在于内存并进行运算。 * 可是程序一结束,计数器消失了。那么再次启动该程序,计数器又重新被初始化了。 * 而我们需要多次启动同一个应用程序,使用的是同一个计数器。 * 这就需要计数器的生命周期变长,从内存存储到硬盘文件中。 * * 3,如何使用这个计数器呢? * 首先,程序启动时,应该先读取这个用于记录计数器信息的配置文件。 * 获取上一次计数器次数。 并进行试用次数的判断。 * 其次,对该次数进行自增,并自增后的次数重新存储到配置文件中。 * * * 4,文件中的信息该如何进行存储并体现。 * 直接存储次数值可以,但是不明确该数据的含义。 所以起名字就变得很重要。 * 这就有了名字和值的对应,所以可以使用键值对。 * 可是映射关系map集合搞定,又需要读取硬盘上的数据,所以map+io = Properties. * * * */ public class PropertiesTest { /** * @param args * @throws IOException * @throws Exception */ public static void main(String[] args) throws IOException { getAppCount(); } public static void getAppCount() throws IOException{ //将配置文件封装成File对象。 File confile = new File("count.properties"); if(!confile.exists()){ confile.createNewFile(); } FileInputStream fis = new FileInputStream(confile); Properties prop = new Properties(); prop.load(fis); //从集合中通过键获取次数。 String value = prop.getProperty("time"); //定义计数器。记录获取到的次数。 int count =0; if(value!=null){ count = Integer.parseInt(value); if(count>=5){ // System.out.println("使用次数已到,请注册,给钱!"); // return; throw new RuntimeException("使用次数已到,请注册,给钱!"); } } count++; //将改变后的次数重新存储到集合中。 prop.setProperty("time", count+""); FileOutputStream fos = new FileOutputStream(confile); prop.store(fos, ""); fos.close(); fis.close(); } }
================================================================
import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.FilenameFilter; import java.io.IOException; import java.util.ArrayList; import java.util.List; /* * * 获取指定目录下,指定扩展名的文件(包含子目录中的) * 这些文件的绝对路径写入到一个文本文件中。 * * 简单说,就是建立一个指定扩展名的文件的列表。 * * 思路: * 1,必须进行深度遍历。 * 2,要在遍历的过程中进行过滤。将符合条件的内容都存储到容器中。 * 3,对容器中的内容进行遍历并将绝对路径写入到文件中。 * * */ public class Test { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { File dir = new File("e:\\java0331"); FilenameFilter filter = new FilenameFilter(){ @Override public boolean accept(File dir, String name) { return name.endsWith(".java"); } }; List<File> list = new ArrayList<File>(); getFiles(dir,filter,list); File destFile = new File(dir,"javalist.txt"); write2File(list,destFile); } /** * 对指定目录中的内容进行深度遍历,并按照指定过滤器,进行过滤, * 将过滤后的内容存储到指定容器List中。 * @param dir * @param filter * @param list */ public static void getFiles(File dir,FilenameFilter filter,List<File> list){ File[] files = dir.listFiles(); for(File file : files){ if(file.isDirectory()){ //递归啦! getFiles(file,filter,list); }else{ //对遍历到的文件进行过滤器的过滤。将符合条件File对象,存储到List集合中。 if(filter.accept(dir, file.getName())){ list.add(file); } } } } public static void write2File(List<File> list,File destFile)throws IOException{ BufferedWriter bufw = null; try { bufw = new BufferedWriter(new FileWriter(destFile)); for(File file : list){ bufw.write(file.getAbsolutePath()); bufw.newLine(); bufw.flush(); } } /*catch(IOException e){ throw new RuntimeException("写入失败"); }*/finally{ if(bufw!=null) try { bufw.close(); } catch (IOException e) { throw new RuntimeException("关闭失败"); } } } }