用 Java 将文件从一个目录复制到另一个目录

我想使用 Java 将文件从一个目录复制到另一个(子目录)。我有一个目录,目录,文本文件。我迭代 dir 中的前20个文件,并希望将它们复制到 dir 目录中的另一个目录,这个目录是在迭代之前创建的。 在代码中,我希望将 review(表示第 i 个文本文件或评论)复制到 trainingDir。我怎么能这么做?似乎没有这样一个函数(或者我找不到)。谢谢你。

boolean success = false;
File[] reviews = dir.listFiles();
String trainingDir = dir.getAbsolutePath() + "/trainingData";
File trDir = new File(trainingDir);
success = trDir.mkdir();
for(int i = 1; i <= 20; i++) {
File review = reviews[i];


}
531534 次浏览

你使用 RenameTo ()-不明显,我知道... 但它是 Java 等价的 move..。

标准 API 中还没有文件复制方法。您可以选择:

  • 自己编写,使用一个 FileInputStream、一个 FileOutputStream 和一个缓冲区将字节从一个复制到另一个,或者更好的方法是使用 ()
  • 用户 Apache Commons 的 FileUtils
  • 在 Java7中等待 二氧化氮

如果你想复制一个文件而不是移动它,你可以这样编码。

private static void copyFile(File sourceFile, File destFile)
throws IOException {
if (!sourceFile.exists()) {
return;
}
if (!destFile.exists()) {
destFile.createNewFile();
}
FileChannel source = null;
FileChannel destination = null;
source = new FileInputStream(sourceFile).getChannel();
destination = new FileOutputStream(destFile).getChannel();
if (destination != null && source != null) {
destination.transferFrom(source, 0, source.size());
}
if (source != null) {
source.close();
}
if (destination != null) {
destination.close();
}


}

下面来自 Java 技巧的例子相当直接。之后,我转而使用 Groovy 来处理文件系统的操作——这样更简单、更优雅。但这是我过去用过的 Java 技巧。它缺乏使其万无一失所需的健壮的异常处理。

 public void copyDirectory(File sourceLocation , File targetLocation)
