File类
流只能操作具体的数据,但是对文件的大小、创建时间等信息却无法操作。这就有必须使用File类。
File f1=new file("c:\\a.txt");
名称分隔符也可以使用File.separator,如上例 "c:"+File.separator+"a.txt"
1.常见的File类的获取信息方法
public static void getDemo() { File file=new File("a.txt"); String name=file.getName(); String absPath=file.getAbsolutePath(); String path=file.getPath(); long len=file.lenght(); long time=file.lastModified();
Date date=new Date(time);
DateFormat dateFormat=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.Long);
string str_time=dateFormat.format(date);
string parentDir=file.getParent();//如是相对路径,则当前目录的父目录是null //以下输出,略 …… }
2.创建与删除
File file=new File("a.txt");
boolean b=file.createNewFile();
和输出流不一样的是,如果文件不存在,则创建,如果文件存在,则不创建。
file.delete();
注意:file.deleteOnExit()是在退出时删除。
File类还可操作文件夹。
File dir=new File("abc");
boolean b=dir.mkdir();
当文件或目录不存时,isFile()和isDirectory()均为false,所以最好先判断是否存在。
3.重命名(有剪切功能,可改变目录)
File f1=new File("c:\\a.txt");
File f2=new File("c:\\b.txt");
boolean b=f1.renameTo(f2);
4. 获取系统根目录
File [] files=File.listRoots();
for(File file:files)
{
System.out.println(file); //输出c:\ d:\ e:\等
}
5.获取空间容量
File file=new File("d:\\");
System.out.println(file.getFreeSpace()); //未用空间容量
System.out.println(file.getTotalSpace()); //总容量
System.out.println(file.getUsableSpace()); //已用空间容量
6.获取文件和目录列表
public static void listDemo_1() { File file =new File("c:\\"); //如果是文件或此目录不存在,则会有异常,所以最好加判断 String[] names=file.list(); for(String name:names) { System.out.println(name); } } public static void listDemo_2() { File file =new File("c:\\"); //如果是文件或此目录不存在,则会有异常,所以最好加判断 //list()方法可以带过滤器,过滤器的接口为FilenameFilter,它就一个方法accept() ,只要返回真,就取出 String [] names=dir.list(new FilterByJava()); for(String name:names) { System.out.println(name); } } /* 新建一个接口,做个过滤器 */ public class FilterByJava implements FilenameFilter { @Override public boolean accept(File dir,String name) { return name.endsWith(".java"); //取出所有扩展名为.java的文件名 } }
如果想过滤所有隐藏文件,那么不能用list()方法,因为这个方法只能获取和过滤文件和目录的名称,不能过滤文件的属性。
只能使用listFiles()方法。它也可以使用过滤器,参考上例。
删除非空目录
public static void removeDir(File dir) { File [] files=dir.listFiles() for(File file:files) { if (file.isDirectory()) { removeDir(file); } else { file.delete(); } } dir.delete(); }
下面看看Map-->Hashtable-->Properties
Properties集合特点:
1. 该集合中的键和值都是字符串类型
2. 集合中的数据可保存到流中或从流中获取
Properties集合用于操作以键值对形式存在的配置文件。
存:setProperties(String key,String value)
取:getProperties(String key)
实例:Properties集合的存和取
public static void propertiesDemo() { //创建一个Properties集合 Properties prop=new Properties(); //存储元素 prop.setProperty("张三",30); prop.setProPerty("李四",46); //修改 prop.setProperty("张三",34); //取出 Set<String> names=prop.stringPropertyNames(); for(String name:names) { String value=prop.getProperty(name); System.out.println(name+":"+value); } }
list(PrintStream p) 一般用于调试Properties集合
注意:PrintStream流是标准输出流,和System.out一样
如p.list(System.out);
如果想把Properties集合存放到文件中,可用store(OutputStream out,String comments)方法
public static void storeProperties() { Properties prop=new Properties(); prop.setProperty("zhangsan","30"); //Properties流中操作中方为ISO编码,会出现乱码 prop.setProperty("lisi","45"); FileOutputStream fos=new FileOutputStream("info.txt"); //将集合数据存储到文件中,使用store方法 prop.store(fos,"name+age"); fos.close(); }
读集合文件
Properties prop=new Properties(); //集合中的数据来自于一个文件,必须要保证该文件中的数据是键值对 //需要使用到读取流 FileInputStream fis=new FileInputStream("info.txt"); //使用load方法 prop.load(fis); System.out.println(prop.list());
//修改集合文件
public static void modify() { //读取文件 File file=new File("info.txt"); if (!file.exists()) { file.createNewFile(); } FileReader fr=new FileReader("info.txt"); //创建集合 Properties prop=new Properties(); //读文件 prop.load(fr); prop.setProperty("wangwu","16"); //写文件 FileWriter fw=new FileWriter(file); prop.store(fw,""); fw.close(); fr.close(); }
键值对在修改时需要覆盖全文件,不易修改,可以使用XML文件