1 A.java
* 1.分别使用字符流和字节流复制图片(底层是二进制文件,如图片 视频 音频等)
*
* 二进制文件只能使用字节流进行复制(使用windows自带记事本打开读不懂的)
*
* 文本文件的复制即可使用字符流,也可以使用字节流
*
*
* 2.图解:字符流复制文件的解析
public class A {
public static void main(String[] args) throws IOException {
// method(); //说明不能用字符流来复制图片
method2();
}
private static void method2() throws FileNotFoundException, IOException {
//创建字节输入流对象--要读的
FileInputStream fis = new FileInputStream("1.png");
//创建字节输出流对象--要输出的的
FileOutputStream fos = new FileOutputStream("file/22.png"); //成功输出,图片也是一模一样
//一次读写一个字节数组
int len;//用于存储读到的字节个数
byte[] bys = new byte[1024];
while((len = fis.read(bys)) != -1) {
fos.write(bys,0,len);
}
//释放资源
fos.close();
fis.close();
}
private static void method() throws FileNotFoundException, IOException {
//创建字符输入流对象
FileReader fr = new FileReader("1.png");
//创建字符输出流对象
FileWriter fw = new FileWriter("file/12.png");
//一次读写一个字符数组
int len;//用于存储读到的字符个数
char[] chs = new char[1024];
while((len = fr.read(chs)) != -1) { //执行完图片啥都没有
fw.write(chs,0,len);
fw.flush();
}
//释放资源
fw.close();
fr.close();
}
}
2 B.java
* 需求:将指定目录(包含内容)复制到另一个目录中
*
* 源目录 目标目录
*
*
* 分析:
* 1.首先我们要获取源目录下所有的文件和子目录,
* 我们可以把源目录封装成一个File对象,
* 我们可以调用File类listFiles()方法,
* 我们可以获取源目录下所有的文件和子目录所对应的File对象。
* 2.如果我们获取到的是文件
* 先在目标目录中创建该文件所对应的目录,
* 进行文件的复制。
* 3.如果我们获取到的是子目录
* 看看子目录下面是否还有其他的文件和更深层次的子目录
*
public class B {
public static void main(String[] args) throws IOException {
//源目录src
File src = new File("file");// 假设: d:\\myAPI
//目标目录dest
File dest = new File("copyfile");// 假设: d:\\a
System.out.println(src.isDirectory());
System.out.println(dest.isDirectory());
copyDir(src,dest);
}
public static void copyDir(File src,File dest) throws IOException {
//为了严谨起见,我们首先对源目录和目标目录进行判断,看他们到底是不是目录
if(src.isDirectory() && dest.isDirectory()) {
//1.创建新的目录(将源目录放到目标目录下)d:\\a\\myAPI
File newDir = new File(dest , src.getName());
if(!newDir.exists()) {
newDir.mkdir();
System.out.println("已创建目录:"+newDir);
}
//2.获取源目录下所有的文件和子目录,获取myAPI目录的所有文件
File[] files = src.listFiles();
//遍历数组获取
for (File file : files) {
//如果File对象是文件,我们就进行文件的复制
if(file.isFile()) {
//创建输入流对象,要读取的是MyAPI下的某个文件
FileInputStream fis = new FileInputStream(file);
//创建输出流对象,要输出到的是新目录下,名字一致的File
FileOutputStream fos = new FileOutputStream(new File(newDir,file.getName()));
//一次读取一个字节数组
byte[] bys = new byte[1024];
int len;
while((len = fis.read(bys)) != -1) {
fos.write(bys, 0, len);
// System.out.println("?");
}
fis.close();
fos.close();
}
//如果File对象是子目录,递归,看看子目录下面到底有什么
else if(file.isDirectory()) {
//递归:file作为源目录,newDir(d:\\a\\myAPI)作为目标目录,形成新的目录:d:\\a\\myAPI\\之前myAPI下的目录
copyDir(file,newDir);
}
}
}
else{
System.out.println("np");
}
}
}