设计一个类进行文件的复制,包括文本文件的复制和目录的复制
首先需要明确目的,第一是文件有两类,一类是文本文件的复制,另外一类是文件目录的复制,那么需要使用到两个方法。在以下的代码中将使用到两个方法,一个是public static void copy方法,一个是public static void copyDir方法,为什么设置static关键字?因为我这里没有创建多的类,只有一个类,由于main方法也是static的,所以在static静态方法中不可以直接调用非静态的方法,需要设置static关键字。详细点的可以看看static关键字的作用。
下面直接附上代码(代码中含有详细的解释)
首先是copy方法,文本文件的复制
public static void copy(String srcPath,String desPath) throws FileNotFoundException {
File file1 = new File(srcPath);
File file2= new File(desPath);
byte [] b = new byte[1024];
InputStream is = null;
OutputStream os = null;
//使用文件字节流进行输入输出
int n = -1;
try {
is = new FileInputStream(file1);
os = new FileOutputStream(file2);
while ((n =is.read(b))!=-1){
//read(byte b[])——将文件内容读取到byte数组里,返回值为文字的长度,若到末尾返回-1;
os.write(b,0,n);
}
os.flush();
} catch (IOException e) {
e.printStackTrace();
}try{
if (os != null)
os.close();
} catch (IOException e) {
e.printStackTrace();
}try {
if (is != null)
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
再就是copyDir方法,目录的复制
采用的是递归的方式进行目录的复制
public static void copyDir(String srcPath,String desPath) throws FileNotFoundException {
File file1 = new File(srcPath);// 首先是获取来源的文件对象
if (file1.exists()){// 是否存在文件目录
if (file1.isFile()){// 是文本文件
copy(file1.getAbsolutePath(),desPath);
/***
* 直接交给文本文件复制函数
* file1.getAbsolutePath获取当前的绝对路径
* desPath代表的目的地址
***/
}else{// 当前位置是目录
File file2 = new File(desPath,file1.getName());
/**file2是指的是,在目的地址的基础上加上一个源地址当前的位置
System.out.println(file2.getAbsolutePath);**/
file2.mkdirs();// 创建目录
for(File s:file1.listFiles()){
/**
* listFiles()是获取当前目录下的所有子目录,将其存储在一个File数组中,返回值是数组
*/
//System.out.println(s.getAbsolutePath);
if (s.isFile()){ // 再次判断是否为文本文件
File newDir = new File(file2,s.getName());
//newDir指的是,在目的地址上加上源地址当前的文件名(文本文件名)
copy(s.getAbsolutePath(),newDir.getAbsolutePath());
//s代表的是源文本地址
}else{
copyDir(s.getAbsolutePath(),file2.getAbsolutePath());
}
}
}
}
}
这里需要讲解几个对象,首先是file1,我在文中讲述的是源文件地址,意思就是参照文件的位置(需要进行复制的文件模板位置),再就是file2对象指的是在目的文件地址的基础上加上源文件地址的当前的文件名这样的一个新对象。举例说明会比较简单。例如:srcPath=“D:/javaHello”,desPath=“C:/javaWorld”,那么这里file1.getPath输出为“D:/javaHello”。但是file2.getPath会输出“C:/javaWorld/javaHello”,这就是区别。最后就是newDir对象,这里与上面是同理。
在详细的讲解一下这里的listFile方法,可以通过一个操作进行解释。
public class xx {
public static void main(String a[]){
File file = new File("D:/javaFileText");
for(File s:file.listFiles()){
System.out.println(s.getPath());
}
}
}
/**
会显示输出:
D:\javaFileText\exam.txt
D:\javaFileText\hello
D:\javaFileText\hello.txt
**/
其功能就是将当前文件目录下的子目录或者子文件都进行保存在一个File类型的数组当中,注意的是,只是保存当前一级的文件,D:\javaFileText\hello下面其实还有文件,但是listFile方法不保存下下一级的文件。
下面附上全部的代码
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/**
* 使用文件字节输入流和输出流达到文件(目录以及文本文件)的拷贝
* 分析问题,
* 1.需要两种方式进行复制,一种是文本文件的复制,一种是文件夹的复制
* 2.需要使用到输入流和输出流
*/
public class test {
public static void main(String[] args) throws FileNotFoundException {
copyDir("D:/javaFileText", "D:/javaFileText2");
}
/*****文件目录的复制******/
public static void copyDir(String srcPath,String desPath) throws FileNotFoundException {
File file1 = new File(srcPath);// 首先是获取来源的文件对象
if (file1.exists()){// 是否存在文件目录
if (file1.isFile()){// 是文本文件
copy(file1.getAbsolutePath(),desPath);
/***
* 直接交给文本文件复制函数
* file1.getAbsolutePath获取当前的绝对路径
* desPath代表的目的地址
***/
}else{// 当前位置是目录
File file2 = new File(desPath,file1.getName());
/**file2是指的是,在目的地址的基础上加上一个源地址当前的位置
System.out.println(file2.getAbsolutePath);**/
file2.mkdirs();// 创建目录
for(File s:file1.listFiles()){
/**
* listFiles()是获取当前目录下的所有子目录,将其存储在一个File数组中,返回值是数组
*/
//System.out.println(s.getAbsolutePath);
if (s.isFile()){ // 再次判断是否为文本文件
File newDir = new File(file2,s.getName());
//newDir指的是,在目的地址上加上源地址当前的文件名(文本文件名)
copy(s.getAbsolutePath(),newDir.getAbsolutePath());
//s代表的是源文本地址
}else{
copyDir(s.getAbsolutePath(),file2.getAbsolutePath());
}
}
}
}
}
/***文本文件的复制*****/
public static void copy(String srcPath,String desPath) throws FileNotFoundException {
File file1 = new File(srcPath);
File file2= new File(desPath);
byte [] b = new byte[1024];
InputStream is = null;
OutputStream os = null;
//使用文件字节流进行输入输出
int n = -1;
try {
is = new FileInputStream(file1);
os = new FileOutputStream(file2);
while ((n =is.read(b))!=-1){
//read(byte b[])——将文件内容读取到byte数组里,返回值为文字的长度,若到末尾返回-1;
os.write(b,0,n);
}
os.flush();
} catch (IOException e) {
e.printStackTrace();
}try{
if (os != null)
os.close();
} catch (IOException e) {
e.printStackTrace();
}try {
if (is != null)
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}