二十一、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"而不要出现半个中文
二十一、Java基础--------IO流之综合案例分析的更多相关文章
- Java基础IO流(二)字节流小案例
JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...
- Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream)
Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我已经分享过很多的J ...
- Java基础-IO流对象之随机访问文件(RandomAccessFile)
Java基础-IO流对象之随机访问文件(RandomAccessFile) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.RandomAccessFile简介 此类的实例支持对 ...
- Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream)
Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内存 ...
- Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)
Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...
- Java基础-IO流对象之打印流(PrintStream与PrintWriter)
Java基础-IO流对象之打印流(PrintStream与PrintWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.打印流的特性 打印对象有两个,即字节打印流(P ...
- Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream)
Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对象的序 ...
- java基础-IO流对象之Properties集合
java基础-IO流对象之Properties集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Properties集合的特点 Properties类表示了一个持久的属性集. ...
- Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader)
Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符缓冲流 字符缓冲流根据流的 ...
随机推荐
- java 编码
编码和解码:无论是解码还是编码都是针对码表来讲的. 编码:将能看懂得字符变为我们看不懂的码值. 字符串--->字节数组 String类的getBytes() 方法进行编码,将字符串,转为对映的二 ...
- 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏(C#解法)
原题 看到那么多人看到前面这么糟粕的代码各种不忍直视后,楼主还是把最终实现放在页首吧. Console.WriteLine("说出三个不同的特殊数,用','隔开 &q ...
- php多图上传问题笔记
图片上传好用插件有,比如 uploadify ueditor html5的各种ajax上传插件,大部分都是异步,返回只是true之类,有些时候需要上传图片需要一起上传,其实可以通过操作流程来避免这个 ...
- HDU 3966 & POJ 3237 & HYSBZ 2243 树链剖分
树链剖分是一个很固定的套路 一般用来解决树上两点之间的路径更改与查询 思想是将一棵树分成不想交的几条链 并且由于dfs的顺序性 给每条链上的点或边标的号必定是连着的 那么每两个点之间的路径都可以拆成几 ...
- python 2.43 升级到2.7
[root@GW1 bin]# lsb_release -aLSB Version: :core-3.1-amd64:core-3.1-ia32:core-3.1-noarch:graphics-3. ...
- Apache Spark技术实战之9 -- 日志级别修改
摘要 在学习使用Spark的过程中,总是想对内部运行过程作深入的了解,其中DEBUG和TRACE级别的日志可以为我们提供详细和有用的信息,那么如何进行合理设置呢,不复杂但也绝不是将一个INFO换为TR ...
- 【Demo】QQ,github,微博第三方社交登录
本文主要讲解 集成 第三方社交账号登录 为什么会有这个需求? 主要是因为目前互联网的网站数量太多,如果在各个站点都注册一个账号 用户非常不容易记住每个账号的用户名和密码,并且非常难保证每个账号的密码足 ...
- 关于新版ADT创建项目时出现appcompat_v7的问题
做Android开发的朋友最近会发现,更新ADT至22.6.0版本之后,创建新的安装项目,会出现appcompat_v7的内容.并且是创建一个新的内容就会出现.这到底是怎么回事呢?原来appcompa ...
- asp.net 重定向的三种方法
1.Server.Transfer("URL"): 服务器停止解析本页,保存此页转向前的数据后,再使页面转向到newPage.aspx, 并将转向前数据加上newPage.aspx ...
- jquery复习笔记
Jquery基础 让一个按钮灰掉 $("button").("disabled","true"); ance desc选择器(ance代表祖 ...