15 Java的文件管理

File类

将文件和文件夹封装成对象,方便操作文件和文件夹

File(String pathname); 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 
File(String parent, String child); 根据parent路径名字符串和 child 路径名字符串创建一个新 File 实例。   
File(File parent, String child); 根据parent抽象路径名和 child 路径名字符串创建一个新 File 实例。

提示:所有在 java.io 中的类都将相对路径名解释为以用户工作目录开始,你可以通过调用 System.getProperty("user.dir") 来获得这个信息

警告: 由于反斜杠字符在 Java 字符串中是转义字符,因此要确保在 Windows 风格的路径名中使用 \(例如,C:\Windows\win.ini)。在 Windows 中,还可以使用单斜杠字符(C:/Windows/win.ini),因为大部分 Windows 文件处理的系统调用都会将斜杠解释成文件分隔符。但是,并不推荐这样做,因为 Windows 系统函数的行为会因与时俱进而发生变化。因此,对于可移植的程序来说,应该使用程序所运行平台的文件分隔符,我们可以通过常量字符串 java.io.File.separator获得它。

java.io.File.separatorChar

On UNIX systems the value of this field is <code>'/'</code>; 
on Microsoft Windows systems it is <code>'\'</code>.

java.io.File.pathSeparatorChar

On UNIX systems, this character is <code>':'</code>; 
on Microsoft Windows systems it is <code>';'</code>.
基本操作
创建

当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
f.createNewFile();

最终目录的父目录必须存在,因此只是建立一层目录
System.out.println(f.mkdir());

可以任意建立多级目录
System.out.println(f.mkdirs());

删除

boolean delete(); 删除失败返回false
void delectOnExit();在程序退出时删除指定文件

判断

boolean exists():文件是否存在,是最为常用的方法
isFile();
isDirectory();
isHidden();
isAbsolute();

获取

getName(); // 返回文件或目录名
getPath();
getParent();
getAbsolutePath();
lastModified();
length();


##### 文件列表:     
* static File[] listRoots(): 列出可用的文件系统根。      
* String[] list(): 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。     
* String[] list(FilenameFilter filter): 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。  

列出指定目录下文件或文件夹,包含子目录中的内容.也就是列出指定目录下所有的内容.
``` java
列出指定目录下文件或文件夹,包含子目录中的内容.   
public static void listFile(File f,int level){
    level++;
    if (f.isFile()) {
        System.out.println(getLevel(level)+f); 
    } else if (f.isDirectory()) {
        System.out.println(getLevel(level)+f);
        File[] files = f.listFiles();
        for (File file: files) {
            listFile(file,level);
        }          
    }
}
 
public static String getLevel(int i){
    StringBuilder sb = new StringBuilder();
    for(int k=0;k<i;k++) {
        sb.append("|-");
    }
    return sb.toString();
}

删除一个带内容的目录 (原理: 在window中,删除目录从里面到外删,使用递归思想)

//删除一个带目录的内容
public static void deleteDir(File f){
    if(f.isFile())
        f.delete();
    else if(f.isDirectory()){
        File[] files = f.listFiles();
        for(File file: files){
            deleteDir(file);
        }
        f.delete();
    }
}

练习: 将一个指定目录下的java文件的绝对路径存储到一个文本文件中, 建立一个java文件列表文件.
(思路: 递归, IO流, File相关)

public class Test {
    public static void main(String[] args) throws IOException {
        List<File> list = new ArrayList<File>();
        // 获取new下所有java文件,参数是目录和list对象
        fileToList(new File("D:" + File.separator + "New"), list);
        // 取出list对象中信息,并写入list.txt
        listToFile(list, new File("d:" + File.separator + "list.txt"));
    }

    /**
     * 通过路径名,将所需信息存入list集合中
     * 
     * @param f
     * @param list
     */
    private static void fileToList(File f, List<File> list) {
        File[] files = f.listFiles();
        for (File file : files) {
            if (file.isHidden())
                continue;
            if (file.isDirectory())
                fileToList(file, list);
            else if (file.isFile()) {
                if (file.getName().endsWith(".java"))
                    list.add(file);
            }
        }
    }

    /**
     * 取出集合中所需信息,写入目标文件
     * 
     * @param list
     * @param f
     */
    private static void listToFile(List<File> list, File f) {
        try (BufferedWriter bfw = new BufferedWriter(new FileWriter(f))) {
            for (File file : list) {
                // getAbsolutePath方法是非常常用的,用来获取绝对路径
                bfw.write(file.getAbsolutePath());
                bfw.newLine();
                bfw.flush();
            }
        } catch (IOException e) {
            throw new RuntimeException("流写入异常");
        }
    }

}
Properties类
  • 是HashTable的子类.
  • Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
  • 因为 Properties 继承于 Hashtable,所以可对 Properties 对象应用 put 和 putAll 方法。但不建议使用这两个方法,因为它们允许调用者插入其键或值不是 String 的项。相反,应该使用 setProperty 方法。如果在“不安全”的 Properties 对象(即包含非 String 的键或值)上调用 store 或 save 方法,则该调用将失败。类似地,如果在“不安全”的 Properties 对象(即包含非 String 的键)上调用 propertyNames 或 list 方法,则该调用将失败。
##### 设置和获取元素
String getProperty(String key)           
用指定的键在此属性列表中搜索属性 

String getProperty(String key, String defaultValue)           
用指定的键在属性列表中搜索属性。

##### 遍历
        Set<String> set = prop.stringPropertyNames();
        for (String key : set) {
            System.out.println(key + "---" + prop.getProperty(key));
        }

##### 载入和存储
void load(InputStream inStream)           
从输入流中读取属性列表(键和元素对)。

void store(OutputStream out, String comments)           
以适合使用 load(InputStream) 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流

Zip文档

ZIP 文档(通常)以压缩格式存储了一个或多个文件,每个 ZIP 文档都有一个头,包含诸如每个文件名字和所使用的压缩方法等信息。在 Java 中,可以使用 ZipInputStream 来读入 ZIP 文档。你可能需要浏览文档中每个单独的项,getNextEntry 方法就可以返回一个描述这些项的 ZipEntry 类型的对象。ZipInputStream 的 read 方法被修改为在碰到当前项的结尾时返回- 1(而不是碰到 ZIP 文件的末尾),然后你必须调用 closeEntry 来读入下一项

        //典型的通读 ZIP文件的代码
        ZipInputStream zin = new ZipInputStream(new BufferedInputStream(new FileInputStream("cc.zip")));
        ZipEntry entry;
        while ((entry = zin.getNextEntry()) != null) {
            // analyze entry
            // read the contents of zin
            zin.closeEntry();
        }
        zin.close();

要写出到 ZIP 文件,可以使用 ZipOutputStream,而对于你希望放入到 ZIP 文件中的每一项,都应该创建一个 ZipEntry 对象,并将文件名传递给 ZipEntry 的构造器,它将设置其他诸如文件日期和解压缩方法等参数。如果需要,你可以覆盖这些设置。然后,你需要调用 ZipOutputStream 的 putNextEntry 方法来开始写出新文件,并将文件数据发送到ZIP 流中。当完成时,需要调用 closeEntry。然后,你需要对所有你希望存储的文件都重
复这个过程。下面是代码框架:

        ZipOutputStream zout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream("cc.zip")));
        for all files{
            ZipEntry zipEntry = new ZipEntry("first.txt");
            zout.putNextEntry(zipEntry);
            // send data to zout
            zout.closeEntry();      
        }
        zout.close();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容