Java用來進行批量文件重命名,批量提取特定類型文件

来源:http://www.cnblogs.com/greatfish/archive/2016/08/29/5816519.html
-Advertisement-
Play Games

原因: 因為在網上下載視頻教程,有的名字特別長,一般都是機構或者網站的宣傳,不方便直接看到視頻的簡介,所以做了下麵的第一個功能。 因為老師發的課件中,文件夾太多,想把docx都放在同一個文件夾下麵,一個一個找出來太麻煩,所以做了第二個功能。 最近剛剛學了Java文件和流的知識,所以正好練練手,這也是 ...



原因:

  因為在網上下載視頻教程,有的名字特別長,一般都是機構或者網站的宣傳,不方便直接看到視頻的簡介,所以做了下麵的第一個功能。
  因為老師發的課件中,文件夾太多,想把docx都放在同一個文件夾下麵,一個一個找出來太麻煩,所以做了第二個功能。

      最近剛剛學了Java文件和流的知識,所以正好練練手,這也是自己的第一個exe程式,分享一下哈。

  (導出jar文件,以及用工具exe4j生成exe文件,這部分省略了哈)

 

用到的知識:

  用到Java中文件,流的知識,以及簡單的GUI知識。

功能:

   功能一去除文件名字的某些關鍵字,也可以設置代替字。

   功能二:提取一個路徑下麵所有特定類型的文件,然後放在一個新的文件夾下麵,如果有重覆的文件,則自動排序在後面加數字來區分。

先看下啟動後的界面和生成的exe文件:

第一個功能演示:

  沒有操作前的:

 

  操作後:把前面部分相同關鍵字全部去掉了

 

  還有撤回功能:

第二個功能演示:

  沒有操作前:

  操作後:

  當然,也有撤回功能

 

源代碼分析:

啟動類:

package guuze;

public class Test {

    public static void main(String[] args) {
        //啟動GUI,即用戶界面
        new ShowGui();
    }
}

 

 顯示GUI類:

 

package guuze;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class ShowGui {
    private JFrame f;
    private JButton b1;
    private JButton b2;
    private JButton b3;
    private JTextField tf1;
    private JTextField tf2;
    private JTextField tf3;

    private JButton b4;
    private JButton b5;
    private JButton b6;
    private JTextField tf4;
    private JTextField tf5;
    private JTextField tf6;

    private static String s1;

    public ShowGui() {
        // 直接調用
        startGui();
    }

    public void startGui() {
        f = new BgSet();// 用來設置背景圖片
        f.setLayout(new FlowLayout());
        Image icon = Toolkit.getDefaultToolkit().getImage("image/4.jpg");// 設置左上角logo圖標
        f.setIconImage(icon);
        // 6個按鈕
        b1 = new JButton("開始");
        b2 = new JButton("撤回");
        b3 = new JButton("退出");
        b4 = new JButton("一鍵提取");
        b5 = new JButton("撤回");
        b6 = new JButton("退出");
        // 6個按鈕的大小
        b1.setPreferredSize(new Dimension(89, 39));
        b2.setPreferredSize(new Dimension(89, 39));
        b3.setPreferredSize(new Dimension(89, 39));

        b4.setPreferredSize(new Dimension(89, 39));
        b5.setPreferredSize(new Dimension(89, 39));
        b6.setPreferredSize(new Dimension(89, 39));
        // 6個 文本框的大小以及輸入字體的屬性
        tf1 = new JTextField("Please input absolute_path", 40);
        tf1.setFont(new Font("宋體", Font.PLAIN, 25));
        tf1.setBounds(200, 15, 550, 126);

        tf2 = new JTextField("Please input keyWords", 40);
        tf2.setFont(new Font("宋體", Font.PLAIN, 25));
        tf2.setBounds(200, 15, 550, 126);

        tf3 = new JTextField("Please input replaceWords", 40);
        tf3.setFont(new Font("宋體", Font.PLAIN, 25));
        tf3.setBounds(200, 15, 550, 126);

        tf4 = new JTextField("Please input absolute_path", 40);
        tf4.setFont(new Font("宋體", Font.PLAIN, 25));
        tf4.setBounds(200, 15, 550, 126);

        tf5 = new JTextField("Please input target_path", 40);
        tf5.setFont(new Font("宋體", Font.PLAIN, 25));
        tf5.setBounds(200, 15, 550, 126);

        tf6 = new JTextField("Please input filetype", 40);
        tf6.setFont(new Font("宋體", Font.PLAIN, 25));
        tf6.setBounds(200, 15, 550, 126);
        // 把按鈕和文本框添加上
        f.add(tf1);
        f.add(tf2);
        f.add(tf3);
        f.add(b1);
        f.add(b2);
        f.add(b3);

        f.add(tf4);
        f.add(tf5);
        f.add(tf6);
        f.add(b4);
        f.add(b5);
        f.add(b6);
        // 調用事件監聽函數
        myEvent();
        f.setVisible(true);
    }

    private void myEvent() {
        // 點擊右上角×退出
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        // 點擊第一個按鈕的響應事件
        b1.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                s1 = tf1.getText();
                // 對文本框內值進行判斷,如果什麼也沒寫,當做空處理,以下的類似
                if (s1.equals("Please input path")) {
                    s1 = "";
                }
                File file = new File(s1);
                String test[];
                test = file.list();
                RenameFunction.test1 = test;
                String s2 = tf2.getText();
                if (s2.equals("Please input replaceWords")) {
                    s2 = "";
                }
                String s3 = tf3.getText();
                if (s3.equals("Please input replaceWords")) {
                    s3 = "";
                }
                try {
                    // 啟動重命名函數
                    RenameFunction.sure(s1, s2, s3);
                } catch (Exception e1) {
                }
            }
        });
        // 點擊第二個按鈕的響應事件
        b2.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                try {
                    try {
                        if (!s1.equals("Please input path")) {
                            // 啟動撤回
                            RevokeRename.revoke(s1);
                        }
                    } catch (Exception e2) {
                    }
                } catch (Exception e1) {
                }
            }
        });
        // 點擊第三個按鈕的響應事件
        b3.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                System.exit(0); // 退出
            }
        });
        // 點擊第四個按鈕的響應事件
        b4.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {

                String s2 = tf4.getText();
                String s3 = tf5.getText();
                String s4 = tf6.getText();

                if (s2.equals("Please input absolute_path")) {
                    s2 = "";
                }
                if (s3.equals("Please input target_path")) {
                    s3 = "";
                }
                if (s4.equals("Please input filetype")) {
                    s4 = "";
                }
                // 啟動文件搜索函數
                SearchFileFunction.startCopy(s2, s3, s4);
            }
        });
        // 點擊第五個按鈕的響應事件
        b5.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                String s2 = tf5.getText();
                // 啟動撤回函數
                RemoveTargetFile.startDelete(s2);
            }
        });
        // 點擊第六個按鈕的響應事件
        b6.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                System.exit(0); // 退出
            }
        });
    }
}

 

 GUI背景圖片設置類:

