java学习日志---File实例:实现复制整个文件夹、解决listFiles()为null问题
需求:将H盘下的所有文件复制到H:/All 文件夹中
思路:使用递归遍历整个目标目录
- 传入目标路径
- 判断是否是文件夹
是:调用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问题的更多相关文章
- Java学习笔记——File类之文件管理和读写操作、下载图片
Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图 ...
- Java学习:File类
Java学习:File类 File类的概述 重点:记住这三个单词 绝对路径和相对路径 File类的构造方法 File类判断功能的方法 File类创建删除功能的方法 File类获取(文件夹)目录和文件夹 ...
- java学习一目了然——File类文件处理
java学习一目了然--File类文件处理 File类(java.io.File) 构造函数: File(String path) File(String parent,String child) F ...
- Java基础知识强化之IO流笔记50:IO流练习之 复制多级文件夹的案例
1. 复制多级文件夹的案例 需求:复制多级文件夹 数据源:E:\JavaSE\day21\code\demos 目的地:E:\ 分析: A:封装数据源File ...
- java中递归实现复制多级文件夹
常见的流的用法 递归实现复制多级文件夹 FileInputStream & FileOutputStream String content = null;//用来储存解码后的byte数组 in ...
- IO流(10)复制多级文件夹
import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import ja ...
- IO流-复制多极文件夹(递归实现)
package com.io.test; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ...
- IO流案例:1.复制多级文件夹 2.删除多级文件夹
package copy; /* 需求:复制多级文件夹 复制d:\\itcast(包含文件和子文件夹)到模块目录下 分析: d:\\itcast a.txt b.txt javaweb a.xml b ...
- java 弹出选择目录框(选择文件夹),获取选择的文件夹路径
java 弹出选择目录框(选择文件夹),获取选择的文件夹路径 java 弹出选择目录框(选择文件夹),获取选择的文件夹路径:int result = 0;File file = null;String ...
随机推荐
- http trigger 事件源是事件的生产者,函数是事件的处理者
以函数计算作为 API 网关后端服务_用户指南(开放 API)_API 网关-阿里云 https://help.aliyun.com/document_detail/54788.html 创建触发器 ...
- iphone分辨率大全
分辨率越高,屏幕质量也就越高越清晰,iphone的近几代产品处了从3GS到4代时有一个突破性的变化(当然那个时候3GS像素确实太低了),其他的几代产品在这项指标上并未有太大的变化. iphone分辨率 ...
- 10.05FZSZ Day2模拟总结
今天的题目难度比昨天小一些,但是太菜的我还是啥也不会. 今天的出题大佬是Heaplex,他的题目中倒是出现了ZZQ,不知道是否是本人? T1.a 期望得分30,实际得分30 这道题开场发现好像有什么小 ...
- VS快捷键整理
Ctrl+J 自动提示Ctrl+. 解析ctrl+e,d 格式化代码ctrl+e,s 辅助横线Ctrl+m,o 全部合闭Ctrl+m,l 全部打开Ctrl + Shift + space 方法提示调用 ...
- 如何精通javascript
http://stackoverflow.com/questions/2628672/what-should-every-javascript-programmer-know Not jQuery. ...
- KeepAlived的实现示例
KeepAlived的实现示例 KeepAlived的实现 HA Cluster配置准备: 各节点时间必须同步 ntp(6), chrony(7) 1>在centos6上 ntpdate 172 ...
- bzoj 1718: [Usaco2006 Jan] Redundant Paths 分离的路径【tarjan】
首先来分析一下,这是一张无向图,要求没有两条路联通的点对个数 有两条路连通,无向图,也就是说,问题转化为不在一个点双连通分量里的点对个数 tarjan即可,和求scc还不太一样-- #include& ...
- bzoj 1642: [Usaco2007 Nov]Milking Time 挤奶时间【dp】
这不就是个n方dp吗--看了眼洛谷题解简直神仙打架 我全程没用到n-- 把休息时间并入产奶时间,注意"结束时间不挤奶",所以ei=ei+r-1,注意这个-1! 然后按r排序,设f[ ...
- [Swift通天遁地]一、超级工具-(19)制作六种别具风格的动作表单
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- TestNG设置用例循环执行
曾经做过一需求,需要单个集成测试用例循环执行N次,或许你会说for循环就可以了,这当然是可以的.那有没有逼格更高点的方法,当然也是有的.下面我们就说下使用TestNG注解功能实现用例的循环执行. 1. ...