前三篇文章詳細介紹了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"而不要出現半個中文