throws IOException {


if (sourceLocation.isDirectory()) {
if (!targetLocation.exists()) {
targetLocation.mkdir();
}


String[] children = sourceLocation.list();
for (int i=0; i<children.length; i++) {
copyDirectory(new File(sourceLocation, children[i]),
new File(targetLocation, children[i]));
}
} else {


InputStream in = new FileInputStream(sourceLocation);
OutputStream out = new FileOutputStream(targetLocation);


// Copy the bits from instream to outstream
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
}

现在这个应该能解决你的问题

File source = new File("H:\\work-temp\\file");
File dest = new File("H:\\work-temp\\file2");
try {
FileUtils.copyDirectory(source, dest);
} catch (IOException e) {
e.printStackTrace();
}

来自 Apache commons-io库的 FileUtils类,从1.2版本开始可用。

使用第三方工具而不是自己编写所有实用程序似乎是一个更好的主意。它可以节省时间和其他宝贵的资源。

您似乎正在寻找简单的解决方案(这是一件好事):

将整个目录复制到新的 保存文件日期的位置。

此方法复制指定的 目录及其所有子目录 目录和文件添加到指定的 目的地。目的地是 的新位置和名称 目录。

创建目标目录 如果它不存在 那么,目标目录确实存在 此方法将源与 目的地,与源采取 优先级。

您的代码可以像下面这样漂亮而简单:

File trgDir = new File("/tmp/myTarget/");
File srcDir = new File("/tmp/mySource/");


FileUtils.copyDirectory(srcDir, trgDir);

使用

Org.apache.commons.io 文件工具

真方便

下面是 Brian 修改过的代码,它将文件从源位置复制到目标位置。

public class CopyFiles {
public static void copyFiles(File sourceLocation , File targetLocation)
throws IOException {


if (sourceLocation.isDirectory()) {
if (!targetLocation.exists()) {
targetLocation.mkdir();
}
File[] files = sourceLocation.listFiles();
for(File file:files){
InputStream in = new FileInputStream(file);
OutputStream out = new FileOutputStream(targetLocation+"/"+file.getName());


// Copy the bits from input stream to output stream
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
}
}

Apache commons Fileutils 很方便。 你可以做下面的活动。

  1. 将文件从一个目录复制到另一个目录。

    使用 copyFileToDirectory(File srcFile, File destDir)

  2. 将目录从一个目录复制到另一个目录。

    使用 copyDirectory(File srcDir, File destDir)

  3. 将一个文件的内容复制到另一个文件

    使用 static void copyFile(File srcFile, File destFile)

我使用以下代码将上载的 CommonMultipartFile转移到一个文件夹,并将该文件复制到 webapps (即 web 项目文件夹)中的目标文件夹,

    String resourcepath = "C:/resources/images/" + commonsMultipartFile.getOriginalFilename();


File file = new File(resourcepath);
commonsMultipartFile.transferTo(file);


//Copy File to a Destination folder
File destinationDir = new File("C:/Tomcat/webapps/myProject/resources/images/");
FileUtils.copyFileToDirectory(file, destinationDir);

可以使用下面的代码将文件从一个目录复制到另一个目录

// parent folders of dest must exist before calling this function
public static void copyTo( File src, File dest ) throws IOException {
// recursively copy all the files of src folder if src is a directory
if( src.isDirectory() ) {
// creating parent folders where source files is to be copied
dest.mkdirs();
for( File sourceChild : src.listFiles() ) {
File destChild = new File( dest, sourceChild.getName() );
copyTo( sourceChild, destChild );
}
}
// copy the source file
else {
InputStream in = new FileInputStream( src );
OutputStream out = new FileOutputStream( dest );
writeThrough( in, out );
in.close();
out.close();
}
}
File dir = new File("D:\\mital\\filestore");
File[] files = dir.listFiles(new File_Filter("*"+ strLine + "*.txt"));
for (File file : files){
System.out.println(file.getName());


try {
String sourceFile=dir+"\\"+file.getName();
String destinationFile="D:\\mital\\storefile\\"+file.getName();
FileInputStream fileInputStream = new FileInputStream(sourceFile);
FileOutputStream fileOutputStream = new FileOutputStream(
destinationFile);
int bufferSize;
byte[] bufffer = new byte[512];
while ((bufferSize = fileInputStream.read(bufffer)) > 0) {
fileOutputStream.write(bufffer, 0, bufferSize);
}
fileInputStream.close();
fileOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}

在 Java7中,有一种标准的方法 来复制 Java 中的文件:

Files.copy.

它集成了高性能的 O/S 本机 I/O。

请参阅 用 Java 复制文件的标准简洁方法?上我的 A 来获得完整的用法描述。

    File file = fileChooser.getSelectedFile();
String selected = fc.getSelectedFile().getAbsolutePath();
File srcDir = new File(selected);
FileInputStream fii;
FileOutputStream fio;
try {
fii = new FileInputStream(srcDir);
fio = new FileOutputStream("C:\\LOvE.txt");
byte [] b=new byte[1024];
int i=0;
try {
while ((fii.read(b)) > 0)
{


System.out.println(b);
fio.write(b);
}
fii.close();
fio.close();

下面的代码将文件从一个目录复制到另一个目录

File destFile = new File(targetDir.getAbsolutePath() + File.separator
+ file.getName());
try {
showMessage("Copying " + file.getName());
in = new BufferedInputStream(new FileInputStream(file));
out = new BufferedOutputStream(new FileOutputStream(destFile));
int n;
while ((n = in.read()) != -1) {
out.write(n);
}
showMessage("Copied " + file.getName());
} catch (Exception e) {
showMessage("Cannot copy file " + file.getAbsolutePath());
} finally {
if (in != null)
try {
in.close();
} catch (Exception e) {
}
if (out != null)
try {
out.close();
} catch (Exception e) {
}
}
File sourceFile = new File("C:\\Users\\Demo\\Downloads\\employee\\"+img);
File destinationFile = new File("\\images\\" + sourceFile.getName());


FileInputStream fileInputStream = new FileInputStream(sourceFile);
FileOutputStream fileOutputStream = new FileOutputStream(
destinationFile);


int bufferSize;
byte[] bufffer = new byte[512];
while ((bufferSize = fileInputStream.read(bufffer)) > 0) {
fileOutputStream.write(bufffer, 0, bufferSize);
}
fileInputStream.close();
fileOutputStream.close();

Apache commons FileUtils 将非常方便,如果您只希望从源目录到目标目录执行 移动文件操作,而不是复制整个目录,那么您可以这样做:

for (File srcFile: srcDir.listFiles()) {
if (srcFile.isDirectory()) {
FileUtils.copyDirectoryToDirectory(srcFile, dstDir);
} else {
FileUtils.copyFileToDirectory(srcFile, dstDir);
}
}

如果你想跳过目录,你可以这样做:

for (File srcFile: srcDir.listFiles()) {
if (!srcFile.isDirectory()) {
FileUtils.copyFileToDirectory(srcFile, dstDir);
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;


public class CopyFiles {
private File targetFolder;
private int noOfFiles;
public void copyDirectory(File sourceLocation, String destLocation)
throws IOException {
targetFolder = new File(destLocation);
if (sourceLocation.isDirectory()) {
if (!targetFolder.exists()) {
targetFolder.mkdir();
}


String[] children = sourceLocation.list();
for (int i = 0; i < children.length; i++) {
copyDirectory(new File(sourceLocation, children[i]),
destLocation);


}
} else {


InputStream in = new FileInputStream(sourceLocation);
OutputStream out = new FileOutputStream(targetFolder + "\\"+ sourceLocation.getName(), true);
System.out.println("Destination Path ::"+targetFolder + "\\"+ sourceLocation.getName());
// Copy the bits from instream to outstream
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
out.close();
noOfFiles++;
}
}


public static void main(String[] args) throws IOException {


File srcFolder = new File("C:\\sourceLocation\\");
String destFolder = new String("C:\\targetLocation\\");
CopyFiles cf = new CopyFiles();
cf.copyDirectory(srcFolder, destFolder);
System.out.println("No Of Files got Retrieved from Source ::"+cf.noOfFiles);
System.out.println("Successfully Retrieved");
}
}
import static java.nio.file.StandardCopyOption.*;
...
Files.copy(source, target, REPLACE_EXISTING);

资料来源: https://docs.oracle.com/javase/tutorial/essential/io/copy.html

甚至在 Java7中也不需要那么复杂和导入:

renameTo( )方法更改文件的名称:

public boolean renameTo( File destination)

例如,要将当前工作目录中的文件 src.txt的名称更改为 dst.txt,可以写:

File src = new File(" src.txt"); File dst = new File(" dst.txt"); src.renameTo( dst);

就是这样。

参考文献:

哈罗德,埃利奥特 · 拉什蒂(2006-05-16) . Java I/O (p. 393) . O’Reilly Media. Kindle 版。

将文件从一个目录复制到另一个目录..。

FileChannel source=new FileInputStream(new File("source file path")).getChannel();
FileChannel desti=new FileOutputStream(new File("destination file path")).getChannel();
desti.transferFrom(source, 0, source.size());
source.close();
desti.close();

您可以解决将源文件复制到新文件并删除原始文件的问题。

public class MoveFileExample {


public static void main(String[] args) {


InputStream inStream = null;
OutputStream outStream = null;


try {


File afile = new File("C:\\folderA\\Afile.txt");
File bfile = new File("C:\\folderB\\Afile.txt");


inStream = new FileInputStream(afile);
outStream = new FileOutputStream(bfile);


byte[] buffer = new byte[1024];


int length;
//copy the file content in bytes
while ((length = inStream.read(buffer)) > 0) {
outStream.write(buffer, 0, length);
}


inStream.close();
outStream.close();


//delete the original file
afile.delete();


System.out.println("File is copied successful!");


} catch(IOException e) {
e.printStackTrace();
}
}
}

受到 Mohit 在 这根线中的回答的启发。仅适用于 Java8。

下面的代码可以用来递归地将所有内容从一个文件夹复制到另一个文件夹:

public static void main(String[] args) throws IOException {
Path source = Paths.get("/path/to/source/dir");
Path destination = Paths.get("/path/to/dest/dir");


List<Path> sources = Files.walk(source).collect(toList());
List<Path> destinations = sources.stream()
.map(source::relativize)
.map(destination::resolve)
.collect(toList());


for (int i = 0; i < sources.size(); i++) {
Files.copy(sources.get(i), destinations.get(i));
}
}

流式 FTW。

Upd 2019-06-10: 重要提示-关闭 Files.walk 调用获取的流(例如使用 try-with-resource)。感谢@jannis 的观点。

可以使用下面的代码将文件从一个目录复制到另一个目录

public static void copyFile(File sourceFile, File destFile) throws IOException {
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(sourceFile);
out = new FileOutputStream(destFile);
byte[] buffer = new byte[1024];
int length;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
} catch(Exception e){
e.printStackTrace();
}
finally {
in.close();
out.close();
}
}

这里有一个简单的 Java 代码,用来将数据从一个文件夹复制到另一个文件夹,你只需要输入源和目标。

import java.io.*;


public class CopyData {
static String source;
static String des;


static void dr(File fl,boolean first) throws IOException
{
if(fl.isDirectory())
{
createDir(fl.getPath(),first);
File flist[]=fl.listFiles();
for(int i=0;i<flist.length;i++)
{


if(flist[i].isDirectory())
{
dr(flist[i],false);
}


else
{


copyData(flist[i].getPath());
}
}
}


else
{
copyData(fl.getPath());
}
}


private static void copyData(String name) throws IOException {


int i;
String str=des;
for(i=source.length();i<name.length();i++)
{
str=str+name.charAt(i);
}
System.out.println(str);
FileInputStream fis=new FileInputStream(name);
FileOutputStream fos=new FileOutputStream(str);
byte[] buffer = new byte[1024];
int noOfBytes = 0;
while ((noOfBytes = fis.read(buffer)) != -1) {
fos.write(buffer, 0, noOfBytes);
}




}


private static void createDir(String name, boolean first) {


int i;


if(first==true)
{
for(i=name.length()-1;i>0;i--)
{
if(name.charAt(i)==92)
{
break;
}
}


for(;i<name.length();i++)
{
des=des+name.charAt(i);
}
}
else
{
String str=des;
for(i=source.length();i<name.length();i++)
{
str=str+name.charAt(i);
}
(new File(str)).mkdirs();
}


}


public static void main(String args[]) throws IOException
{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.println("program to copy data from source to destination \n");
System.out.print("enter source path : ");
source=br.readLine();
System.out.print("enter destination path : ");
des=br.readLine();
long startTime = System.currentTimeMillis();
dr(new File(source),true);
long endTime   = System.currentTimeMillis();
long time=endTime-startTime;
System.out.println("\n\n Time taken = "+time+" mili sec");
}


}

这是一个工作代码,你想要什么. . 让我知道,如果它有帮助

Spring Framework 有许多类似的 util 类,比如 Apache Commons Lang

File src = new File("/home/user/src");
File dest = new File("/home/user/dest");
FileSystemUtils.copyRecursively(src, dest);

下面是我写的递归函数,如果有帮助的话。它会将 source 目录中的所有文件复制到 destinationDirectory。

例如:

rfunction("D:/MyDirectory", "D:/MyDirectoryNew", "D:/MyDirectory");

public static void rfunction(String sourcePath, String destinationPath, String currentPath) {
File file = new File(currentPath);
FileInputStream fi = null;
FileOutputStream fo = null;


if (file.isDirectory()) {
String[] fileFolderNamesArray = file.list();
File folderDes = new File(destinationPath);
if (!folderDes.exists()) {
folderDes.mkdirs();
}


for (String fileFolderName : fileFolderNamesArray) {
rfunction(sourcePath, destinationPath + "/" + fileFolderName, currentPath + "/" + fileFolderName);
}
} else {
try {
File destinationFile = new File(destinationPath);


fi = new FileInputStream(file);
fo = new FileOutputStream(destinationPath);
byte[] buffer = new byte[1024];
int ind = 0;
while ((ind = fi.read(buffer))>0) {
fo.write(buffer, 0, ind);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally {
if (null != fi) {
try {
fi.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (null != fo) {
try {
fo.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}

爪哇8

Path sourcepath = Paths.get("C:\\data\\temp\\mydir");
Path destinationepath = Paths.get("C:\\data\\temp\\destinationDir");
Files.walk(sourcepath)
.forEach(source -> copy(source, destinationepath.resolve(sourcepath.relativize(source))));

复制方法

static void copy(Path source, Path dest) {
try {
Files.copy(source, dest, StandardCopyOption.REPLACE_EXISTING);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}

如果你不想使用外部库,你想使用 java.io 而不是 java.nio 类,你可以使用这个简洁的方法来复制一个文件夹及其所有内容:

/**
* Copies a folder and all its content to another folder. Do not include file separator at the end path of the folder destination.
* @param folderToCopy The folder and it's content that will be copied
* @param folderDestination The folder destination
*/
public static void copyFolder(File folderToCopy, File folderDestination) {
if(!folderDestination.isDirectory() || !folderToCopy.isDirectory())
throw new IllegalArgumentException("The folderToCopy and folderDestination must be directories");


folderDestination.mkdirs();


for(File fileToCopy : folderToCopy.listFiles()) {
File copiedFile = new File(folderDestination + File.separator + fileToCopy.getName());


try (FileInputStream fis = new FileInputStream(fileToCopy);
FileOutputStream fos = new FileOutputStream(copiedFile)) {


int read;
byte[] buffer = new byte[512];


while ((read = fis.read(buffer)) != -1) {
fos.write(buffer, 0, read);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}




}
}

据我所知,最好的办法如下:

    public static void main(String[] args) {


String sourceFolder = "E:\\Source";
String targetFolder = "E:\\Target";
File sFile = new File(sourceFolder);
File[] sourceFiles = sFile.listFiles();
for (File fSource : sourceFiles) {
File fTarget = new File(new File(targetFolder), fSource.getName());
copyFileUsingStream(fSource, fTarget);
deleteFiles(fSource);
}
}


private static void deleteFiles(File fSource) {
if(fSource.exists()) {
try {
FileUtils.forceDelete(fSource);
} catch (IOException e) {
e.printStackTrace();
}
}
}


private static void copyFileUsingStream(File source, File dest) {
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream(source);
os = new FileOutputStream(dest);
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
} catch (Exception ex) {
System.out.println("Unable to copy file:" + ex.getMessage());
} finally {
try {
is.close();
os.close();
} catch (Exception ex) {
}
}
}

我提供了一个替代解决方案,不需要使用第三方,比如 apacheFileUtils。这可以通过命令行完成。

我在 Windows 上测试了一下,它对我很有用,Linux 解决方案如下。

在这里,我使用 Windows收到命令来复制所有文件,包括子目录。 我传递的参数定义如下。

  • /e-复制所有子目录,即使它们是空的。
  • /i-如果 Source 是一个目录或包含通配符和目标 如果不存在,xcopy 假定 Destination 指定了一个目录名 然后,xcopy 复制所有指定的文件 进入新目录。
  • /h-复制具有隐藏和系统文件属性的文件, Xcopy 不复制隐藏文件或系统文件

我的示例使用 ProcessBuilder类构造一个进程来执行复制(xcopy & cp)命令。

视窗:

String src = "C:\\srcDir";
String dest = "C:\\destDir";
List<String> cmd = Arrays.asList("xcopy", src, dest, "/e", "/i", "/h");
try {
Process proc = new ProcessBuilder(cmd).start();
BufferedReader inp = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
while ((line = inp.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}

Linux:

String src = "srcDir/";
String dest = "~/destDir/";
List<String> cmd = Arrays.asList("/bin/bash", "-c", "cp", "r", src, dest);
try {
Process proc = new ProcessBuilder(cmd).start();
BufferedReader inp = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
while ((line = inp.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}

或者 组合拳,它可以在 窗户或者 Linux环境下工作。

private static final String OS = System.getProperty("os.name");
private static String src = null;
private static String dest = null;
private static List<String> cmd = null;


public static void main(String[] args) {
if (OS.toLowerCase().contains("windows")) { // setup WINDOWS environment
src = "C:\\srcDir";
dest = "C:\\destDir";
cmd = Arrays.asList("xcopy", src, dest, "/e", "/i", "/h");


System.out.println("on: " + OS);
} else if (OS.toLowerCase().contains("linux")){ // setup LINUX environment
src = "srcDir/";
dest = "~/destDir/";
cmd = Arrays.asList("/bin/bash", "-c", "cp", "r", src, dest);


System.out.println("on: " + OS);
}


try {
Process proc = new ProcessBuilder(cmd).start();
BufferedReader inp = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
while ((line = inp.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}


}

这个 防止文件从 腐化堕落

只要下载下面的罐子!
存档
下载页 < br >

import org.springframework.util.FileCopyUtils;


private static void copyFile(File source, File dest) throws IOException {
//This is safe and don't corrupt files as FileOutputStream does
File src = source;
File destination = dest;
FileCopyUtils.copy(src, dest);
}

对于 JRE6/Java6或更高版本 ,如果需要同步两个文件夹,可以使用此代码“ syncFolder”吗,可以删除 ProgressMonitor 参数。

该方法返回错误的递归字符串描述,如果没有问题,则返回空。

public static String syncFolder(File folderFrom, File folderTo, ProgressMonitor monitor) {
String res = "";
File[] fromFiles = folderFrom.listFiles();
float actualPercent = 0;
float iterationPercent = 100f / fromFiles.length;
monitor.setProgress(0);
for (File remoteFile : fromFiles) {
monitor.setNote("Sincronizando " + remoteFile.getName());
String mirrorFilePath = folderTo.getAbsolutePath() + "\\" + remoteFile.getName();
if (remoteFile.isDirectory()) {
File mirrorFolder = new File(mirrorFilePath);
if (!mirrorFolder.exists() && !mirrorFolder.mkdir()) {
res = res + "No se pudo crear el directorio " + mirrorFolder.getAbsolutePath() + "\n";
}
res = res + syncFolder(remoteFile, mirrorFolder, monitor);
} else {
boolean copyReplace = true;
File mirrorFile = new File(mirrorFilePath);
if (mirrorFile.exists()) {
boolean eq = HotUtils.sameFile(remoteFile, mirrorFile);
if (!eq) {
res = res + "Sincronizado: " + mirrorFile.getAbsolutePath() + " - " + remoteFile.getAbsolutePath() + "\n";
if (!mirrorFile.delete()) {
res = res + "Error - El archivo no pudo ser eliminado\n";
}
} else {
copyReplace = false;
}
}
if (copyReplace) {
copyFile(remoteFile, mirrorFile);
}
actualPercent = actualPercent + iterationPercent;
int resPercent = (int) actualPercent;
if (resPercent != 100) {
monitor.setProgress(resPercent);
}
}
}
return res;
}
    

public static boolean sameFile(File a, File b) {
if (a == null || b == null) {
return false;
}


if (a.getAbsolutePath().equals(b.getAbsolutePath())) {
return true;
}


if (!a.exists() || !b.exists()) {
return false;
}
if (a.length() != b.length()) {
return false;
}
boolean eq = true;


FileChannel channelA = null;
FileChannel channelB = null;
try {
channelA = new RandomAccessFile(a, "r").getChannel();
channelB = new RandomAccessFile(b, "r").getChannel();


long channelsSize = channelA.size();
ByteBuffer buff1 = channelA.map(FileChannel.MapMode.READ_ONLY, 0, channelsSize);
ByteBuffer buff2 = channelB.map(FileChannel.MapMode.READ_ONLY, 0, channelsSize);
for (int i = 0; i < channelsSize; i++) {
if (buff1.get(i) != buff2.get(i)) {
eq = false;
break;
}
}
} catch (FileNotFoundException ex) {
Logger.getLogger(HotUtils.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(HotUtils.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
if (channelA != null) {
channelA.close();
}
if (channelB != null) {
channelB.close();
}
} catch (IOException ex) {
Logger.getLogger(HotUtils.class.getName()).log(Level.SEVERE, null, ex);
}
}
return eq;
}


public static boolean copyFile(File from, File to) {
boolean res = false;
try {
final FileInputStream inputStream = new FileInputStream(from);
final FileOutputStream outputStream = new FileOutputStream(to);
final FileChannel inChannel = inputStream.getChannel();
final FileChannel outChannel = outputStream.getChannel();
inChannel.transferTo(0, inChannel.size(), outChannel);
inChannel.close();
outChannel.close();
inputStream.close();
outputStream.close();
res = true;
} catch (FileNotFoundException ex) {
Logger.getLogger(SyncTask.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(SyncTask.class.getName()).log(Level.SEVERE, null, ex);
}
return res;
}