前三篇文章详细介绍了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流之综合案例分析的更多相关文章

  1. Java基础IO流(二)字节流小案例

    JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...

  2. Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream)

    Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我已经分享过很多的J ...

  3. Java基础-IO流对象之随机访问文件(RandomAccessFile)

    Java基础-IO流对象之随机访问文件(RandomAccessFile) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.RandomAccessFile简介 此类的实例支持对 ...

  4. Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream)

    Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内存 ...

  5. Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)

    Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...

  6. Java基础-IO流对象之打印流(PrintStream与PrintWriter)

    Java基础-IO流对象之打印流(PrintStream与PrintWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.打印流的特性 打印对象有两个,即字节打印流(P ...

  7. Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream)

    Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对象的序 ...

  8. java基础-IO流对象之Properties集合

    java基础-IO流对象之Properties集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Properties集合的特点 Properties类表示了一个持久的属性集. ...

  9. Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader)

    Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符缓冲流 字符缓冲流根据流的 ...

随机推荐

  1. windows 安装MySql

    转载:http://blog.csdn.net/longyuhome/article/details/7913375 Win7系统安装MySQL5.5.21图解 大家都知道MySQL是一款中.小型关系 ...

  2. MVC入口程序 | 简单调用及实例化

    入口程序: 现在大多采用单一入口机制,单一入口就是指在一个web应用程序中,所有的请求都指向一个脚本文件.通俗点说就是一幢大楼只有一个大门入口可以进去... 目录: 建立一个控制器/模型/视图调用函数 ...

  3. IE8浏览器不能识别CSS伪类的解决办法。

    1. 方法一:开头加上这两句 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt ...

  4. 谢欣伦 - OpenDev原创教程 - 本地IP查找类CxLocalHostIPAddrFind

    这是一个精练的本地IP查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxLocalHostIPAddrFind的使用如下: ...

  5. CSS 学习笔记

    0.CSS概念层叠样式表(Cascading Style Sheets),CSS的来历就不必多说了.可以简单的理解为万维网联盟(w3c)为了丰富HTML页面的布局和外观而指定的一种标准. 1.CSS实 ...

  6. VIM键盘映射 (Map)~转载

    VIM键盘映射 (Map) 设置键盘映射 使用:map命令,可以将键盘上的某个按键与Vim的命令绑定起来.例如使用以下命令,可以通过F5键将单词用花括号括起来: :map <F5> i{e ...

  7. [react-router] hashHistory 和 browserHistory 的区别

    react-router提供了三种方式来实现路由,并没有默认的路由,需要在声明路由的时候,显式指定所使用的路由. //v1.x <Router/> //v2.0.0 // hash his ...

  8. Software Solutions CACHE COHERENCE AND THE MESI PROTOCOL

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION Software cache cohere ...

  9. Cookie和Session的区别详解

    本文引用自:http://www.cnblogs.com/shiyangxt/archive/2008/10/07/1305506.html 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一 ...

  10. oracle+servlet+extjs4 分页表格布局示例代码

    Log.java package com.example.entity; import java.util.Date; public class Log { private int id; priva ...