需求:将H盘下的所有文件复制到H:/All 文件夹中

思路:使用递归遍历整个目标目录

  1. 传入目标路径
  2. 判断是否是文件夹

    是:调用listFiles()方法,得到File数组,重点内容接着执行1

    否:复制文件到H:/All

源码:

package FunDemo;

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter; public class Demo2 {
static FileWriter fw = null; public static void main(String[] args) throws Exception {
File file = new File("H:/");
sb(file);
} private static void sb(File file) throws Exception {
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files != null) {
for (File f : files) {
sb(f);
}
}
}
if (file.isFile()) {
FileReader fr = new FileReader(file.getAbsolutePath());
char[] cha = new char[1024];
fw = new FileWriter("H:/All/" + file.getName());
while (fr.read(cha) != -1) {
fw.write(cha, 0, cha.length);
fw.flush();
}
fw.close();
}
}
}

在解决这个问题 的过程中,遇到一个问题,其中一部分原代码片是这样的

if (file.isDirectory()) {
File[] files = file.listFiles();
for (File f : files) {
sb(f);
}
}

在执行的过程中,出现了空指针异常。为此,我有些疑惑,哪里来的空指针?

文件调用listFiles会返回null吗?文件夹呢?带着这个问题,首先我们来实验一下,数组出现空指针的情况;

情况一:

    int []in = {};
for(int i:in) {
System.out.println(i);
}

控制台没有输出,但是并不会出现空指针异常。

情况二:

    int []in = null;
for(int i:in) {
System.out.println(i);
}

此时,控制台会抛出空指针异常。java.lang.NullPointerException


所以,程序出现空指针异常的原因清楚了,因为存在file调用listFiles返回的数组是null。

又要问,为什么存在file调用listFiles返回的数组是null?

首先,我们来分析文件和文件夹调用listFiles是否都会有返回null的可能?

情况一:file为文件时

File file = new File("H:/test.txt");
File[] files = file.listFiles();
if (files == null) {
System.out.println("files为Null");//files为Null
}

此时,调用listFiles()返回null。

情况二:file为一个空的文件夹时

File fil=new File("H:/test");
File[] fils = fil.listFiles();
if (fils == null) {
System.out.println("fils为Null");//没有输出
}

此时,调用listFiles()没有输出,这很好理解,因为文件夹内为空,不会有输出。

然而,这就很奇怪了,因为在上述代码中,执行listFiles()前存在if (file.isDirectory()) 的前提,怎么会出现null的情况呢?

在这种情况下,我们查看javase api查看listFiles()的说明,发现存在这样一句话,如果抽象路径名不表示一个目录,或者发生 I/O 错误,则返回 null。唯一的解释就是发生了I/O错误,这是怎么回事呢?通过上网查阅资料,发现,存在一些文件/文件夹的访问权限很高,我们没有权限对其进行读写,此时就发生了所谓的I/O错误。

那么,知道了原因,就好办了,那么,这样可以解决吗?

if (file.isDirectory()) {
File[] files = null;
if (file.canRead()) {
file.listFiles();
for (File f : files) {
sb(f);
}
}
}

其实,这样也是不可以的,因为当不可读是files仍然是null,没有改变问题,所以解决方法就变成了最终样式:

    if (file.isDirectory()) {
File[] files = file.listFiles();
if (files != null) {
for (File f : files) {
sb(f);
}
}
}

欢迎留言,欢迎指正~

