二十一、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"而不要出现半个中文

原文地址:https://www.cnblogs.com/yueyazhishang/p/4052058.html