今天我们我们继续昨天的学习内容。
一.获取子目录中的内容
package com.java.IO;
import java.io.File;
public class FileDemo6 {
public static void main(String[] args) {
/*获取指定目录下的文件(包括子目录下)
*用的是递归,在方法内部调用本方法。
*/
File file=new File("F:\\eclipse-workspace\\IOStream");
getAllFile(file);
}
public static void getAllFile(File file) {
File[] files=file.listFiles();
for(File file1:files) {
if(file1.isDirectory()) {
getAllFile(file1);
}else {
System.out.println(file1);
}
}
}
}
/*
* F:\eclipse-workspace\IOStream\.classpath
F:\eclipse-workspace\IOStream\.project
F:\eclipse-workspace\IOStream\.settings\org.eclipse.jdt.core.prefs
F:\eclipse-workspace\IOStream\1.txt
F:\eclipse-workspace\IOStream\bin\com\java\IO\FileDemo.class
F:\eclipse-workspace\IOStream\bin\com\java\IO\FileDemo2.class
F:\eclipse-workspace\IOStream\bin\com\java\IO\FileDemo3.class
F:\eclipse-workspace\IOStream\bin\com\java\IO\FileDemo4.class
*/
二.递归
上述代码用到了递归方式,在来总结一下递归操作。
package com.java.IO;
public class FileDemo7 {
public static void main(String[] args) {
int sum=sum(10);
System.out.println("sum="+sum); // sum=55
}
public static int sum(int end){
if(end==1) {
return end;
}else {
return end+sum(end-1);
/*分析这段代码 return end+sum(end-1);
* return 3 + sum(2)
* 2 + sum(1)
* + 1
*在用递归的时候,在递归到最后面要有一个确定的返回值,
*然后返回这个返回值,并将递归方法依次出栈。
* */
}
}
}
三.删除目录
package com.java.IO;
import java.io.File;
public class FileDemo8 {
public static void main(String[] args) {
File file=new File("f:\\io");
deleteAll(file);
}
//利用递归在进行删除操作
public static void deleteAll(File file) {
File[] files=file.listFiles();
for(File file1:files) {
if(file.isDirectory()) {
deleteAll(file);
}
file1.delete(); //删除文件
}
file.delete(); /*删除文件夹,这个删除是用的递归,这个删除方法实在该for循环的内部。当完成后,
*执行外部的for循环,这个有点难理解
*/
}
}
四.字节输出流FileOutputStream
流按操作数据分为 字节流和字符流,按流的走向分为 输入流和输出流。其中输入和输出是以内存为参照的,
向内存输入数据,为输入流(读操作)。从内存输出数据,为输出流(写操作)。
字节流的抽象基类:InputStream 和 OutputStream。字符流的抽象基类:Reader 和 Writer。注意,由这4个
类派生出来的子类,其子类的后缀名都是父类名,如,InputStream 的子类 FileInputStream。
字节输入流InputStream,该抽象类是所有 字节输入流 的超类。
字节输出流OutputStream,该抽象类是所有 字节输出流 的超类。
我们先来将一段文本写入到文件中,代码如下:
package com.java.IO;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileDemo9 {
public static void main(String[] args) throws IOException {
//将一段文本写入到文件中,用文件输出流 FileOutputStream
File file=new File("f:\\5.txt");
/*
if(!file.exists()) {
file.createNewFile();
}
*/
//定义要写入的数据
String str="乔你那熊色";
//将要写入的数据转换为字节数组
byte[] byte1=str.getBytes();
//用文件输入流将文件写到文件夹
FileOutputStream fileOutputStream=new FileOutputStream(file);
fileOutputStream.write(byte1);
/*上述代码要注意的是:如果目的文件不存在,那么文件输出流就会自动创建文件,
*如果目的文件存在,就创建一个新文件覆盖。
*/
}
}
这个代码忘记了一个最重要的部分,就是fileOutputStream.close(); 关闭资源。如果资源不关闭,就会占用
系统资源,导致电脑运行越来越慢。
五.IOException的异常处理
在写io流的时候,会出现很多的异常,怎么处理这些异常呢?代码演示如下:
package com.java.IO;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileDemo9 {
public static void main(String[] args){
//IOException IO的异常处理(try-catch-finally)
File file=new File("f:\\6.txt");
String str="乔你那熊色";
byte[] byte1=str.getBytes();
FileOutputStream fileOutputStream=null;
try {
fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(byte1);
} catch (IOException e) {
throw new RuntimeException("文件写入失败" + e);
}finally {
try {
if(fileOutputStream!=null){
fileOutputStream.close();
}
} catch (IOException e) {
throw new RuntimeException("关闭失败" + e); //什么时候才能关闭失败呢?
}
}
}
}
六.文件续写和换行符
package com.java.IO;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileDemo10 {
/*文件内容的续写,我们在创建FileOutputStream对象的时候,无论是通过file对象还是
*String 路径,这两种构造方法都有另一个参数append,将这个第二个参数append设为
*true,就能够将续写。
*这里还需要注意的是:如果只是用一个参数的构造器,那么当文件不存在时,创建文件,存在时
*就用一个空的同名文件覆盖。 如果用两个参数的构造器,那么文件不存在时,创建文件,存在时
*直接在以存在的文件续写
*/
//换行符常量
private static final String LINE_SEPARATOR=System.getProperty("line.separator");
public static void main(String[] args) {
// static String a="aaa"; 方法中不能有静态变量。
File file=new File("f:\\9.txt");
String str=LINE_SEPARATOR+"乔你那熊色";
byte[] byte1=str.getBytes();
FileOutputStream fileOutputStream=null;
try {
fileOutputStream = new FileOutputStream(file,true); //--------------两个参数的构造器
fileOutputStream.write(byte1);
} catch (IOException e) {
throw new RuntimeException("文件写入失败" + e);
}finally {
try {
if(fileOutputStream!=null){
fileOutputStream.close();
}
} catch (IOException e) {
throw new RuntimeException("关闭失败" + e); //什么时候才能关闭失败呢?
}
}
}
}