Java技术之提取指定文件

2023-11-10

 

 

目录

 序幕

详解

开发工具

简介

主线程代码

静态变量

 复制指定文件的方法创建

分析并实现

在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();
                }
            }
        }
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java技术之提取指定文件 的相关文章

随机推荐

  • Android APK安装完成自动删除安装包

    需要实现此功能 一般实际开发是在自动版本更新上 当更新完开始自动安装完毕后 删除内存卡里的安装包 实现方式很简单 监听应用广播 获取内存卡下的文件 删除 1 监听广播 java view plain copy package com exa
  • 数据库系统原理课程总结8——备份与日志初步、并发模拟实验

    一 备份与日志初步实验 1 了解你所使用的数据库平台的单表数据备份和整库备份方法 进行相应备份操作 并尝试利用备份数据在另一个机器上恢复数据 并在实验报告中描述上述过程 答 首先 在MySQL中使用mysqldump将数据库的单表数据以sq
  • Hutool(Excel工具使用)

    Hutool Excel工具使用 官方文档Hutool 目录 基本依赖的导入 Writer方法的使用 1 1 写出List数据 1 2 写出Map数据 1 3 写出我们的Bean对象 1 4 自定义Bean的key别名 1 5 写出到IO流
  • LeetCode-116.填充每个节点的下一个右侧节点指针、深度优先搜索

    题目分析 广度优先搜索 题目要求把二叉树中每一层的的节点连起来 最简单的方法即 BFS 按层的顺序的对树进行遍历 但需要使用 queue 数据结构 空间复杂度为 O N 不符合题目要求 深度优先搜索 由于 next 指针的存在 可以实现对二
  • Unity WorldToScreenPoint坐标变换

    功能 实现标签跟随物体运动 标签是一个Prefab 由底图和文字组成 Dota2中英雄血条的实现也是这种原理 说到底就是标签根据物体位置不间断刷新自己的坐标值 3D gt 2D gt 3D 先来了解一下Unity D中的坐标系统 1 Wor
  • 前台页面上传data image图片,java后台接收图片保存

    最近在项目中有这么一个需求 就是上传一个视频文件 然后要获取视频文件的第一帧图片 这个可以通过canvas获取得到 得到的是一个dataURL 之后还要将这个图片上传到云 这个时候如何操作就不清楚了 于是乎 google一番 总结如下 将d
  • Redis源码分析(三)—— 字典的设计与实现

    前言 字典是一种用于保存键值对的数据结构 Redis数据库使用字典做为底层实现 字典也是哈希键的底层实现之一 C语言中并没有内置字典这个数据结构 Redis自己实现了字典 以下结合源码分析Redis字典的设计与实现 源码版本 Redis 6
  • java执行linux命令:head -n 80 /dev/urandom

    看了微信小程序api后 发现登录Logo接口需要处理随机key 所以着手处理了一下 直接贴代码 先运行命令 让其生成168位随机数 private static String wxSessionkey F3UENUg3JcI31O2RpoB
  • weex实现带有跟手动画的tab栏

    在weex开发的群中看到有人提到这个问题 就想着去实现以下 还不是很完美 只支持一屏的tab栏内容 后续会进行优化 2019 6 20 更新 已支持滚动跟手 可以超出屏幕 2019 6 23 更新 解决子元素包含滚动标签时无法滑动切换的问题
  • Poppuwindow的简单使用

    继 DialogFragment的简单使用 之后 我们再来试试 Poppuwindow 的简单使用 切记 本篇博客只能保证你入门哦 适合小白学习 效果展示 1 几个常用的构造方法 public PopupWindow Context con
  • 什么是压力测试?如何进行Jmeter压力测试

    一 什么是压力测试 软件测试中 压力测试 Stress Test 也称为强度测试 负载测试 压力测试是模拟实际应用的软硬件环境及用户使用过程的系统负荷 长时间或超大负荷地运行测试软件 来测试被测系统的性能 可靠性 稳定性等 常用的压力测试软
  • 因果学习论文阅读

    论文阅读 因果机器学习的前沿进展综述 Overview of the Frontier Progress of Causal Machine Learning 因果概念 提出因果旨在解决虚假相关的问题 相关只需要保持两个变量的分布相同 而因
  • python中的CSV 工具类

    CSV工具类是Python中的自带包 用来解析CSV文件 实例化一个CSV对象 需要传入一个CSV文件的路径 with open case csv as casefile csv DictReader 将CSV读取成字典的形式 rows2
  • Python练习(二)

    目录 列表元素计算 字典最大值 输出一串字符对应的Unicode值 列表基本操作 元素增加 删除 字典值求和 习题 列表元素计算 描述 从键盘输入一个列表 计算输出列表元素的平均值 请完善代码 def mean numlist s 0 0
  • opencv+matlab双目标定(python版)

    采集的图像用opencv自带程序识别不出棋盘格角点 可能是因为分辨率太低了 好在MATLAB标定工具箱可以正常使用 不过获得的标定参数导入opencv之后需要转置 记录一下官方自带实例的方法免得以后忘了 1 MATLAB标定 导入左右相机图
  • 【uniapp关联unicloud,阿里云云服务空间】unicloud本地调试服务启动失败:当前项目未关联unicloud服务空间,请调整后重新运行,已解决

    最近开发app项目 很多都是第一次上手 1 在Hbuider中运行项目 出现如下提示 2 项目根目录下已有uniCloud文件夹 3 如果云开发环境未创建 可以右击项目 选择创建uniCloud云开发环境 4 创建好的目录如下 index
  • DES 数据加密标准 结构详解

    DES Data Encryption Standard 又称数据加密标准 是一种对称加密算法 也是密码学摆脱古典流加密后最简单的一种块加密算法 由于香农与1949年提出 完善保密性 该标准要求密钥长度不短于明文长度 实际操作难以达到 因此
  • 黑白棋子问题

    黑白棋子问题 1 问题描述 两个人下棋 一方执黑棋 一方执白棋 要求双方轮流下子 给出两种情况的解决办法 1 执黑子一方先下 2 双方都可以先下 谁先抢到棋盘谁先下 2 解决 情况 1 信号量 bfg 1 wfg 0 注意信号量及初值的设置
  • 一个顽疾——QT不能包含tslib的头和库文件联合编译的解决方法

    先介绍一下我的交叉编译环境 OS是Fedora9 交叉编译器是arm linux gcc 4 3 3 arm 2009q1 其它 tslib 1 4 QT4 7 2 硬件平台Omap3530 以前我的交叉编译器使用的是arm linux g
  • Java技术之提取指定文件

    目录 序幕 详解 开发工具 简介 主线程代码 静态变量 复制指定文件的方法创建 分析并实现 在Main主线程中的使用 简单搬运 序幕 嗨嗨 我又来咯 距离上一次发布已经有了很长一段时间 问我在干嘛 我在消磨人生 直到昨天 收到了来自父亲的这