package guuze;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class BgSet extends JFrame {
    private static final long serialVersionUID = 1L;

    public BgSet() {
        // 設置標題
        super("GreatFish");
        setBounds(100, 100, 600, 600);
        // 背景圖片的路徑。
        String path = "image/3.jpg";
        ImageIcon background = new ImageIcon(path);
        JLabel label = new JLabel(background);
        label.setBounds(0, 0, this.getWidth(), this.getHeight());
        JPanel imagePanel = (JPanel) this.getContentPane();
        imagePanel.setOpaque(false);
        this.getLayeredPane().add(label, new Integer(Integer.MIN_VALUE));
    }
}

 

 文件重命名類:

package guuze;

import java.io.File;
import java.util.Scanner;

public class RenameFunction {
    static Scanner input = new Scanner(System.in);
    public static String test1[];

    public static void sure(String s1, String s2, String s3) throws Exception {
        File file = new File(s1);
        String test[];
        test = file.list();
        // 遍歷文件的名字
        for (int i = 0; i < test.length; i++) {
            // 判斷是不是有你想去除的關鍵字
            if (test[i].indexOf(s2) != -1) {
                // 保存重命名後的文件名
                test[i] = test[i].replace(s2, s3);
            }
        }

        File[] files = file.listFiles();
        for (int i = 0; i < test.length;) {
            for (File f : files) {
                if (f.isFile()) {
                    // 迴圈賦重命名後的名字
                    f.renameTo(new File(s1 + "/" + test[i++]));
                }
            }
        }
    }
}

文件重命名撤回函數類:

package guuze;

import java.io.File;

public class RevokeRename {
    public static void revoke(String s1) throws Exception {
        // 重新賦回原來的名字
        File file = new File(s1);
        File[] files = file.listFiles();
        for (int i = 0; i < RenameFunction.test1.length;) {
            for (File f : files) {
                if (f.isFile()) {
                    // 註意是test1
                    f.renameTo(new File(s1 + "/" + RenameFunction.test1[i++]));
                }
            }
        }
    }
}

文件複製類:

