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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章