美文网首页Java 杂谈Android技术知识Android开发
Java总结IO第三篇之File类和Properties类

Java总结IO第三篇之File类和Properties类

作者: e4e52c116681 | 来源:发表于2018-10-11 16:01 被阅读14次

    Java总结IO四篇:

    名称
    第零篇 Java总结IO之总集篇
    第一篇 Java总结IO第一篇之字符流与字符编码
    第二篇 Java总结IO第二篇之字节流与字符流转化
    第三篇 Java总结IO第三篇之File类和Properties类
    第四篇 Java总结IO第四篇之其他IO流对象

    上篇:File类

    File类将文件文件夹封装成对象
    IO流+File

    File file = new File(String path);
    File file = new File(String dir,String fineName);
    File file = new File(File dir,String fineName);
    

    一、普通测试

    public class FileDemo {
        public static String path = "I:\\Java\\Base\\Thinking\\src\\IOTest\\File.txt";
        public static String dirPath = "I:\\Java\\Base\\Thinking\\src\\IOTest\\File";
        public static String dirPaths = "I:\\Java\\Base\\Thinking\\src\\IOTest\\a\\b\\c";
        public static File file = new File(path);
        public static File newDir = new File(dirPath);
        public static File newDirs = new File(dirPaths);
    
        public static void main(String[] args) throws Exception {
    //        otherTest();//其他测试
    //        createTest();//创建文件
    //        judgeTest();//判断File文件
    //        getInfoTest();//获取File对象信息
    //        deleteTest();//删除文件
        }
    
    1.其他测试
    String path = "I:\\Java\\Base\\Thinking\\src\\IOTest\\File.txt";
    File file = new File(path);
    System.out.println(file);//file.toString()返回文件路径
    //I:\Java\Base\Thinking\src\IOTest\File.txt
    System.out.println(File.separator);//系统路径分隔符:\
    file.renameTo(new File(file.getParent(), "file.txt"));//重命名到(剪切)
    
    2.创建文件
    private static void createTest() throws IOException {
        //返回是否创建成功,如果已经存在,返回false
        System.out.println("创建文件: " + file.createNewFile());//创建文件: true
        System.out.println("创建一级文件夹: " + newDir.mkdir());//创建一级文件夹: true
        System.out.println("创建多级文件夹: " + newDirs.mkdirs());//创建多级文件夹: true
    }
    
    3.判断File文件
    private static void judgeTest() {
        System.out.println("文件是否存在" + file.exists());//文件是否存在true
        System.out.println("文件是否可执行: " + file.canExecute());//文件是否可执行: true
        System.out.println("文件是否可读: " + file.canRead());//文件是否可执行: true
        System.out.println("文件是否可写: " + file.canWrite());//文件是否可执行: true
        System.out.println("是否是文件: " + file.isFile());//是否是文件: true
        System.out.println("是否是文件夹: " + file.isDirectory());//是否是文件夹: false
        System.out.println("是否是绝对路径: " + file.isAbsolute());//是否是绝对路径: true
        System.out.println("是否是隐藏: " + file.isHidden());//是否是隐藏: false
    }
    
    4.获取File对象信息
    private static void getInfoTest() {
        System.out.println("路径: " + file.getPath());
        //路径: I:\Java\Base\Thinking\src\IOTest\File.txt
        System.out.println("绝对路径: " + file.getAbsolutePath());
        //绝对路径: I:\Java\Base\Thinking\src\IOTest\File.txt
        System.out.println("文件名: " + file.getName());//文件名: File.txt
        System.out.println("文件名: " + newDir.getName());//文件名: File
        System.out.println("父文件夹名: " + file.getParent());
        //父文件夹名: I:\Java\Base\Thinking\src\IOTest
        System.out.println("父文件夹对象: " + file.getParentFile());
        //父文件夹对象: I:\Java\Base\Thinking\src\IOTest
        System.out.println("文件所在盘符总大小: " + file.getTotalSpace() / 1024 / 1024 / 1024 + "G");//50G
        System.out.println("文件所在盘符剩余大小: " + file.getUsableSpace() / 1024 / 1024 / 1024 + "G");//20G
        System.out.println("文件所大小:" + file.length()+"b");//文件所大小:5b
        String time = new SimpleDateFormat("yyyy/MM/dd a hh:mm:ss ").format(file.lastModified());
        System.out.println("最后修改日期: " + time);
        //最后修改日期: 2018/10/10 下午 01:10:17
    }
    
    5.删除文件
    private static void deleteTest() {
        System.out.println("删除文件: " + file.delete());//删除文件: true
        file.deleteOnExit();//虚拟机退出时删除,避免删除临时文件前发生异常后删除不了
    }
    

    二、文件列表

    1.基本使用
    private static void listFile() {
        
        File[] files = File.listRoots();//显示系统盘符
        for (File f : files) {
            System.out.print(f+"  ");
            //C:\  D:\  E:\  F:\  G:\  H:\  I:\  J:\  K:\
        }
        
        String[] list = file.getParentFile().list();
        for (String s : list) {
            System.out.println(s);
        }
        //a
        //Activity.md
        //BufferedWriter.txt
        //fate.jpg
        //File
        //file.txt
        //FileInputStream.txt
        //FileWriter.txt
        //video.avi
        //《吸血鬼日记》原著英文.txt
        //键盘录入
        //键盘录入-GKB
        //键盘录入-UTF-8
        
        File[] listFiles = file.getParentFile().listFiles(new FilenameFilter()
            @Override
            public boolean accept(File dir, String name) {
                return name.endsWith(".txt");//过滤掉.txt以外的文件
            }
        });
        for (File lf : listFiles) {
            System.out.println(lf);
            //I:\Java\Base\Thinking\src\IOTest\BufferedWriter.txt
            //I:\Java\Base\Thinking\src\IOTest\file.txt
            //I:\Java\Base\Thinking\src\IOTest\FileInputStream.txt
            //I:\Java\Base\Thinking\src\IOTest\FileWriter.txt
            //I:\Java\Base\Thinking\src\IOTest\《吸血鬼日记》原著英文.txt
        }
    }
    
    2.删除一个文件夹内的所有文件

    删除文件夹,如果里面有内容,从里往外删
    不能直接删除有文件的文件夹

    private static void deleteDir(File dir) {
        for (File file : dir.listFiles()) {
            if (file.isDirectory()) {
                deleteDir(file);
            } else {
                String name = file.getName();
                boolean ok = file.delete();
                System.out.println(ok ? "成功删除--" + name : "删除失败--" + name);
            }
        }
        dir.delete();
    }
    
    3.将某文件加图片的路径保存到目标文件
    public class OpenDir {
        public static void main(String[] args) {
            File file = new File("E:\\UI");
            List<File> list = new ArrayList<>();
            fileToList(file, list);
            System.out.println(list.size());
            write2File(list, "F:\\list.txt");
        }
    
        /**
         * 将某文件夹的图片文件加入list中
         * @param dir 目标文件夹
         * @param list 列表
         */
        private static void fileToList(File dir, List<File> list) {
            for (File file : dir.listFiles()) {
                if (file.isDirectory()) {
                    fileToList(file, list);
                } else {
                    if (file.getName().endsWith(".png")||file.getName().endsWith(".jpg")) {
                        list.add(file);
                    }
                }
            }
        }
    
        /**
         * 将文件列表每项的路径保存到目标文件
         * @param list
         * @param target
         */
        public static void write2File(List<File> list, String target) {
            BufferedWriter bfw = null;
            try {
                bfw = new BufferedWriter(new FileWriter(target));
                for (File file : list) {
                    String path = file.getAbsolutePath();
                    bfw.write(path);
                    bfw.newLine();
                    bfw.flush();
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (bfw != null) {
                        bfw.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    60000+图片的路径保存到了文件中

    保存文件列表.png

    File对象差不多就这些


    下篇:Properties类

    HashTable的子类,具有Map的特点,并且键值均为String
    Map与IO结合,可用于键值对形式的配置文件,如下面的颜色选择器

    配置文件.png

    一、Properties对象的简单使用

    既然是继承自HashTable,基本操作应该不在话下,Map中常用put(),get()
    为了语义化,Properties类有setProperty()和getProperty()---当然你也可以用put(),get()

    1.存储与获取
    public class PropertiesTest {
        public static void main(String[] args) {
            Properties prop = new Properties();
            prop.put("TextColor", "red");
            prop.put("FontSize", "25sp");
    
            System.out.println(prop);//{FontSize=25sp, TextColor=red}
            System.out.println(prop.getProperty("TextColor"));//red
        }
    }
    
    2.遍历
    //获取键的集合
    Set<String> keys = prop.stringPropertyNames();
    for (String key : keys) {
        System.out.print(key+":"+prop.getProperty(key)+"  ");
        //FontSize:25sp  Family:KaiTi  TextColor:red
    }
    
    //使用map的api遍历:
    prop.keySet().iterator().forEachRemaining(key->{
        System.out.print(key+":"+prop.get(key)+"  ");
        //FontSize:25sp  Family:KaiTi  TextColor:red
    });
    

    Properties与文件IO结合

    config.png
    1.如果没有Properties对象:啰嗦一大堆

    打开颜色选择器 :读流I-->字符串分割-->字符串存入Map-->使用Map对象还原用户配置
    修改配置时 :写流O-->创建Map对象-->字符串拼接-->字符串存入配置文件

    private static void useHashMapReadConfig() throws IOException {
        //将配置文件读入hashMap对象
        String configPath = "I:\\Java\\Base\\Thinking\\src\\IOTest\\TxtInfo.ini";
        BufferedReader bfr = new BufferedReader(new FileReader(configPath));
        HashMap<String, String> hashMap = new HashMap<>();
        String line = null;
        while ((line = bfr.readLine()) != null) {
            String[] split = line.split("=");
            hashMap.put(split[0], split[1]);
        }
        bfr.close();
        System.out.println(hashMap);
        //{FontSize=25sp, Family=KaiTi, TextColor=red}
    }
    
    使用Properties对象:两行搞定

    打开颜色选择器:读流I-->使用Properties对象还原用户配置
    关闭颜色选择器:写流O-->使用Properties对象修改配置文件

    Properties prop = new Properties();
    prop.load(new FileInputStream("I:\\Java\\Base\\Thinking\\src\\IOTest\\TxtInfo.ini"));
    System.out.println(prop);//{FontSize=25sp, Family=KaiTi, TextColor=red}
    
    list方法:可以指定输出流
    prop.list(System.out);
    //-- listing properties --
    //FontSize=25sp
    //Family=KaiTi
    //TextColor=red
    
    3.修改配置文件并保存
     prop.setProperty("TextColor", "blue");
     //修改后需要用store保存到文件中,否则修改无效
     prop.store(new FileOutputStream("I:\\Java\\Base\\Thinking\\src\\IOTest\\TxtInfo.ini"),"toly--mod");
    
    修改config.png

    后记:捷文规范

    1.本文成长记录及勘误表
    项目源码 日期 备注
    V0.1--无 2018-10-11 Java总结IO篇之File类和Properties类
    V0.2--无 - -
    2.更多关于我
    笔名 QQ 微信 爱好
    张风捷特烈 1981462002 zdl1994328 语言
    我的github 我的简书 我的CSDN 个人网站
    3.声明

    1----本文由张风捷特烈原创,转载请注明
    2----欢迎广大编程爱好者共同交流
    3----个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
    4----看到这里,我在此感谢你的喜欢与支持

    相关文章

      网友评论

        本文标题:Java总结IO第三篇之File类和Properties类

        本文链接:https://www.haomeiwen.com/subject/ynbbaftx.html