package guuze;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class SearchFileFunction {
    static int count = 1;

    public static void startCopy(String source_path, String target_path,
            String file_Type) {
        // 啟動迴圈函數
        xunHuan(source_path, target_path, file_Type);
    }

    public static void xunHuan(String source_path, String target_path,
            String file_Type) {
        File file = new File(source_path);
        String names[] = file.list();
        // 判斷是不是文件以及是否以你想要的文件類型結尾
        if (file.isFile() && file.getAbsolutePath().endsWith(file_Type)) {
            String new_path = target_path + "/" + file.getName();
            File file1 = new File(new_path);
            if (!file1.exists()) {
                try {
                    file1.createNewFile();
                } catch (IOException e) {
                }
            } else {
                // 如果文件名字相同,在點前面加數字進行區分
                // 註意用\\.進行分隔,而不是.
                String[] arr = new_path.split("\\.");
                String new_path1 = arr[0] + count + "." + arr[1];
                file1.renameTo(new File(new_path1));
            }
            // 是文件,所以開始複製文件
            fileCopyByBufferStreamArray(file.getAbsolutePath(), new_path);
        }

        else if (file.isFile() && !file.getAbsolutePath().endsWith(file_Type)) {
            // 註意這個方法體中什麼都不寫,就是不做處理
        } else {
            for (int i = 0; i < names.length; i++) {
                // 不是文件,進行迭代
                xunHuan(file.getAbsolutePath() + "/" + names[i], target_path,
                        file_Type);
            }
        }
    }

    public static void fileCopyByBufferStreamArray(String srcFile,
            String targetFile) {
        // 用流的知識進行寫文件
        File file = new File(srcFile);
        File file1 = new File(targetFile);
        FileInputStream fis = null;
        FileOutputStream fos = null;
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            fis = new FileInputStream(file);
            fos = new FileOutputStream(file1);
            bis = new BufferedInputStream(fis);
            bos = new BufferedOutputStream(fos);
            int len = 0;
            byte[] b = new byte[10];
            while ((len = bis.read(b)) != -1) {
                bos.write(b, 0, len);
            }
            bos.flush();
        } catch (IOException e) {
        } finally {
            try {
                fis.close();
                fos.close();
                bis.close();
                bos.close();
            } catch (IOException e) {
            }
        }
    }
}

文件複製撤回類:

package guuze;

import java.io.File;

public class RemoveTargetFile {

    public static void startDelete(String path) {
        File file = new File(path);
        deleteFile(file);
    }

    private static void deleteFile(File file) {
        // 記住不要把路徑的那個文件夾刪掉了
        if (file.exists()) {
            if (file.isFile()) {
                // 是文件,直接刪除
                file.delete();
            } else if (file.isDirectory()) {
                File[] files = file.listFiles();
                for (int i = 0; i < files.length; i++) {
                    // 如果不是文件,進行迭代
                    deleteFile(files[i]);
                }
            }
        }
    }
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天閑著沒事,研究了一下線上更新程式版本的問題。也是工作中的需要,開始不知道如何下手,各種百度也沒有找到自己想要的,因為我的需求比較簡單,所以就自己琢磨了一下。講講我的需求吧。自己在IIs上發佈了一個網站,這個網站僅僅只是內部使用的,網站的內容就是我的另外一個程式(就叫A程式吧)的打包發佈的文件放進 ...
  • 《C#基礎知識鞏固》 一、特性是什麼東東 二、什麼是反射、反射可以做些什麼 三、依賴註入是什麼 四、可空類型Nullable<T>到底是什麼鬼 五、談擴展方法的理解 六、你必須知道的EF知識和經驗【推薦】 七、你知道C#中的Lambda表達式的演化過程嗎 八、Linq表達式、Lambda表達式你更喜 ...
  • 註:本組件適用於.net2.0+的winform項目 樣子: 實際效果比這gif順滑,建議下載文末的Tester體驗 介紹: 如圖所見,這種提示在網頁、手機上用的較多,相比正經的消息框(如MessageBox),我認為好處有: 不需要用戶對消息本身做出響應,點啥【確定】什麼的 不阻塞、不幹預用戶的後 ...
  • Quart 的 API Quartz API 中的關鍵介面和類如下: IScheduler—與調度器(scheduler)進行交互的主要 API; IJob—被組件繼承和實現,由調度器來執行的介面; IJobDetail—通常被用於定義任務實例; ITrigger—對於給定的任務定義出了它將被執行的... ...
  • Linq的好處非常明顯,不僅把資料庫訪問層真正做到面向對象,而且也可以把系統的許可權封裝到資料庫訪問層去了。 微軟目前穩定的Linq框架是Entity Framework 6.1,我自己編寫了一個資料庫工具Mr.E,可以用來設計資料庫結構,並且把資料庫結構編譯成Entity Framework的對象, ...
  • C# 為支持LINQ添加了許多語言特性: 隱式類型局部變數 對象初始化器 Lambda表達式 擴展方法 匿名類型 瞭解這些新特性是全面瞭解LINQ的重要先解條件,因此請不要忽視它們. (一) 隱式類型局部變數 processData這個類中的亮點是 {get;set;} 它是一個新特性, 系統會自動 ...
  • 摘一段模式的說明, F#的: msdn是這麼描述它的:“模式”是用於轉換輸入數據的規則。模式將在整個 F# 語言中使用,採用多種方式將數據與一個或多個邏輯結構進行比較、將數據分解為各個構成部分,或從數據中提取信息。 模式匹配自有其定義,同時也有很多種類,這裡針對相對複雜的【結構比較】和【數據抽取】進 ...
  • 早上下起了暴雨 鬧鐘還未響起就聽到雨滴嘩啦啦擊打窗戶的聲音,被吵醒了。起床上班,在樓下的十字路口,暴雨大到完全看不清對面,兩個穿著雨衣的交警站在路口中間指揮著過往的車輛,大家都慌慌張張、急急忙忙的打著各式各樣的雨傘在走,有的往地鐵站,有的往公交站,而我,站在樓下等車來... 這是前兩天的看到了,不是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...