IO流--File类

xiaoxiao2021-02-27  191

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("关闭失败"); } } } }

转载请注明原文地址: https://www.6miu.com/read-16030.html

最新回复(0)