递归统计文件夹内视频文件的时长

1.源

在初学者的学习路上,遇到太多视频课程了,所以用自己有限的能力,写了个统计视频时长的程序,方便根据课时来安排选择课程。能力有限,并没有考虑效率优化。

2.功能

程序的核心是递归,传入文件夹的绝对地址,统计输出所有视频子文件的播放时长。

3.代码

import java.io.File;
import java.util.ArrayList;
import it.sauronsoftware.jave.Encoder;
import it.sauronsoftware.jave.EncoderException;
import it.sauronsoftware.jave.InputFormatException;
import it.sauronsoftware.jave.MultimediaInfo;


public class DurationStatictics4 {
	public static void main(String[] args) throws InputFormatException, EncoderException {
		MyFile my = new MyFile("dir", 0);
		System.out.println(my.toString(true));
	}

}

class MyFile {
	// 文件名
	String fileName;
	String shortName;
	// 持续时长,视频和文件夹为正数,其他为-1
	long time;
	// 文件层数
	int level;
	// 是否为文件夹
	boolean isDir;
	// 文件类型,视频为.mp4 .avi,其他为null
	String type;
	// 存储子文件,没有为null
	ArrayList<MyFile> fileList;

	// 根据文件名和层数创建文件
	public MyFile(String fileName, int level) throws InputFormatException, EncoderException {
		this.fileName = fileName;
		this.level = level;
		this.time = -1;
		this.init();
	}

	// 处理子文件,把子文件存入fileList
	private void initChildren(File src) throws InputFormatException, EncoderException {
		File[] fl = src.listFiles();
		this.fileList = new ArrayList<>();
		for (File tmp : fl) {
			MyFile newmy = new MyFile(this.fileName + "/" + tmp.getName(), this.level + 1);
			this.fileList.add(newmy);
		}
	}

	// 统计子文件时长
	private void staTime() {
		for (MyFile tmp : this.fileList) {
			if (tmp.time != -1) {
				this.time += tmp.time;
			}
		}
	}

	// 初始化类信息
	private void init() throws InputFormatException, EncoderException {
		File f = new File(this.fileName);
		this.shortName = f.getName();
		this.isDir = f.isDirectory();
		if (this.isDir) {
			// 文件夹
			this.type = null;
			// 处理子文件
			initChildren(f);
			// 统计子文件时长
			staTime();
		} else {
			// 文件
			this.type = fileType(this.fileName);
			this.fileList = null;
			if (this.type != null) {
				// 视频文件,处理时长
				Encoder encoder = new Encoder();
				MultimediaInfo mif = encoder.getInfo(f);
				this.time = mif.getDuration();
			}
		}
	}

	// 判断文件类型
	public static String fileType(String filename) {
		int i = filename.lastIndexOf('.');
		String type = filename.substring(i);
		if (type.equalsIgnoreCase(".mp4") || type.equalsIgnoreCase(".avi")) {
			return type;
		} else {
			return null;
		}
	}

	// 把时间转换为时分秒
	public String timeTrans() {
		StringBuilder sb = new StringBuilder();
		int hours = (int) this.time / 1000 / 60 / 60;
		int mins = (int) this.time / 1000 / 60 % 60;
		int secs = (int) this.time / 1000 % 60;
		sb.append(hours).append("h:").append(mins).append("m:").append(secs).append("s");
		return sb.toString();
	}

	@Override
	public String toString() {
		return this.toString(false);
	}

	// flag为true,则只输出视频文件
	public String toString(boolean flag) {
		if (this.time == -1 && flag) {
			// 非视频,非目录,不输出文件
			return "";
		}
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < this.level; i++) {
			sb.append("——");
		}
		if (this.isDir) {
			sb.append("【").append(this.shortName).append("】");
		} else {
			sb.append(this.shortName);
		}
		if (this.time != -1) {
			sb.append("--->").append(timeTrans());
		}
		sb.append("\t\n");
		if (this.fileList != null) {
			for (MyFile tmp : this.fileList) {
				sb.append(tmp.toString(flag));
			}
		}
		return sb.toString();
	}

}

4.输出

在这里插入图片描述

你可能感兴趣的:(Java,Eclipse)