Java.io包:
Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。在整个java.io包中最重要的就是5个类和3个接口:
类
说明
File
文件类
InputStream
字节输入流
OutputStream
字节输出流
Reader
字符输入流
Writer
字符输出流
Closeable
关闭流接口
Flushable
刷新流接口
Serializable
序列化接口
流分类:
输入流:数据源到程序(InputStream、Reader读进来)。
输出流:程序到目的地(OutputStream、Writer写出去)。
节点流:可以直接从数据源或目的地读写数据。
字节流:按照字节读取数据(InputStream、OutputStream)。
字符流:按照字符读取数据(Reader、Writer)。
输入流、输出流的子类层次图:
使用 File 类的 mkdirs() 、mkdir() 创建目录:
mkdir() : 创建此抽象路径名指定的目录,必须在有父类的文件夹下创建文件 。 mkdirs() : 创建此抽象路径名指定的目录。不确定此文件夹是否存在,不确定父文件夹存在。
使用 File 类的 mkdirs() 实现递归创建目录 演示:
packagecom.company;importjava.io.File;/*** author Gsan*/
public classTestMkdirs {public static voidmain(String[] args){
String path="C:/b/b/1.txt";
File f=newFile(path);boolean flag=f.mkdirs();
System.out.println(flag);
}
}
运行结果:
使用 File 类的dir.isDirectory(), dir.list() 和 dir.isdelete() 方法删除目录:
boolean dir.isDirectory();是否目录,返回boolean型。
dir.list();目录存储在List容器。
boolean dir.isdelete();是否删除目录,返回boolean型。
packagecom.company;importjava.io.File;/*** author Gsan*/
public classTestDirdelete {public static voidmain(String[] args) {//删除C盘目录下b目录
deleteDir(new File("C:/b/b"));
}private static booleandeleteDir(File dir) {if(dir.isDirectory()) {
String[] c= dir.list();//要删除目录下的所有目录和文件
for (int i = 0; i < c.length; i++) {boolean flag = deleteDir(newFile(dir, c[i]));if (!flag) {return false;
}
}
}if(dir.delete()){
System.out.println("目录删除成功");return true;
}else{
System.out.println("目录删除失败");return false;
}
}
}
运行结果:
IO控制台输入:
每当IO控制台输入字符,需要一个一个地读取字符时,应调用BufferedReader缓冲流将字符读取到缓冲区,再调用read();去读取字符,此过程提高性能。
packagecom.company;import java.io.*;/*** IO控制台输入
* 一个一个地读取字符
* 用read();
* author Gsan*/
public classTestIOsystemin {public static void main(String[] args) throwsIOException {char c=0;
BufferedReader bw= new BufferedReader(newInputStreamReader(System.in));
System.out.println("请输入字符,按下‘E’键退出");do{//一个一个地读取字符
c= (char) bw.read();
System.out.println(c);
}while(c!='E');
}
}
运行结果:
IO控制台输入字符串:
用控制台输入字符串然后再读取,同样调用缓冲流将字符串读取进缓冲区,再调用readLine()读取到及控制台,提高性能。
packagecom.company;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;/*** IO控制台输入字符串
* 读取字符串
* 用readLine();
* author Gsan*/
public classTestIOsystemin2 {public static void main(String[] args) throwsIOException {
String str;
BufferedReader bw=new BufferedReader(newInputStreamReader(System.in));
System.out.println("请输入字符串:用字符串‘end’结束程序!");do{
str=bw.readLine();
System.out.println(str);
}while(!bw.readLine().equals("end") );
}
}
运行结果:
这里解释一下用do-while循环而没有用while循环,因为do-while循环先先执行一次,再判断条件,而while先判断条件,再执行,那么我们的Enter回车也属于字符,假如用while就会把Enter也看做字符,这样就会陷进死循环,无法执行。
从File源码了解File:
上图为File源码构造方法的导图,我们常用的是中间三种方法创建File对象,下面将着重分析这三种方法。
1.File(String):
用此方法创建File对象时,String部分的字符应是File的路径,且路径名不能为null。
例如:
String path = "C:/用户/tanjianjie/project/io/a.txt";//构建File对象方法一
File src=new File(path);
2.File(String,String):
由上图分析可知,路径可分两部分,一部分是父路径,即是File的父目录;一部分是子路径,即是存在父目录下的File路径。
例如:
src=new File(new File("C:/用户/tanjianjie/project"),"io/a.txt");
3.File(File,String):
此方法与第二种方法类似。
File源码中还提供了多种获取方法和判断方法:
获取名称、父路径、上级文件、路径、绝对路径等等。
判断文件是否存在、是否目录、是否文件、是否隐藏、是否绝对路径等等。