Java的的簡單線程複製文件工具類FileUtil2.0

来源:http://www.cnblogs.com/jxlys/archive/2017/12/24/8098092.html
-Advertisement-
Play Games

相對於版本1.0,多了很多方法, 比如,獲取文件的尾碼名,或修改尾碼名和一些文件的簡單操作。 文件複製到文件,文件複製到路徑,路徑下文件複製到新路徑下, 代碼如下,請享用: 組合併且封裝了File的一些方法,文件路徑就是File對象。 上邊都是字元流,至於線程開啟字元流的的運算,加油,你可以的。 ...


相對於版本1.0,多了很多方法,

比如,獲取文件的尾碼名,或修改尾碼名和一些文件的簡單操作。

文件複製到文件,文件複製到路徑,路徑下文件複製到新路徑下,

代碼如下,請享用:

  1 package cn.util;
  2 
  3 import java.io.*;
  4 
  5 /**
  6  * 線程的方式實現文件的複製。
  7  文件的複製需要四個參數:1,路徑或文件),2路徑或文件,3,是否覆蓋,4,是否追加,
  8 多文件複製還需要加時間參數(毫秒).
  9  * 以及File類實例的簡單創建,
 10  * 
 11  * @version 2
 12  * @author JXLYS
 13  */
 14 public class FileUtil extends Thread {
 15 
 16     static class FileUtilHelp {//輔助類
 17 
 18         private static FileUtil[] farr = new FileUtil[5];// 線程數量(java預設線程最多10)
 19 
 20         // 創建文件並複製
 21         private static void createFileAndCopy(File f1, File f2, boolean override, boolean append) {
 22             if (!f2.exists()) {
 23                 createFile(f2, override);
 24             } else {
 25                 if (!override)
 26                     return;
 27                 else {
 28                     append = false;// 覆蓋必然不會追加
 29                 }
 30             }
 31             FileUtilHelp.createThread(f1, f2, append);
 32         }
 33 
 34         private static void createCopy(InputStream is, OutputStream os) {
 35             int i = 0;
 36             for (FileUtil f : farr) {
 37                 if (f == null || !f.isAlive()) {
 38                     farr[i] = new FileUtil();
 39                     farr[i].setInputStreamAndOutputStream(is, os);
 40                     farr[i].start();
 41                 }
 42                 i++;
 43             }
 44         }
 45 
 46         // 創建路徑
 47         private static void createMkdirs(String path) {
 48             File f = new File(path);
 49             if (!f.exists()) {
 50                 f.mkdirs();
 51             }
 52         }
 53 
 54         // 開始線程
 55         private static void createThread(File f1, File f2, boolean append) {
 56             int i = 0;
 57             for (FileUtil f : farr) {
 58                 if (f == null || !f.isAlive()) {
 59                     farr[i] = new FileUtil();
 60                     farr[i].copyThread(f1, f2, append);
 61                     farr[i].start();
 62                 }
 63                 i++;
 64             }
 65         }
 66 
 67     }
 68 
 69     /**
 70      * 複製文件1到文件2(可以創建路徑)
 71      * 
 72      * @param f1
 73      *            文件對象
 74      * @param f2
 75      *            文件對象
 76      * @param override
 77      *            是否覆蓋
 78      * @param append
 79      *            是否追加文件內容
 80      */
 81     public static void copyFile(File f1, File f2, boolean override, boolean append) {
 82         if (exists(f1)) {
 83             FileUtilHelp.createMkdirs(parent(f2));
 84             FileUtilHelp.createFileAndCopy(f1, f2, override, append);
 85         }
 86     }
 87 
 88     /**
 89      * 複製文件1到文件2(可以創建路徑)
 90      * 
 91      * @param fileName
 92      *            文件1
 93      * @param fileName2
 94      *            文件2
 95      * @param override
 96      *            是否覆蓋
 97      */
 98     public static void copyFile(String fileName, String fileName2, boolean override, boolean append) {
 99         copyFile(newFile(fileName), newFile(fileName), override, append);
100     }
101 
102     /**
103      * 複製文件到指定路徑(可創建路徑)
104      * 
105      * @param f1
106      *            文件
107      * @param f2
108      *            文件夾
109      * @param override
110      *            是否覆蓋
111      * @param append
112      *            是否追加
113      * @return
114      */
115     public static void copyFileToPath(File f1, File f2, boolean override, boolean append) {
116         copyFile(f1, newFile(f2.getAbsolutePath(), f1.getName()), override, append);
117     }
118 
119     /**
120      * 根據流來複制。
121      * 
122      * @param is
123      *            輸入流
124      * @param os
125      *            輸出流
126      */
127     public static void copyFile(InputStream is, OutputStream os) {
128         FileUtilHelp.createCopy(is, os);
129     }
130 
131     /**
132      * 複製文件到指定路徑(可創建路徑)
133      * 
134      * @param fileName
135      *            文件名
136      * @param path
137      *            路徑
138      * @param override
139      *            覆蓋
140      * @param append
141      *            是否追加
142      */
143     public static void copyFileToPath(String fileName, String path, boolean override, boolean append) {
144         copyFileToPath(newFile(fileName), newFile(path), override, append);
145     }
146 
147     /**
148      * 複製指定路徑下所有文件到指定路徑(建議大文件不要太多)
149      * 
150      * @param f1
151      *            文件對象
152      * @param f2
153      *            文件對象
154      * @param override
155      *            是否覆蓋
156      * @param append
157      *            是否追加
158      * @param time
159      *            複製每個文件的間隔
160      */
161     public static void copyPathToPath(File f1, File f2, boolean override, boolean append, long time) {
162         if (exists(f1) && isDirectory(f1)) {
163             File[] farr = f1.listFiles();
164             for (File f : farr) {
165                 try {
166                     Thread.sleep(time);// 一次性複製超過5個,線程支持不住,慢點也不影響性能。
167                 } catch (InterruptedException e) {
168                     e.printStackTrace();
169                 }
170                 copyFileToPath(f, f2, override, append);
171             }
172         }
173     }
174 
175     /**
176      * 複製指定路徑下所有文件到指定路徑(大文件需要更多時間。)
177      * 
178      * @param path1
179      *            路徑
180      * @param path2
181      *            路徑
182      * @param override
183      *            是否覆蓋
184      * @param append
185      *            是否追加
186      * @param time
187      *            複製每個文件的間隔
188      */
189     public static void copyPathToPath(String path1, String path2, boolean override, boolean append, long time) {
190         copyPathToPath(newFile(path1), newFile(parent(newFile(path1)), path2), override, append, time);
191     }
192 
193     /**
194      * 創建目錄
195      * 
196      * @param f
197      */
198     public static void createDire(File f) {
199         FileUtilHelp.createMkdirs(f.getAbsolutePath());
200     }
201 
202     /**
203      * 根據路徑創建目錄
204      * 
205      * @param path
206      */
207     public static void createDire(String path) {
208         createDire(newFile(path));
209     }
210 
211     /**
212      * 不覆蓋的創建文件
213      * 
214      * @param f
215      */
216     public static void createFile(File f) {
217         createFile(f, false);
218     }
219 
220     /**
221      * 創建文件
222      * 
223      * @param f
224      *            文件對象
225      * @param override
226      *            是否覆蓋
227      */
228     public static void createFile(File f, boolean override) {
229         FileUtilHelp.createMkdirs(parent(f));
230         if (override) {
231             f.delete();
232         }
233         if (!exists(f)) {
234             try {
235                 f.createNewFile();
236             } catch (IOException e) {
237                 e.printStackTrace();
238             }
239         }
240     }
241 
242     /**
243      * 不覆蓋的創建文件
244      * 
245      * @param f
246      */
247     public static void createFile(String fileName) {
248         createFile(fileName, false);
249     }
250 
251     /**
252      * 創建文件
253      * 
254      * @param fileName
255      *            創建文件
256      * @param override
257      *            是否覆蓋
258      */
259     public static void createFile(String fileName, boolean override) {
260         createFile(newFile(fileName), override);
261     }
262 
263     /**
264      * 檢測文件對象是否存在
265      * 
266      * @param f
267      */
268     public static boolean exists(File f) {
269         return f.exists() ? true : false;
270     }
271 
272     /**
273      * 檢測路徑是否存在
274      * 
275      * @param f
276      */
277     public static boolean exists(String fileName) {
278         return exists(new File(fileName));
279     }
280 
281     /**
282      * 檢測文件對象是否目錄
283      * 
284      * @param f
285      */
286     public static boolean isDirectory(File f) {
287         return f.isDirectory();
288     }
289 
290     /**
291      * 檢測路徑是否目錄
292      * 
293      * @param f
294      */
295     public static boolean isDirectory(String fileName) {
296         return isDirectory(newFile(fileName));
297     }
298 
299     /**
300      * 檢測文件對象是否文件
301      * 
302      * @param f
303      */
304     public static boolean isFile(File f) {
305         return f.isFile();
306     }
307 
308     /**
309      * 獲取文件的尾碼名
310      * 
311      * @param fileName
312      * @return
313      */
314     public static String suffixName(String fileName) {
315         return suffixName(newFile(fileName));
316     }
317 
318     /**
319      * 獲取不帶尾碼名的文件名字元串
320      * 
321      * @param fileName
322      * @return
323      */
324     public static String getNoSuffixName(String fileName) {
325         return getNoSuffixName(newFile(fileName));
326     }
327 
328     /**
329      * 獲取不帶尾碼名的文件名字元串
330      * 
331      * @param f
332      * @return
333      */
334     public static String getNoSuffixName(File f) {
335         return f.getName().substring(0, f.getName().lastIndexOf("."));
336     }
337 
338     /**
339      * 重命名
340      * 
341      * @param fileName1
342      *            路徑
343      * @param fileName2
344      *            路徑
345      */
346     public static void rename(String fileName1, String fileName2) {
347         rename(newFile(fileName1), newFile(fileName2));
348     }
349 
350     /**
351      * 重命名
352      * 
353      * @param f1
354      * @param f2
355      */
356     public static void rename(File f1, File f2) {
357         f1.renameTo(f2);
358     }
359 
360     /**
361      * 修改指定路徑的文件尾碼名。
362      * 
363      * @param fileName
364      *            路徑
365      * @param suffix
366      *            尾碼名
367      */
368     public static void replaceSuffixName(String fileName, String suffix) {
369         replaceSuffixName(newFile(fileName), suffix);
370     }
371 
372     /**
373      * 修改文件尾碼名
374      * 
375      * @param file
376      *            對象,
377      * @param suffix
378      *            尾碼
379      */
380     public static void replaceSuffixName(File file, String suffix) {
381         StringBuilder name = new StringBuilder();
382         name.append(getNoSuffixName(file));
383         name.append(".");
384         name.append(suffix);
385         rename(file, newFile(parent(file), name.toString()));
386     }
387 
388     /**
389      * 獲取文件的尾碼名
390      * 
391      * @param f
392      * @return
393      */
394     public static String suffixName(File f) {
395         String[] sarr = f.getName().split("\\.");
396         return sarr.length > 1 ? sarr[sarr.length - 1] : null;
397     }
398 
399     /**
400      * 檢測路徑是否文件
401      * 
402      * @param f
403      */
404     public static boolean isFile(String fileName) {
405         return isFile(newFile(fileName));
406     }
407 
408     /**
409      * 根據路徑創建文件對象,
410      * 
411      * @param fileName
412      * @return
413      */
414     public static File newFile(String fileName) {
415         return new File(fileName);
416     }
417 
418     /**
419      * 創建路徑和文件名創建文件對象
420      * 
421      * @param path
422      *            路徑
423      * @param fileName
424      *            文件名字
425      * @return
426      */
427     public static File newFile(String path, String fileName) {
428         return new File(path, fileName);
429     }
430 
431     /**
432      * 返回對象的父目錄
433      * 
434      * @param f
435      * @return
436      */
437     public static String parent(File f) {
438         String str = f.getName();
439         String abso = f.getAbsolutePath();
440         return abso.substring(0, abso.length() - str.length());
441     }
442 
443     /**
444      * 根據文件和樣式獲取文件大小的字元串
445      * 
446      * @param file
447      *            根據文件路徑
448      * @param size
449      *            文件大小樣式(KB或MB或GB)
450      * @return
451      */
452     public static String size(File file, String size) {
453         long len = file.length();
454         double d = 0;
455         StringBuilder sb = new StringBuilder();
456         switch (size) {
457         case "k":
458         case "K":
459         case "kb":
460         case "Kb":
461         case "KB":
462         case "kB":
463             d = 1.0 * len / 1024;
464             sb.append(String.format("%.3f", d));
465             sb.append("MB");
466             break;
467         case "m":
468         case "M":
469         case "mb":
470         case "MB":
471         case "mB":
472         case "Mb":
473             d = 1.0 * len / 1024 / 1024;
474             sb.append(String.format("%.3f", d));
475             sb.append("MB");
476             break;
477         case "g":
478         case "G":
479         case "gb":
480         case "GB":
481         case "Gb":
482         case "gB":
483             d = 1.0 * len / 1024 / 1024 / 1024;
484             sb.append(String.format("%.3f", d));
485             sb.append("GB");
486             break;
487         default:
488             sb.append(len);
489             sb.append("B");
490         }
491         return sb.toString();
492     }
493 
494     /**
495      * 根據路徑和樣式獲取文件大小的字元串
496      * 
497      * @param fileName
498      *            根據文件路徑
499      * @param size
500      *            文件大小樣式(KB或MB或GB)
501      * @return
502      */
503     public static String size(String fileName, String size) {
504         return size(newFile(fileName), size);
505     }
506 
507     private InputStream is;
508     private OutputStream os;
509 
510     private FileUtil() {
511     }
512 
513     private void setInputStreamAndOutputStream(InputStream is, OutputStream os) {
514         this.is = is;
515         this.os = os;
516     }
517 
518     private void copyThread(File f1, File f2, boolean append) {
519         try {
520             is = new FileInputStream(f1);
521         } catch (FileNotFoundException e1) {
522             e1.printStackTrace();
523         }
524         try {
525             os = new FileOutputStream(f2, append);
526         } catch (FileNotFoundException e) {
527             e.printStackTrace();
528         }
529     }
530 
531     public void run() {
532         BufferedInputStream bis = null
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Centos下通過yum安裝步驟如下: 聲明:相對比那些用源碼安裝,少了配置和新建log和data目錄,這種簡單粗暴, mongodb 常用命令: mongo 導入 json 或者csv 做法 mongoimport --db table-name --collection table-name - ...
  • eclipse中使用mybatis-generator逆向代碼生成工具出現waiting for "building workspace";com.mysql.jdbc.exceptions.jdbc4.communicationsexception: communications link fa... ...
  • Java常見的同步和非同步的區別、特點、聯繫 同步:發送一個請求,等待返回,然後再發送下一個請求 非同步:發送一個請求,不等待返回,隨時可以再發送下一個請求 同步可以避免出現死鎖,讀臟數據的發生,一般共用某一資源的時候用,如果每個人都有修改許可權,同時修改一個文件,有可能使一個人讀取另一個人已經刪除的內容 ...
  • 閉包是指在創建時封裝周圍狀態的函數。即使閉包所在的環境不存在了,閉包中封裝的狀態依然存在。匿名函數就是沒有名稱的函數。匿名函數可以賦值給變數,還能像其他任何PHP對象那樣傳遞。不過匿名函數仍是函數,因此可以調用,還可以傳入參數。匿名函數特別適合作為函數或方法的回調。 ...
  • [1]修改hosts文件 [2]啟動apache虛擬主機功能 [3]修改vhosts配置文件 ...
  • 可選的<generator>子元素是 一個Java類的名稱,用來生成該持久化類實例的唯一標識符。如果這個生成器實例需要某些配置值或者初始化參數,可以使用<param>元素來傳遞這些參數。 所有的生成器都實現了org.hibernate.id.IdentifierGenerator介面。這是一個非常簡 ...
  • 一、簡介 Swagger的目標是為REST API定義一個與語言無關的標準介面,允許用戶發現和理解電腦服務的功能,而無需訪問源代碼。當通過Swagger正確定義時,用戶可以用最少量的實現邏輯理解遠程服務並與之交互。類似於低級編程所做的介面。 二、實現步驟 1、添加 Maven 依賴 2、Swagg ...
  • 緩存一致性協議給緩存行(通常為64位元組)定義了個狀態:獨占(exclusive)、共用(share)、修改(modified)、失效(invalid),用來描述該緩存行是否被多處理器共用、是否修改。所以緩存一致性協議也稱MESI。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...