一、File类
File类是java.io包中唯一对文件本身进行操作的类。它可以进行创建、删除文件等操作。
1. 创建文件
可以使用 createNewFille() 创建一个新文件。
注意:
Windows 中使用反斜杠表示目录的分隔符""。
Linux 中使用正斜杠表示目录的分隔符"/"。
最好的做法是使用 File.separator 静态常量,可以根据所在操作系统选取对应的分隔符。
2. 删除文件
可以使用 delete() 删除一个文件。
一般删除文件前,最好先使用 exists() 判断一下文件是否存在。
演示创建和删除文件操作
importjava.io.File;importjava.io.IOException;public classFileDemo01 {public static voidcreateFile(String filepath) {
File f= newFile(filepath);
System.out.println("[Create File] " +f.getPath().toString());try{
f.createNewFile();//创建文件,根据给定的路径创建
} catch(IOException e) {
e.printStackTrace();//输出异常信息
}
}public static voiddeleteFile(String filepath) {
File f= newFile(filepath);
System.out.println("[Delete File] " +f.getPath().toString());if(f.exists()){ //如果文件存在则删除
f.delete(); //创建文件,根据给定的路径创建
}
}public static voidmain(String args[]) {//注意三种分隔符方式
String path1 = "d:est1.txt"; //Windows中使用反斜杠表示目录的分隔符""
String path2 = "d:/test2.txt"; //Linux中使用正斜杠表示目录的分隔符"/"
String path3 = "d:" + File.separator + "test3.txt"; //最好的做法是使用File.separator,可以根据所在操作系统选取对应分隔符
createFile(path1);
createFile(path2);
createFile(path3);
deleteFile(path1);
}
};
3. 创建文件夹
可以使用 mkdir() 来创建文件夹,但是如果要创建的目录的父路径不存在,则无法创建成功。
如果要解决这个问题,可以使用 mkdirs(),当父路径不存在时,会连同上级目录都一并创建。
public classFileDemo02 {public static voidmain(String args[]) {
File f= new File("d:abcest"); //实例化File类的对象
f.mkdir(); //创建文件夹//f.mkdirs();//创建文件夹,如果父路径不存在,会一并创建
}
};
4. 列出指定目录全部文件
File中给出了两种列出文件夹内容的方法:
list(): 列出全部名称,返回一个字符串数组。
listFiles(): 列出完整的路径,返回一个File对象数组。
public classFileDemo03 {public static voidtestListFiles1(String path) {
File f= new File(path); //实例化File类的对象
String str[] = f.list(); //列出给定目录中的内容
System.out.println("[list]");for (int i = 0; i < str.length; i++) {
System.out.println(str[i]);
}
}public static voidtestListFiles2(String path) {
File f= new File(path); //实例化File类的对象
File files[] = f.listFiles(); //列出全部内容
System.out.println("[listFiles]");for (int i = 0; i < files.length; i++) {
System.out.println(files[i]);
}
}public static voidmain(String args[]) {
String path= "d:" +File.separator;
testListFiles1(path);
testListFiles2(path);
}
};
5. 删除目录
可以使用 delete() 来删除目录。
需要注意的是,如果这个目录不为空,直接用 delete() 删除会失败。
以下演示了一个删除指定目录,包括其所有子文件和子目录的范例:
importjava.io.File;public classDeleteDirectory {/*** 删除空目录,如果目录不为空,无法删除
*@paramdir*/
private static voiddeleteEmptyDir(String dir) {
File f= newFile(dir);boolean success =f.delete();if(success) {
System.out.println("Success to deleted " +dir);
}else{
System.out.println("Failed to delete " +dir);
}
}/*** 如果传入的是一个目录对象,遍历删除其所有子文件和子目录
*@paramdir
*@return
*/
private static booleandeleteDir(File dir) {if(dir.isDirectory()) {
File[] children= dir.listFiles();//递归删除目录中的子目录下
for (int i = 0; i < children.length; i++) {boolean success =deleteDir(children[i]);if (!success) {return false;
}
}
}//目录此时为空,可以删除
returndir.delete();
}public static voidmain(String[] args) {
String emptyDir= "d:empty";
String dir2= "d:est";
deleteEmptyDir(emptyDir);boolean success = deleteDir(newFile(dir2));if(success) {
System.out.println("Success to deleted " +dir2);
}else{
System.out.println("Failed to delete " +dir2);
}
}
}
二、RandomAccessFile类
RandomAccessFile类是随机读取类,它是一个完全独立的类。
它适用于由大小已知的记录组成的文件,所以我们可以使用seek()将记录从一处转移到另一处,然后读取或者修改记录。
文件中记录的大小不一定都相同,只要能够确定哪些记录有多大以及它们在文件中的位置即可。
RandomAccessFile类可以实现对文件内容的读写操作,但是比较复杂。所以一般操作文件内容往往会使用字节流或字符流方式。
1. 写入数据
当用 rw 方式声明RandomAccessFile对象时,如果要写入的文件不存在,系统将自行创建。
r 为只读;w 为只写;rw 为读写。
为了保证可以进行随机读取,所有写入的名字都是8个字节,写入的数字都是固定的4个字节。
importjava.io.File;importjava.io.RandomAccessFile;public classRandomAccessFileDemo01 {//所有的异常直接抛出,程序中不再进行处理
public static void main(String args[]) throwsException {
File f= new File("d:" + File.separator + "test.txt"); //指定要操作的文件
RandomAccessFile rdf = null; //声明RandomAccessFile类的对象
rdf = new RandomAccessFile(f, "rw");//读写模式,如果文件不存在,会自动创建
String name = null;int age = 0;
name= "zhangsan"; //字符串长度为8
age = 30; //数字的长度为4
rdf.writeBytes(name); //将姓名写入文件之中
rdf.writeInt(age); //将年龄写入文件之中
name = "lisi "; //字符串长度为8
age = 31; //数字的长度为4
rdf.writeBytes(name); //将姓名写入文件之中
rdf.writeInt(age); //将年龄写入文件之中
name = "wangwu "; //字符串长度为8
age = 32; //数字的长度为4
rdf.writeBytes(name); //将姓名写入文件之中
rdf.writeInt(age); //将年龄写入文件之中
rdf.close(); //关闭
}
};
2. 读取数据
读取是直接使用 r 的模式即可,以只读的方式打开文件。
读取时所有的字符串只能按照byte数组方式读取出来,而且长度必须和写入时的固定大小相匹配。
importjava.io.File;importjava.io.RandomAccessFile;public classRandomAccessFileDemo02{//所有的异常直接抛出,程序中不再进行处理
public static void main(String args[]) throwsException{
File f= new File("d:" + File.separator + "test.txt") ; //指定要操作的文件
RandomAccessFile rdf = null ; //声明RandomAccessFile类的对象
rdf = new RandomAccessFile(f,"r") ;//以只读的方式打开文件
String name = null;int age = 0;byte b[] = new byte[8] ; //开辟byte数组//读取第二个人的信息,意味着要空出第一个人的信息
rdf.skipBytes(12) ; //跳过第一个人的信息
for(int i=0;i
b[i]= rdf.readByte() ; //读取一个字节
}
name= new String(b) ; //将读取出来的byte数组变为字符串
age = rdf.readInt() ; //读取数字
System.out.println("第二个人的信息 --> 姓名:" + name + ";年龄:" +age) ;//读取第一个人的信息
rdf.seek(0) ; //指针回到文件的开头
for(int i=0;i
b[i]= rdf.readByte() ; //读取一个字节
}
name= new String(b) ; //将读取出来的byte数组变为字符串
age = rdf.readInt() ; //读取数字
System.out.println("第一个人的信息 --> 姓名:" + name + ";年龄:" +age) ;
rdf.skipBytes(12) ; //空出第二个人的信息
for(int i=0;i
b[i]= rdf.readByte() ; //读取一个字节
}
name= new String(b) ; //将读取出来的byte数组变为字符串
age = rdf.readInt() ; //读取数字
System.out.println("第三个人的信息 --> 姓名:" + name + ";年龄:" +age) ;
rdf.close() ;//关闭
}
};
三、字节流
1. 概要
字节流有两个核心抽象类:InputStream 和 OutputStream。所有的字节流类都继承自这两个抽象类。
InputStream 负责输入,OutputStream 负责输出。
字节流主要操作byte类型数据。
以下为 JDK8 版本中字节流的族谱图:
由上图可以看出,InputStream 和 OutputStream对于数据源的操作往往是成对出现的。
2. InputStream
InputStream的作用是用来表示哪些从不同数据源产生输入的类。
InputStream类型表
类
功能
构造器
ByteArrayInputStream
允许将内存的缓冲区当做InputStream使用
缓冲区,字节将从中取出
StringBufferInputStream
将String转换成InputStream
字符串。底层实现实际使用StringBuffer
FileInputStream
从文件中读取信息
字符串,表示文件名、文件或FileDescriptor对象
PipedInputStream
产生用于写入相关PipedOutputStream的数据。实现“管道化”概念
PipedOutputStream
SequenceInputStream
将多个InputStream对象合并为一个InputStream
两个InputStream对象或一个容纳InputStream对象的容器Enumeration
FilterInputStream
抽象类,作为“装饰器”的接口。其中“装饰器”为其他InputStream类提供有用功能
参考