------- android培训、java培训、期待与您交流! ---------
将C盘指定的一个文件夹(包含文件夹内的所有文件夹和所有文件,多层嵌套)复制到D盘中。贴出你的实现代码,并隐藏,回答正确即可获取技术分,根据代码质量酌情给分,最多可获得5分。
思路:用JFileChooser文件夹选择器来指定源文件或文件夹
定义两个函数 copyfile用来打文件 (输出同名文件和子目录文件)
copydirectory 用来打文件夹(在D盘创建同名文件夹和子目录)
package
博
客;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.swing.JFileChooser;
public
class LX3 {
static
String dird
=
"D:";
// 因为要求复制到D盘
public
static
void main(
String[] arg) {
JFileChooser jfc
=
new JFileChooser();
jfc.setDialogTitle(
"选择一个目录");
jfc.setDialogType(JFileChooser.OPEN_DIALOG);
// 指示 JFileChooser 支持 "Open"
// 文件操作的类型值
jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
// 设置文件选择器显示文件和文件夹
int res
= jfc.showOpenDialog(
null);
// 弹出一个 "Open File" 文件选择器对话框。
if (res
== jfc.APPROVE_OPTION) {
File dir
= jfc.getSelectedFile();
if (dir.isDirectory()) {
copydirectory(dir, dir.getAbsolutePath(), dir.getName());
}
else
copyfile(dir.getAbsolutePath(), dir.getName());
}
}
public
static
void copyfile(
String path,
String name)
// 复制文件
{
// 这里用了字节流
BufferedInputStream br
=
null;
BufferedOutputStream bw
=
null;
try {
br
=
new BufferedInputStream(
new FileInputStream(path));
}
catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
bw
=
new BufferedOutputStream(
new FileOutputStream(dird
+ File.separator
+ name));
// 复习了一下用separator方便兼容不同系统的路径表达
}
catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] b
=
new
byte[
1024];
// 缓冲
int x
=
0;
try {
while ((x
= br.read(b))
!=
-1) {
//System.out.println(x);
bw.write(b);
}
bw.flush();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
br.close();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
bw.close();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public
static
void copydirectory(File dir,
String path,
String name) {
// 复制文件夹
File[] f
= dir.listFiles();
boolean c
=
new File(dird
+ File.separator
+ name).mkdir();
// 更据文件夹名在D盘创建文件夹
for (
int x
=
0; x
< f.length; x
++) {
if (f[x].isDirectory()) {
// 判断是否是文件夹 (应为主函数中以作判断所以是用来判断子文件夹的)
name
+= File.separator
+ f[x].getName();
// 作子文件夹的路径创建路径
copydirectory(f[x], f[x].getAbsolutePath(), name);
// 递归
}
else {
copyfile(f[x].getAbsolutePath(),
name
+ File.separator
+ f[x].getName());
// 判断是文件传递源文件路径和复制路径
}
}
}
}
到做第4题的时候才发现建立缓冲时大小用读取流中的available()方法 建立个正好的缓冲
http://bbs.itheima.com/forum.php?mod=viewthread&tid=116270