java学习日志---File实例:实现复制整个文件夹、解决listFiles()为null问题的更多相关文章

  1. Java学习笔记——File类之文件管理和读写操作、下载图片

    Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图 ...

  2. Java学习:File类

    Java学习:File类 File类的概述 重点:记住这三个单词 绝对路径和相对路径 File类的构造方法 File类判断功能的方法 File类创建删除功能的方法 File类获取(文件夹)目录和文件夹 ...

  3. java学习一目了然——File类文件处理

    java学习一目了然--File类文件处理 File类(java.io.File) 构造函数: File(String path) File(String parent,String child) F ...

  4. Java基础知识强化之IO流笔记50:IO流练习之 复制多级文件夹的案例

    1. 复制多级文件夹的案例 需求:复制多级文件夹       数据源:E:\JavaSE\day21\code\demos     目的地:E:\   分析:         A:封装数据源File ...

  5. java中递归实现复制多级文件夹

    常见的流的用法 递归实现复制多级文件夹 FileInputStream & FileOutputStream String content = null;//用来储存解码后的byte数组 in ...

  6. IO流(10)复制多级文件夹

    import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import ja ...

  7. IO流-复制多极文件夹(递归实现)

    package com.io.test; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ...

  8. IO流案例:1.复制多级文件夹 2.删除多级文件夹

    package copy; /* 需求:复制多级文件夹 复制d:\\itcast(包含文件和子文件夹)到模块目录下 分析: d:\\itcast a.txt b.txt javaweb a.xml b ...

  9. java 弹出选择目录框(选择文件夹),获取选择的文件夹路径

    java 弹出选择目录框(选择文件夹),获取选择的文件夹路径 java 弹出选择目录框(选择文件夹),获取选择的文件夹路径:int result = 0;File file = null;String ...

随机推荐

  1. zoj 3023 Light Bulb

    题目大意: 求L的最大值 思路: 可以想象出是一个关于人到灯泡距离x的单峰上凸函数 当光线在墙角左边的时候影子在不断增长 然后通过相似可以推出人在墙上影子的长度为:H+D*(h-H)/x 再加上地上的 ...

  2. [NOI2004]小H的小屋 贪心

    神仙贪心,洛谷没有插图导致我题一开始都没看懂.容易发现,块越多越优秀,然后为了满足题意,所以假如不能整除,就分为两个部分(能整除就直接均分就行了).前一部分是n/m,后一部分是n/m+1.数量也是固定 ...

  3. mysql/sql server和java之间的数据类型对应关系

    Mysql************************************当前列 ClassName ColumnType DisplaySize TypeName0: java.lang.I ...

  4. SqlServer数据库性能优化详解

    数据库性能优化详解 性能调节的目的是通过将网络流通.磁盘 I/O 和 CPU 时间减到最小,使每个查询的响应时间最短并最大限度地提高整个数据库服务器的吞吐量.为达到此目的,需要了解应用程序的需求和数据 ...

  5. Nginx配置try_files实践二

    本文内容承接<Nginx配置try_files实践一> 1. 环境: OS:Ubuntu 15.10 nginx:nginx/1.9.3 (Ubuntu) 假设有三台虚拟机db1(IP:1 ...

  6. ssh使用秘钥文件连接提示WARNING: UNPROTECTED PRIVATE KEY FILE!(转载)

    转自:http://www.01happy.com/ssh-unprotected-private-key-file/ 在centos 6.4下使用ssh连接远程主机时,用的是另外一个密钥,需要用-i ...

  7. bzoj题目大体分类

    http://m.blog.csdn.net/article/details?id=51387623

  8. Java 添加、回复、修改(替换)、删除Word批注

    批注是一种常用于对特定文档内容进行注解的工具或方法,起到解释说明.标记指正的作用.在本篇文章中,将介绍如何操作Word批注的方法,包括: 1. 添加批注:添加文本到批注.插入图片到批注: 2. 回复批 ...

  9. GG_Logs 日志类库封装使用说明

    3.6.GG_Logs 日志类库封装使用说明 GG_Logs类库项目,Nuget安装log4net 添加代码配置代码: [assembly: log4net.Config.XmlConfigurato ...

  10. sourcetree跳过注册方法

    很人用git命令行不熟练,那么可以尝试使用sourcetree进行操作. 然鹅~~sourcetree又一个比较严肃的问题就是,很多人不会跳过注册或者操作注册. 废话不多,我们直接开始跳过注册阶段的操 ...