はじめに:時間は誰も待たず、突然春になり、初夏が近づいています。しかし、自分のジャワの基礎がまだ弱く、「大峠は鉄のように堅い」のに「最初から山を越える」必要があったことに驚きました。しっかりとした基礎を築くことは基本であり、将来の仕事にも非常に重要です。継続的な学習と理解、さらにコード プログラムの手動練習を通じて、プログラミング学習に最適です。
トピック: マルチスレッドを使用してファイルをコピーする。コピー操作を実行するには、初期ファイル パスとターゲット フォルダー パスを入力します。
アイデア:
1. ファイルをコピーしたいだけの場合は、ファイルの reNameTo() メソッドを使用できますが、ファイルにフォルダーが含まれている場合は、ファイル IO ストリーム操作を通じてのみ実行できます。
2. まず、最も基本的な実装では、フォルダー内のすべてのファイルを走査し、それらをコレクションにパックします。
3. マルチスレッドを有効にし、スレッド プールを確立し、ファイルに対して IO ストリーム操作を実行してファイルをコピーします。
1. ファイルトラバーサル
1. すべてのファイルを取得する
public static List GetAllFiles(String SourceFile)//获取所有文件
{
List<File> FileList=new ArrayList<>();//文件列表
File file=new File(SourceFile);//获取源文件
if (file.exists()&&file.isDirectory()) {//如果文件存在且是文件夹形式则进行递归
FileList = LongEegodic(file, FileList);
}
return FileList;
}
2. 再帰
public static List LongEegodic(File file,List res)//递归获取文件、文件夹
{
File filelist[]=file.listFiles();
if (filelist==null)//文件为空直接返回
return null;
for (File file1:filelist)
{
res.add(file1);//无论是文件夹还是文件都加入列表
LongEegodic(file1,res);//递归,继续获取子文件
}
return res;
}
2. ファイルのIOストリームによりファイルのコピー操作を実現
public static void Copy(File Source,File Target)//使用IO流进行文件的复制操作
{
FileInputStream Fis=null;//输入流
FileOutputStream Fos=null;//输出流
try {
Fis=new FileInputStream(Source);
Fos=new FileOutputStream(Target);
byte buf[]=new byte[1024];//每次传送的字节数量
int len=0;
while ((len=Fis.read(buf))!=-1)//如果还有字节则继续传送
{
Fos.write(buf,0,len);//写入目标文件夹
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally {
try {
Fis.close();//关闭流
Fos.flush();//刷新流
Fos.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
3. マルチスレッドのファイルコピー
public static void main(String args[])
{
Scanner scan=new Scanner(System.in);
System.out.println("要复制的文件夹:");
String SourceFilePath=scan.next();
System.out.println("要复制到哪里去:");
String TargetFilePath=scan.next();
File SourceFile=new File(SourceFilePath);
File TargetFile=new File(TargetFilePath);
new Thread(){//多线程实现文件的复制
public void run() {
if (SourceFile.isFile()) {
System.out.println("复制单个文件");
Copy(SourceFile, TargetFile);
}
else {
List<File> FileLists=GetAllFiles(SourceFilePath);//获取全部文件
ExecutorService threadpool=Executors.newFixedThreadPool(20);//启用线程池,设定线程数量为20
for (File file:FileLists)
{
String PrimaryPath=file.getPath();//原文件路径
String NewPath=PrimaryPath.replace(SourceFile.getParent(),TargetFilePath+"/");//更改为新路径
System.out.println(PrimaryPath+ "变成了" + NewPath);
if (file.isDirectory())
{//文件夹则可以直接创建文件目录
new File(NewPath).mkdirs();
}
else {
threadpool.execute(new Runnable() {
@Override
public void run() {//重写方法
File copyfile=new File(NewPath);
copyfile.getParentFile().mkdirs();//先要有父文件夹
Copy(file,copyfile);//复制文件
}
});
}
}
}
}
}.start();
}
4. 完全なソースコード + 実行結果
package FileTest;
import java.util.concurrent.Executors;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
public class Test6 {
public static void main(String args[])
{
Scanner scan=new Scanner(System.in);
System.out.println("要复制的文件夹:");
String SourceFilePath=scan.next();
System.out.println("要复制到哪里去:");
String TargetFilePath=scan.next();
File SourceFile=new File(SourceFilePath);
File TargetFile=new File(TargetFilePath);
new Thread(){//多线程实现文件的复制
public void run() {
if (SourceFile.isFile()) {
System.out.println("复制单个文件");
Copy(SourceFile, TargetFile);
}
else {
List<File> FileLists=GetAllFiles(SourceFilePath);//获取全部文件
ExecutorService threadpool=Executors.newFixedThreadPool(20);//启用线程池,设定线程数量为20
for (File file:FileLists)
{
String PrimaryPath=file.getPath();//原文件路径
String NewPath=PrimaryPath.replace(SourceFile.getParent(),TargetFilePath+"/");//更改为新路径
System.out.println(PrimaryPath+ "变成了" + NewPath);
if (file.isDirectory())
{//文件夹则可以直接创建文件目录
new File(NewPath).mkdirs();
}
else {
threadpool.execute(new Runnable() {
@Override
public void run() {//重写方法
File copyfile=new File(NewPath);
copyfile.getParentFile().mkdirs();//先要有父文件夹
Copy(file,copyfile);//复制文件
}
});
}
}
}
}
}.start();
}
public static void Copy(File Source,File Target)//使用IO流进行文件的复制操作
{
FileInputStream Fis=null;//输入流
FileOutputStream Fos=null;//输出流
try {
Fis=new FileInputStream(Source);
Fos=new FileOutputStream(Target);
byte buf[]=new byte[1024];//每次传送的字节数量
int len=0;
while ((len=Fis.read(buf))!=-1)//如果还有字节则继续传送
{
Fos.write(buf,0,len);//写入目标文件夹
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally {
try {
Fis.close();//关闭流
Fos.flush();//刷新流
Fos.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
public static List GetAllFiles(String SourceFile)//获取所有文件
{
List<File> FileList=new ArrayList<>();//文件列表
File file=new File(SourceFile);//获取源文件
if (file.exists()&&file.isDirectory()) {//如果文件存在且是文件夹形式则进行递归
FileList = LongEegodic(file, FileList);
}
return FileList;
}
public static List LongEegodic(File file,List res)//递归获取文件、文件夹
{
File filelist[]=file.listFiles();
if (filelist==null)
return null;
for (File file1:filelist)
{
res.add(file1);
LongEegodic(file1,res);
}
return res;
}
}
結果:
投稿するのは簡単ではありません。偉い人は手を挙げてください。
好き: 好きは一種の美徳であり、上司が私の作品を認めてくれることです。
コメント: 白い接点はありません、それはあなたと私のコミュニケーションの始まりです!
コレクション: もっと選んでください。これは上司からの感謝の気持ちです。