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() 实现递归创建目录 演示:
package com.company; import java.io.File; /** * author Gsan */ public class TestMkdirs { public static void main(String[] args){ String path="C:/b/b/1.txt"; File f=new File(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型。
package com.company; import java.io.File; /** * author Gsan */ public class TestDirdelete { public static void main(String[] args) { //删除C盘目录下b目录 deleteDir(new File("C:/b/b")); } private static boolean deleteDir(File dir) { if (dir.isDirectory()) { String[] c = dir.list();//要删除目录下的所有目录和文件 for (int i = 0; i < c.length; i++) { boolean flag = deleteDir(new File(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();去读取字符,此过程提高性能。
package com.company; import java.io.*; /** * IO控制台输入 * 一个一个地读取字符 * 用read(); * author Gsan */ public class TestIOsystemin { public static void main(String[] args) throws IOException { char c=0; BufferedReader bw = new BufferedReader(new InputStreamReader(System.in)); System.out.println("请输入字符,按下‘E’键退出"); do{ //一个一个地读取字符 c= (char) bw.read(); System.out.println(c); }while(c!='E'); } }
运行结果:
IO控制台输入字符串:
用控制台输入字符串然后再读取,同样调用缓冲流将字符串读取进缓冲区,再调用readLine()读取到及控制台,提高性能。
package com.company; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * IO控制台输入字符串 * 读取字符串 * 用readLine(); * author Gsan */ public class TestIOsystemin2 { public static void main(String[] args) throws IOException { String str; BufferedReader bw=new BufferedReader(new InputStreamReader(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源码中还提供了多种获取方法和判断方法:
获取名称、父路径、上级文件、路径、绝对路径等等。
判断文件是否存在、是否目录、是否文件、是否隐藏、是否绝对路径等等。