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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...