zoukankan      html  css  js  c++  java
  • 二十一、Java基础--------IO流之综合案例分析

            前三篇文章详细介绍了IO流体系所涉及的重点内容,为了帮助理解与学习,本片博客主要是分析一个与IO操作相关的题目。

        例1:在我们观看视频时经常要关注的就是视频的时间长度,在学习了IO操作之后,就可以自己去获取一段视频的长度了。

        题目解析:

        这个题目看似挺难,其实没有那么困难,主要是用到了第三方的一个jar包链接:

            http://www.sauronsoftware.it/projects/jave/index.php

            第二个考察的就是遍历文件夹。代码如下:

    import it.sauronsoftware.jave.Encoder; 
    
    import it.sauronsoftware.jave.MultimediaInfo; 
    
    import java.io.File; 
    
    import java.util.ArrayList; 
    
    import java.util.Scanner; 
    
    public class TheLengthOfAVI { 
        public static void main(String[] args) { 
            System.out.println("请输入制定目录,本程序将计算该目录下所包含.avi文件的总时长:"); 
            // 读取指定文件目录
            String dir = new Scanner(System.in).nextLine(); 
            File file = new File(dir); 
            ArrayList<File> list = new ArrayList<File>(); 
            // 遍历指定目录下所有文件,如果是目录则递归,如果是.avi则将文件加入到list中
            file2List(file, list); 
            // 计算并输出该目录下所有.avi文件的时长
            readTheLength(list); 
        } 
        private static void readTheLength(ArrayList<File> list) { 
            long time = 0, h, m, s; 
            File source = null; 
            for (int i = 0; i < list.size(); i++) { 
                source = new File(list.get(i).getAbsolutePath()); 
                Encoder encoder = new Encoder(); 
                try { 
    
                    MultimediaInfo mm = encoder.getInfo(source); 
                    time += mm.getDuration(); 
    
                } catch (Exception e) { 
    
                    e.printStackTrace(); 
    
                } 
            } 
    
            h = time / 60 / 60 / 1000;// 小时
            s = time / 60 / 1000 - h * 60;//
            m = time / 1000 - h * 3600 - s * 60;//
            System.out.println("该目录下所有.avi格式文件,视频总时长为:" + h + "小时:" + s + "分" + m  + "秒"); 
        } 
        private static void file2List(File file, ArrayList<File> list) { 
            File[] files = file.listFiles(); 
            if (files != null)// 如果只是指定一个文件而不再有子目录则在file.listFiles()时会返回null,
                                // 这种情况需要直接判断该文件是否为.avi,如果是则添加到list中
    
                for (int i = 0; i < files.length; i++) { 
                    if (!files[i].isHidden()) { 
                        if (files[i].isDirectory()) 
                            file2List(files[i], list); 
                        else if (files[i].getName().endsWith(".avi")) 
                            list.add(files[i]); 
                    } 
    
                } 
            else { 
                if (file.getName().endsWith(".avi")) 
                    list.add(file); 
            } 
        } 
    }

            例2将指定路径下指定后缀的文件复制到另一个指定的目录。

            分析:本题使用了三个知识点:递归文件夹、读取文件、输出文件

    import java.io.File; 
    import java.io.FileInputStream; 
    import java.io.FileOutputStream; 
    import java.io.IOException; 
    import java.util.ArrayList; 
    import java.util.List; 
    /* 
    * 需求:从控制台接收两个文件夹路径,把其中一个文件夹里面包含所有*.Java的文件复制到另一个文件夹里
    *     思路:
    *      得到文件
    *         1、遍历指定的路径,如果当前文件为文件并且后缀为.java则将该文件加入一个list中
    *         2、如果当前文件不是java文件则忽略
    *         3、如果当前文件为目录则递归该目录
    * 写文件
    *     1、首先创建一个指定的文件夹
    *         2、遍历list获得当前文件的文件名,字符串拼接形成新的文件名
    *         3、读取当前文件内容
    *         4、将读取的内容写到新建的文件中
    * */ 
    public class文件复制 { 
        public static void main(String[] args) throws IOException { 
            File file=new File("E:\");//指定目录
            List<File> list=new ArrayList<File>();//定义一个list用于存放遍历得到的文件
            file2list(file,list); 
            list2file(list); 
        } 
        //将list中保存的文件写到新的文件中,也就是完成复制
        private static void list2file(List<File> list) throws IOException { 
            File f=new File("E:\myFileaa"); 
            f.mkdir(); 
            for(int i=0;i<list.size();i++) 
            { 
                String fileName=f+"\"+list.get(i).getName(); 
                System.out.println(fileName); 
                FileInputStream fis=new FileInputStream(list.get(i)); 
                FileOutputStream fos=new FileOutputStream((fileName)); 
                int len=0; 
                byte by[]=new byte[1024]; 
                while((len=fis.read(by))!=-1) 
                { 
                    fos.write(by,0,len); 
                } 
                fos.close(); 
                fis.close(); 
            } 
        } 
        //递归将指定后缀的文件添加到list中
        private static void file2list(File file, List<File> list) { 
            File files[]=file.listFiles(); 
            for(int i=0;i<files.length;i++) 
            { 
                if(!files[i].isHidden()) 
                    if(files[i].isDirectory()) 
                        file2list(files[i],list); 
                    else if(files[i].getName().endsWith(".java")) 
                        list.add(files[i]); 
            } 
        } 
    }

            例3 请模拟一个程序在该程序运行大不等于2时提示用户进行注册,否则可以继续使用。

    import java.io.File; 
    import java.io.FileInputStream; 
    import java.io.FileWriter; 
    import java.io.IOException; 
    import java.util.Properties; 
    /* 
    * 用于记录应用程序的运行次数
    * 如果次数大于等于2那么就给出注册提示。
    * 
    * */ 
    public class LimitOfTime { 
        public static void main(String[] args) throws IOException { 
            File file = new File("E:\a.ini");//建立文件对象
            Properties pro = new Properties(); 
            if (!file.exists()) {//如果文件不存在则新建该文件
                file.createNewFile(); 
            } 
            pro.load(new FileInputStream(file));//将指定的文件流加载到Properties对象中
            String value = pro.getProperty("time");//获取指定的参数,如果该参数不存在则返回null 
            int time =0; 
            /* 
             * 如果返回值不为空表示该文件之前已经建立,所以下面要做的就是判断该值是否在于等于2,
             * 如果不大于2则该值将自增1
             * 如果大于等于2,则提示需要注册。
             * */ 
            if (value !=null) 
            { 
                time= Integer.parseInt(value); 
                if(time>=2) 
                { 
                    System.out.println("您使用次数已到,请注册!!"); 
                    return ; 
                } 
            } 
            pro.setProperty("time", (time + 1) + ""); 
            System.out.println("第" + (time + 1) + "次使用"); 
            pro.store(new FileWriter("E:\a.ini"), ""); 
        } 
    }

          例四:将一个班级的一些学生姓名以及成绩(语数外)从键盘输入以上数据,输入格式:zhangsan,30,40,60。并按总成绩从低到高进行排序,将信息写到硬盘上。

    package IO.Collection;
    
    import java.io.BufferedWriter;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.Comparator;
    import java.util.Scanner;
    import java.util.Set;
    import java.util.TreeSet;
    //描述一个学生类,为了使得学生本身具有比较小需要实现Comparable接口
    class Student implements Comparable<Student>{
        private String name;
        private int yw,sx,yy,sum;
        Student(){}
        Student(String name,int yw,int sx,int yy)
        {
            this.name=name;
            this.yw=yw;
            this.sx=sx;
            this.yy=yy;
            sum=yw+sx+yy;
        }
        
        public int hashCode() {
            return this.name.hashCode()+this.yy*10+this.sx*10+this.yw+10;
        }
        //复写equals
        public boolean equals(Object obj) {
            if(!(obj instanceof Student))
                return false;
            Student s=(Student) obj;
            return this.name.equals(s.name)&&(this.yw==s.yw)&&this.sx==s.sx&&this.yy==s.yy;
        }
        public String toString() {
            return name+":"+this.yw+","+this.sx+","+this.yy+","+this.sum;
        }
        //当总分相同时比较name
        public int compareTo(Student s) {
            int num=this.sum-s.sum;
            if(num==0)
            {
                return this.name.compareTo(s.name);
            }
            return num;
        }
    }
    public class StudentScore {
        //接受从键盘输入的学生姓名以及学生成绩
        static void input(Set<Student> stu){
            Scanner sc=new Scanner(System.in);
            while(true){
                String s=sc.nextLine();
                if(s.equals("over"))
                    return;
                String ss[]=s.split(",");
                //将学生对象添加到Set中,以便对对象进一步操作
                stu.add(new Student(ss[0],Integer.parseInt(ss[1]),Integer.parseInt(ss[2]),Integer.parseInt(ss[3])));
            }
        }
        //将set中排好顺序的学生写入到磁盘文件
        static void write2text(Set<Student> stu){
            try {
                BufferedWriter bw=new BufferedWriter(new FileWriter("D:\student.txt"));
                for(Student s:stu)
                {
                    bw.write(s.toString());
                    bw.newLine();
                    bw.flush();
                }
                bw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        public static void main(String[] args) {
            //因为学生类本身的比较性无法满足逆序排序,所以使用了自定义排序
            Set<Student> stu=new TreeSet<Student>(new Comparator<Student>(){
                public int compare(Student o1, Student o2) {
                    return o2.compareTo(o1);
                }
            });
            input(stu);
            write2text(stu);
        }
    }

    例五:请参考从"HM程序员"中截取2个字节是"HM",截取4个则是"HM程",截取3个字节也要是"HM"而不要出现半个中文

  • 相关阅读:
    HttpServer发送数据到kafka
    Leetcode[33]-Search in Rotated Sorted Array
    站在淘宝天猫两大平台背后的平台
    JSON格式的时间“/Date(1530104033000)/”格式转为正常的年-月-日 格式的代码
    火星坐标、百度坐标、WGS84坐标转换代码(JS、python版)
    echart 图例设置自定义图标?
    easyui datagrid实现拖动表头
    浮动闭合最佳方案:clearfix
    ASP.NET MVC提交LIST列表到后台接收不到数据
    mysql常用命令
  • 原文地址:https://www.cnblogs.com/yueyazhishang/p/4052058.html
Copyright © 2011-2022 走看看