Кода -копия выглядит следующим образом:
пакет com.xyq.io.simply.core;
Импорт java.io.file;
импортировать java.io.ioexception;
импортировать java.nio.file.filevisitresult;
Импорт java.nio.file.filevisitor;
Импорт java.nio.file.files;
Импорт java.nio.file.path;
Импорт java.nio.file.paths;
импортировать java.nio.file.standardcopyoption;
Импорт java.nio.file.attribute.basicfileattributes;
импортировать java.util.arraylist;
импортировать java.util.list;
Импорт com.xyq.io.enums.filetypemode;
Import com.xyq.io.enums.optionfile_type;
Импорт com.xyq.io.inf.newnioinf;
Импорт com.xyq.io.util.findfileutil;
Импорт com.xyq.io.util.md5util;
открытый класс Newnio реализует Newnioinf {
/***
* Копировать или перемещать файлы
*/
@Override
public boolean copeormovefile (String src, String tar, optionfile_type type) {
return realcopeormovefile (paths.get (src), tar, type);
}
Частный логический realcopeormovefile (Path Srcpath, String Tar,
Optionfile_type type) {
PATH TARPATH = NULL;
логический Copesuccess = true;
// должен существовать исходный файл
if (srcpath.tofile (). существует ()) {
/***
* Если исходный путь прорезан, то он считается папкой
*/
if (isdir (tar))
tarpath = paths.get (tar + file.separator
+ srcpath.tofile (). getName ());
еще
tarpath = paths.get (tar);
/***
* Затем выполните n times (можно использовать в качестве параметров) Операция копирования (повторное соединение после ошибки), будь то перезаписать копию, копировать атрибут, операция копирования не может использовать опцию отката
*/
для (int i = 0; i <3; i ++) {
/***
* Если целевой файл уже существует
*/
if (tarpath.tofile (). существует ()) {
/***
* Если вы убедитесь, что эти две папки одинаковы, вам не нужно копировать в рамках опции «Перемещение».
*/
// копирование
if (optionfile_type.cope.equals (type)) {
if (equalsfile (srcpath.tofile (), tarpath.tofile ()))
вернуть истину;
еще
copesuccess = copefile (srcpath, tarpath, true);
}
/***
* Переместите операцию, будьте очень осторожны здесь.
* Затем просто удалите исходный файл. Однако, если два файла одинаковы и адрес также
* Если это то же самое, то оригинал не может быть удален, потому что это один и тот же файл и не может быть удален.
*/
else if (optionfile_type.move.equals (type)) {
if (equalsfile (srcpath.tofile (), tarpath.tofile ())) {
if (! srcpath.tofile (). getabsolutefile ())
.equals (tarpath.tofile (). getabsolutefile ()))
пытаться {
Files.delete (srcpath);
/***
* Причина указания на истинную вручную заключается в том, что в предыдущем удалении может произойти неудача.
*/
if (! copesuccess)
copesuccess = true;
} catch (ioException e) {
copesuccess = false;
}
// Я не возвращаюсь напрямую, потому что на фронте есть исключение, просто сделай это здесь
еще
вернуть истину;
} еще
copeSuccess = fail -файл (srcpath, tarpath);
}
}
/***
* Когда целевой файл не существует, сначала определите, может ли создать папку родительского класса (папка родительского класса существует или может быть создана), а затем создайте ее, когда ее можно создать.
*/
еще {
File par = tarpath.getParent (). Tofile ();
/***
* Если папка родительского класса не существует и не может быть создана, то нет необходимости копировать ее
*/
if (! par.exists () &&! par.mkdirs ())
copesuccess = false;
else if (optionfile_type.cope.equals (type))
copesuccess = copefile (srcpath, tarpath, false);
else if (optionfile_type.move.equals (type))
copeSuccess = fail -файл (srcpath, tarpath);
}
// Если операция будет успешной, петля будет выскочена
if (copesuccess)
перерыв;
}
} еще
copesuccess = false;
вернуть CopeSuccess;
}
/***
* Скопировать файл
*/
Частный логический Copefile (Path Srcpath, Path Tarpath, Boolean Isexist) {
if (isexist)
пытаться {
Files.copy (srcpath, tarpath,
Standarcopyoption.replace_existing,
StandardCopyoption.copy_attributes);
} catch (ioException e) {
вернуть ложь;
}
еще
пытаться {
Files.copy (srcpath, tarpath, standardcopyoption.copy_attributes);
} catch (ioException e) {
вернуть ложь;
}
вернуть истину;
}
/***
* Перемещать файлы, параметры атрибутов нельзя использовать
*
* @param srcpath
* @param tarpath
* @возвращаться
*/
Частный логический файл перемещения (Path Srcpath, Path Tarpath) {
пытаться {
Files.move (srcpath, tarpath, standardcopyoption.atomic_move);
} catch (ioException e) {
вернуть ложь;
}
вернуть истину;
}
/***
* Определите, является ли путь пути папкой
*
* @param path
* @возвращаться
*/
Частный логический isdir (String Path) {
char lastc = path.charat (path.length () - 1);
if (lastc == '//' || lastc == '/')
вернуть истину;
вернуть ложь;
}
/***
* Это должно убедиться, что два файла одинаковы, это просто простая проверка, и его можно использовать для использования MD5 для проверки
*/
public boolean equalsfile (file src, file tar) {
// Если длина двух файлов различны, то два файла определенно разные
if (src.length ()! = tar.length ())
вернуть ложь;
if (! src.getName (). equals (tar.getName ())
||
вернуть md5util.encoderfilebymd5 (src). equals (
Md5util.encoderfilebymd5 (tar));
вернуть истину;
}
/***
* Скопировать или перемещать папки
*/
@Override
public void copeormedirectory (String src, Final String Tar, int tiersize,
Окончательный optionfile_type type) {
if (! new File (src) .exists ())
бросить новое runtimeexception ("оригинальная папка не найдена" + src);
final int rootpos = getRootposition (новый файл (src), tiersize);
if (rootpos! = -1) {
пытаться {
Files.walkfileTree (paths.get (src), new Filevisitor <Thap> () {
String tardirstring = null;
/***
* Перед прибытием в папку сначала напишите целевой путь
*
* @param dir
* @param attrs
* @возвращаться
* @Throws ioException
*/
@Override
public fileVisitResult previsitDirectory (Path Dir,
BasicFileatTributes attrs) бросает ioException {
tardirstring = dir.tofile (). getabsolutepath ();
tardirstring = tar + tardirstring.substring (rootpos)
+ File.separator;
return filevisitresult.continue;
}
/***
* После прибытия в файл, скопируйте или переместите его
*
* @param file
* @param attrs
* @возвращаться
* @Throws ioException
*/
@Override
public filevisitresult vesitfile (файл пути,
BasicFileatTributes attrs) бросает ioException {
File f = file.tofile ();
if (f.exists () && f.canread () &&! f.ishidden ())
RealCopeorMovefile (файл, TardirString, Type);
return filevisitresult.continue;
}
@Override
public filevisitresult visit filefailed (файл пути,
IoException exc) бросает ioException {
return filevisitresult.continue;
}
/***
* После прибытия в папку
*
* @param dir
* @param excc
* @возвращаться
* @Throws ioException
*/
@Override
publicvisitresult postvisitdirectory (path dir,
IoException exc) бросает ioException {
return filevisitresult.continue;
}
});
} catch (Exception e) {
e.printstacktrace ();
}
// Если это операция вырезания, а разреза успешна, вам нужно удалить все папки
if (optionfile_type.move.equals (type) && isblockdir (src))
Дельдир (SRC);
} еще
бросить новое runtimeexception («Укажите ошибку иерархии папки родительского класса ~~~»);
}
/***
* Получите местоположение указанной буквы привода в соответствии с указанным уровнем
*/
private int getRootposition (файл файла, int tier) {
if (file! = null) {
String path = file.getabsolutePath ();
int cc = 0;
for (int i = path.length ()-1; i> = 0; i--) {
if (path.charat (i) == '//') {
CC ++;
if (cc == tier + 1) {
cc = i;
вернуть CC;
}
}
}
}
возврат -1;
}
/***
* Проверьте, есть ли какие -нибудь файлы в этой папке
*
* @param dirpath
* @возвращаться
*/
Частный логический Isblockdir (String Dirpath) {
File dir = новый файл (dirpath);
File [] dirlist = dir.list -files ();
if (dirlist == null || dirlist.length == 0)
вернуть истину;
еще {
// Найти файлы
для (файл F: Dirlist)
if (! f.isdirectory ())
вернуть ложь;
}
вернуть истину;
}
/***
* Удалить пустые папки
*
* @param dirpath
*/
private void deldir (String dirpath) {
File dir = новый файл (dirpath);
File [] dirlist = dir.list -files ();
if (dirlist == null || dirlist.length == 0)
dir.delete ();
еще {
// удалить все файлы
для (файл F: Dirlist)
if (f.isdirectory ())
deldir (f.getabsolutepath ());
еще
f.delete ();
// удалить папку после удаления всех файлов в текущей папке
dirlist = dir.list -files ();
if (dirlist.length == 0)
dir.delete ();
}
}
/***
* Найти соответствующие файлы на основе типа файла
*/
@Override
public List <string> findFilesBytype (String Dir, String [] Keys,
логический ismatchcase) бросает ioexception {
List <string> list = new ArrayList <string> ();
Files.walkfileTree (paths.get (dir), новый FindFileutil (Keys, Ismatchcase,
список, fileTypeMode.types));
вернуть список;
}
/***
* Найти соответствующие файлы на основе имени файла
*/
@Override
public List <string> findfilesbyName (String Dir, String [] Keys,
логический ismatchcase) бросает ioexception {
List <string> list = new ArrayList <string> ();
Files.walkfileTree (paths.get (dir), новый FindFileutil (Keys, Ismatchcase,
список, fileTypeMode.names));
вернуть список;
}
public static void main (string [] args) бросает ioException {
Newnioinf inf = new Newnio ();
inf.copeormovefile ("e: /cc/dd/11.txt", "e:/xx/xxx/zzz/",
Optionfile_type.cope);
inf.copeormedirectory ("e: // bb // cc // dd", "e: //", 1, optionfile_type.move);
System.out.println (inf.findfilesbyname ("d: // workspace", new String [] {"txt"},
false) .size ());
}
}
--------------------------------
пакет com.xyq.io.enums;
/***
* Тип файла
* @author xyq
*
*/
public enum filetypemode {
Типы, имена
}
---------------------------------
пакет com.xyq.io.enums;
/***
* Тип операционного файла
* @author xyq
*
*/
public enum optionfile_type {
Справиться, двигаться;
}
------------------------------------------------------ ------------------------------------------------------ ----------------------------
пакет com.xyq.io.inf;
импортировать java.io.ioexception;
импортировать java.util.list;
Import com.xyq.io.enums.optionfile_type;
публичный интерфейс newnioinf {
/***
* Копировать или перемещать файлы
* @param src
* @param tar
* @возвращаться
*/
public boolean copeormovefile (String src, String tar, optionfile_type type);
/***
* Скопировать или перемещать папки
* @param src
* @param tar
* @param tiersize иерархия, путь 0 после копирования-это просто текущая папка, +1 означает добавление папки родительского класса первого уровня (но не копировать содержимое родительского класса)
* @param type
*/
public void Copeormedirectory (String src, String tar, int tiersize, optionfile_type type);
/**
* Найти соответствующие коллекции файлов на основе типа файла, разделить их с запятыми, когда несколько типов
*
* @param dir
* Оглавление
* @param ключи
* Тип файла
* @param ismatchcase
* Является ли это чувствительным к случаям
* @возвращаться
* @Throws ioException
*/
List <string> findfilesbytype (String dir, String [] Keys, Boolean Ismatchcase)
бросает ioException;
/**
* Найти соответствующие коллекции файлов на основе имени файла, разделить их запятыми, когда несколько гражданских терминов
*
* @param dir
* Оглавление
* @param ключи
* Имя файла
* @param ismatchcase
* Является ли это чувствительным к случаям
* @возвращаться
* @Throws ioException
*/
Список <String> findFilesByName (String Dir, String [] Keys, Boolean IsmatchCase)
бросает ioException;
}
---------------------
пакет com.xyq.io.util;
Импорт java.io.file;
импортировать java.io.ioexception;
импортировать java.nio.file.filevisitresult;
Импорт java.nio.file.path;
Импорт java.nio.file.simplefilevisitor;
Импорт java.nio.file.attribute.basicfileattributes;
импортировать java.util.list;
Импорт com.xyq.io.enums.filetypemode;
Public Class FindFileutil расширяет SimpleFileVisitor <Thape> {
/***
* Список ключевых слов, будь то преобразование корпуса, вернуть набор результатов
*/
Приватная строка [] keyarray = null;
Частный логический ismatchcase;
частный список <string> resultList;
Приватный режим FileTypeMode;
public findfileutil (String [] Keyarray, Boolean Ismatchcase,
Список <string> resultList, режим filetypemode) {
this.keyarray = keyarray;
это.
this.Resultist = roldsitlist;
this.mode = mode;
}
@Suppresswarnings («неиспользованный»)
private findfileutil () {
}
@Override
public filevisitresult visit -file (файл пути, базовые атрибуты ATTRS)
бросает ioException {
File f = file.tofile ();
if (f.exists () && f.canread () &&! f.ishidden ())
if (this.keyarray! = null) {
for (String Key: this.keyarray) {
if (! this.ishishatchcase)
key = key.tolowercase ();
if (matchfile (файл, this.mode, key, ismatchcase)))
resultList.add (file.toString ());
}
}
return filevisitresult.continue;
}
/***
* Сопоставление файлов на основе корпуса и типа или имени
*
* @param file
* @param режим
* @param Key
* @param ismatchcase
* @возвращаться
*/
Private Boolean MatchFile (файл пути, режим FileTypeMode, String Key,
логический ismatchcase) {
File f = file.tofile ();
if (f.exists () && f.canread () &&! f.ishidden ()
&&! "Информация о томе системы" .equals (f.getName ())) {
String filename = null;
if (filetypemode.types.equals (mode)) {
filename = file.tostring ();
Вернуть Ismatchcase?
.tolowercase (). Endswith (Key);
} else if (filetypemode.names.equals (mode)) {
filename = file.tofile (). getName ();
вернуть Ismatchcase?
: истинный)
: (filename.tolowercase (). Indexof (Key) == -1? False
: истинный);
}
}
вернуть ложь;
}
@Override
public filevisitresult vitionfilefailed (Path File, ioexception Excc)
бросает ioException {
// Если сообщение об ошибке содержит информацию о объеме x:/
System.out.println (Exc.GetMessage ());
return filevisitresult.continue;
}
}
--------------------------------
пакет com.xyq.io.util;
Импорт java.io.closable;
открытый класс CloseIoutil {
/***
* Закрыть поток io
*
* @param cls
*/
public static void closeall (closable ... cls) {
if (cls! = null) {
для (ближайший CL: CLS) {
пытаться {
if (cl! = null)
cl.close ();
} catch (Exception e) {
} окончательно {
cl = null;
}
}
}
}
}
------------------------------------------------------ ------------------------------------------------------ ----------------------------
пакет com.xyq.io.util;
Импорт java.io.bufferedinputstream;
Импорт java.io.file;
импортировать java.io.fileinputstream;
импортировать java.io.ioexception;
импортировать java.io.unsupportedencodingexception;
Импорт java.security.messagedigest;
Импорт java.security.nosuchalgorithmexception;
Import sun.misc.base64encoder;
открытый класс md5util {
/***
* Зашифрованная строка
*
* @param str
* @возвращаться
* @Throws nosuchAlgorithMexception
* @Throws UnsUpportEncodingException
*/
Public Static String EncoderstringBymd5 (String Str)
бросает noshuchalgorithmexception, unsupportedencodingexception {
// определить метод расчета
MessageDigest md5 = messagegest.getInstance ("md5");
Base64encoder base64en = new base64encoder ();
// зашифрованная строка
String newsr = base64en.encode (md5.digest (str.getbytes ("utf-8")));
вернуть Newsr;
}
/***
* Зашифрованные файлы
*
* @param file
* @возвращаться
* @Throws nosuchAlgorithMexception
* @Throws ioException
*/
public Static String encoderfilebymd5 (файл файла) {
String newsstr = null;
FileInputStream fis = null;
BufferedInputStream bis = null;
пытаться {
// определить метод расчета
MessageDigest md5 = messagegest.getInstance ("md5");
Base64encoder base64en = new base64encoder ();
Byte [] buffer = новый байт [1024];
fis = new FileInputStream (file);
bis = new BufferedInputStream (FIS);
int длина = -1;
while ((длина = bis.read (buffer))! = -1)
md5.update (буфер, 0, длина);
// зашифрованная строка
newsstr = base64en.encode (md5.digest ());
} catch (Exception e) {
e.printstacktrace ();
} окончательно {
Kelowioutil.closeall (bis, fis);
}
вернуть Newsr;
}
Public Static Void Main (String [] args) бросает noshuchalgorithmexception, unsupportedencodingexception {
System.out.println (EncoderstringBymd5 ("23"));
}
}