import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class FileManipulationTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
File src = new File("C:/Users/leo/Desktop/yidu");
File dst = new File("C:/Users/leo/Desktop/dd/mm");
copy(src, dst,true,true);//剪切
}
public static boolean rename(File file,String name){
String str = file.getParent();
if(!str.endsWith(File.separator))
str += File.separator;
return file.renameTo(new File(str+name));
}
public static void delete(File file){
if(file.isFile()){
file.delete();
}else if(file.isDirectory()){
File[] list = file.listFiles();
for(int i=0;i<list.length;i++){
delete(list[i]);
}
file.delete();
}
}
@Deprecated
public static void cut(File src,File dst){
copy(src, dst,true,false);
delete(src);
}
//上面的cut方法将文件夹全部复制后再删除整个文件夹,这种方法不好。因为如果有几个文件复制失败,源文件也会都被删除了
//若要剪切应该用下面的copy方法,将参数cut设为true,它是复制一个删除一个,复制失败就不会删除源文件
/**
*
* @param src:源文件(夹)
* @param dst:目标文件(夹)
* @param forced:如果遇到同名文件,是否覆盖
* @param cut:复制完是否删除源文件,若设为true,效果如同剪切
* 注意:dst是目标路径而不是目标路径所在的文件夹,比如要不c:/dir复制到d:/盘下,则dst应该是File("d:/dir")而不是File("d:/")
*/
public static void copy(File src,File dst,boolean forced,boolean cut){
if(src.isFile()){
if(!dst.isFile() || forced)
try {
dst.createNewFile();
_copy(src, dst);
if(cut)
src.delete();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else if(src.isDirectory()){
dst.mkdirs();
File[] list = src.listFiles();
for(int i=0;i<list.length;i++){
String rp = list[i].getAbsolutePath().substring(src.getAbsolutePath().length(), list[i].getAbsolutePath().length());
File dstFile = new File(dst.getAbsolutePath()+rp);
copy( list[i],dstFile,forced,cut);
}
if(cut)
src.delete();
}
}
private static void _copy(File src,File dst) throws IOException{
FileChannel dstfc = null;
FileChannel srcfc = null;
try {
dstfc = new FileOutputStream(dst).getChannel();
srcfc = new FileInputStream(src).getChannel();
ByteBuffer buf = ByteBuffer.allocate(4*1024);
while(srcfc.size()>srcfc.position()){
buf.clear();
srcfc.read(buf);
buf.flip();
dstfc.write(buf);
}
} finally {
try {
if(dstfc != null)
dstfc.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if(srcfc != null)
srcfc.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/11068.html