目录
序幕
详解
开发工具
简介
主线程代码
静态变量
复制指定文件的方法创建
分析并实现
在Main主线程中的使用
简单搬运
序幕
嗨嗨,我又来咯~
距离上一次发布已经有了很长一段时间,问我在干嘛?我在消磨人生,直到昨天,收到了来自父亲的这样一则要求:下载一些老歌存放到U盘中。
乍一听好像没啥问题,直到我下载了歌曲后去对应下载目录查看的时候,我震惊了,下载目录中的格式为什么这么多。图片的jpg,歌曲的mp3,还有我不认识的lrc文件。
现在很好的解决方案就是搜索后缀是.mp3的文件统一复制到一个新的目录,但是歌曲实在是多的令人发麻,32GB内存的U盘我下载了近30G的歌单,对于我的电脑来说,资源管理器搜索和复制的工作量可能会导致停止运行。于是我便想,为什么不靠Java来实现文件的搬运呢,省时省力还不用我自己每次亲自上手操作,于是这一Class文件就来了。
详解
对于不想进行观看的小伙伴们,可以直接拉到底部进行代码搬运,使用时只需要进行一些简单的修改即可使用。
开发工具
下面来介绍一些都需要哪些内容来进行开发编程
开发工具:任意一款Java开发工具,IDEA,Eclipse,VSCode,甚至是Txt
Jar包:我使用的JUnit4.13.2来代替了Main,可以把@Test注解的代码放进Main中进行执行,针对IO流的开发,使用commons-io.jar可以更加省时,但我更喜欢自己钻研。
简介
我们需要操作的很简单,只需要对IO流的简单了解即可,下面进入正题
主线程代码
针对引入文件目录和导出文件目录进行创建,使用new File简单形式来对其进行创建
File in = new File("D:\\Downloads\\导入目录");
File out = new File("D:\\Downloads\\导出目录");
导入目录一定是存在的,毕竟我们应该不会给一个不存在的目录来进行导入,那么这个in变量可以不用再管了,重要的是导出目录。
导出目录是不一定存在的,这时候我们就要对其判断目录的存在性,甚至需要判断这个名称是否是一个Directory而不是File。这里我只是判断了导出目录是否存在。
if (!out.exists()){
try {
out.mkdirs();
} catch (Exception e) {
e.printStackTrace();
}
}
静态变量
我在类文件中设置了一个静态变量来进行对歌曲数量的统计,简单的一行代码。
private static int count = 0;
复制指定文件的方法创建
由于我是为了搬运mp3歌曲,所以将方法名创建为saveMusic(File src, File dest),通过src和dest来进行源目录接入和目标目录输出,具体方法创建如下。
public static void saveMusic(File src, File dest) {}
分析并实现
1、创建存储指定后缀的字符串:String musicEndWiths = ".mp3"。
2、创建一个File[]数组来进行接收目录下的所有文件:File[] files = src.listFiles()。
3、通过foreach方法遍历所有文件,判断是否为目录,是的话自调用saveMusic方法,否则判断是否为文件且后缀与musicEndWiths相同,判定成功后进入下一项。
4、创建一个文件对象,路径为:目标路径+文件名new File(dest,file.getName())。
5、判断这个文件是否存在,这个地方是为了不重复保存相同的文件,仅有在文件不存在的时候才会创建文件进行使用mp3.createNewFile()。
6、创建Buffer缓冲字节输入输出流进行包装原始流,对歌曲文件进行提取和写入。
7、每次成功导入歌曲后执行count++操作来统计数据。
8、关闭所有的流对象。
public static void saveMusic(File src, File dest) {
String musicEndWiths = ".mp3";
File[] files = src.listFiles();
for (File file : files) {
if (file.isDirectory()) {
saveMusic(file, dest);
} else if (file.isFile() && file.getName().endsWith(musicEndWiths)) {
try {
File mp3 = new File(dest,file.getName());
if (mp3.exists()==false){
mp3.createNewFile();
BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(mp3));
byte[] buffer = new byte[(int)file.length()];
in.read(buffer);
out.write(buffer);
out.flush();
System.out.println("歌曲:" + mp3.getName() + "已成功添加!");
count++;
out.close();
in.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
在Main主线程中的使用
通过saveMusic(in, out)来进行方法的执行调用。
方法结束后使用System.out.printf("成功添加:" + count + " 首歌曲。")来看歌曲总数。
简单搬运
package com.cn.print;
import org.junit.Test;
import java.io.*;
public class Mp3Print {
private static int count = 0;
@Test
public void toMp3File() {
File in = new File("D:\\导入目录");
File out = new File("D:\\导出目录");
if (!out.exists()){
try {
out.mkdirs();
} catch (Exception e) {
e.printStackTrace();
}
}
saveMusic(in, out);
System.out.printf("成功添加:" + count + " 首歌曲。");
}
public static void saveMusic(File src, File dest) {
String musicEndWiths = ".mp3";
File[] files = src.listFiles();
for (File file : files) {
if (file.isDirectory()) {
saveMusic(file, dest);
} else if (file.isFile() && file.getName().endsWith(musicEndWiths)) {
try {
File mp3 = new File(dest,file.getName());
if (mp3.exists()==false){
mp3.createNewFile();
BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(mp3));
byte[] buffer = new byte[(int)file.length()];
in.read(buffer);
out.write(buffer);
out.flush();
System.out.println("歌曲:" + mp3.getName() + "已成功添加!");
count++;
out.close();
in.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}