前三篇文章详细介绍了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"而不要出现半个中文