前三篇文章详细介绍了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. 了解学习JS中this的指向

    [转] 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问 ...

  2. HDU3371 最小生成树

    Connect the Cities Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  3. xampp 80端口被占用解决办法

    很多朋友安装xampp之后,启用服务器或者数据库失败,发现端口已经被占用.因为每台电脑占用端口的软件不一样,要如何解决这个问题. 第一种解决方法: 检查软件安装路径中是否有中文,如下图: 解决方法: ...

  4. char和byte的区别

    char的字符数据类型,是无符号型的,占2个字节:大小范围是0-65535: byte是字节数据类型,是有符号型的,占1个字节:大小范围为-128-127: 1, char c1=3; char c= ...

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

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

  6. 用 Python 排序数据的多种方法

    用 Python 排序数据的多种方法 目录 [Python HOWTOs系列]排序 Python 列表有内置就地排序的方法 list.sort(),此外还有一个内置的 sorted() 函数将一个可迭 ...

  7. C++ 画星号图形——空心三角形(星号居中对齐)(核心代码介绍)

    //输出另外一种由星号组成的三角形(星号居中对齐) int a;//控制组成三角形的星号的行数 cout<<"请输入要组成三解形的星号的行数n(n>=2):\n" ...

  8. javascript 时间格式化

    添加扩展 //时间格式化扩展Date.prototype.format = function(format){ var o = { "M+" : this.getMonth()+1 ...

  9. java面试问题整理-垃圾回收

    对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址.大小以及使用情况.通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象,通过这种方式确定哪些对象是"可达的" ...

  10. 【emWin】例程三:显示方向的切换

    实验指导书及代码包下载: http://pan.baidu.com/s/1pK9o0xP