前三篇文章详细介绍了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中addEventListener中第3个参数

    addEventListener中的第三个参 数是useCapture, 一个bool类型.当为false时为冒泡获取(由里向外),true为capture方式(由外向里). <div id=& ...

  2. HTLM5表单

    1.HTML5占位符文本   使用placeholder可以给文本框,搜索框添加提示性文本 <input type="text" name="url" p ...

  3. 【转】 Camera模仿3D效果的小例子(图片无限旋转)

    import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactor ...

  4. STL之list

    list是一个线性链表结构,它的数据由若干个节点构成,每一个节点都包括一个信息块,一个前驱指针和一个后驱指针.它无需分配指定的内存大小且可以任意伸缩,这是因为它存储在非连续的内存空间中,并且由指针将有 ...

  5. JavaScript之数组方法整理

    Array概述      除了Object类型,最常用的类型:      实质:有序的数据列表,      特性:可以动态的调整数组的大小 创建数组的两种方式 构造函数创建方式  var arr = ...

  6. QT的程序开机自启动方法

    /home/fa/.config/lxsession/LXDE/autostart文件最后添加脚本

  7. Apache配置过程

    要在一台主机上搭建多个网站,最简单的办法就是给不同的网站分配不一样的端口.下面我以Ubuntu 14.04 + Apache 2.4.7为例说一下在搭建过程中的一些注意事项. 1. 主配置文件是/et ...

  8. 对接第三方支付接口-获取http中的返回参数

    这几天对接第三方支付接口,在回调通知里获取返回参数,有一家返回的json格式,请求参数可以从标准输入流中获取. //1.解析参数 , 读取请求内容 BufferedReader br; String ...

  9. Thinking in Java——笔记(11)

    Holding Your Objects In general, your programs will always be creating new objects based on some cri ...

  10. VSCODE 插件初探

    写在前面 分享一个vscode插件background(用于改变背景).点击直接跳到vscode插件开发步骤 做vscode的插件,很久就有这个想法了,但是一直因为这样,那样的事情耽误,放弃了N次.不 ...