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

上一篇:NFC(9)NDEF文本格式规范及读写示例(解析与封装ndef 文本)


下一篇:python基础之Day11