通过这篇的学习可以掌握以下目标
- 掌握Java.io包中类的继承关系
- 可以使用File类进行文件的操作
- 可以使用字节流或字符流操作文件内容并区分出字节流与字符流的区别
- 掌握内存操作输入、输出流的使用
- 了解线程通讯流——管道流的作用
- 掌握System类对IO的三个支持System.out,System.err,System.in
- 可以使用打印流方便地打印输出的内容,并可以使用Java新特性格式化输出.
- 可以使用BufferedReader类读取缓冲区中的内容。
- 了解Java提供的输入工具类Scanner类的使用。
- 掌握数据操作流DataInputStream和DataOutputStream类的使用。
- 可以使用SequenceInputStream合并两个文件的内容
- 可以使用压缩流完成ZIP文件格式的压缩。
- 了解回退流(pushbackInputStream)类的作用及操作原理
- 了解字符的主要编码类型及乱码产生原因
掌握对象序列化的作用以及Serialzable接口,Externalizable接口,transient关键字的使用
Java IO操作主要指的是使用Java进行输入,输出操作,Java中的所有操作类都存在java.io包中,在使用时需要导入此包。
在整个java.io包中最重要的就是5个类和一个接口,5个类指的是File,OutputStream,InputStream,Write,Reader;1个接口指的是Serializable。掌握了这些就等于掌握了IO操作的核心。
File类的基本介绍
在整个io包中,唯一与文件有关的类就是File类。
以下是File类中的常用方法和常量
使用File类操作文件
File类的对象实例化完成后,就可以使用createNewFile()创建一个新文件,但是此方法使用了throws关键字声明,所以在使用中,必须使用try….catch进行异常的处理,例如现在在D盘上创建一个test.txt的文件。
import java.io.File ;
import java.io.IOException ;
public class FileDemo01{
public static void main(String args[]){
File f = new File("d:\\test.txt") ; // 实例化File类的对象
try{
f.createNewFile() ; // 创建文件,根据给定的路径创建
}catch(IOException e){
e.printStackTrace() ; // 输出异常信息
}
}
};
运行程序之后发现D盘中已经创建好了test.txt文件
删除一个指定的文件
import java.io.File ;
import java.io.IOException ;
public class FileDemo02{
public static void main(String args[]){
File f = new File("d:"+File.separator+"test.txt") ; // 实例化File类的对象
if(f.exists()){ // 如果文件存在则删除
f.delete() ; // 删除文件
}
}
};
综合创建和删除文件的操作
import java.io.File ;
import java.io.IOException ;
public class FileDemo03{
public static void main(String args[]){
File f = new File("d:"+File.separator+"test.txt") ; // 实例化File类的对象
if(f.exists()){ // 如果文件存在则删除
f.delete() ; // 删除文件
}else{
try{
f.createNewFile() ; // 创建文件,根据给定的路径创建
}catch(IOException e){
e.printStackTrace() ; // 输出异常信息
}
}
}
};
创建一个文件夹
import java.io.File ;
import java.io.IOException ;
public class FileDemo04{
public static void main(String args[]){
File f = new File("d:"+File.separator+"test") ; // 实例化File类的对象
f.mkdir() ; // 创建文件夹
}
};
列出指定目录的全部文件
使用list()方法列出一个目录中的全部内容
import java.io.File ;
import java.io.IOException ;
public class FileDemo05{
public static void main(String args[]){
File f = new File("d:"+File.separator) ; // 实例化File类的对象
String str[] = f.list() ; // 列出给定目录中的内容
for(int i=0;i<str.length;i++){
System.out.println(str[i]) ;
}
}
};
程序运行结果:
从输出结果可以发现,以上列出只是指定目录中的文件名称,并不是一个文件的完整路径。
使用listFiles()方法列出一个目录中的全部内容
import java.io.File ;
import java.io.IOException ;
public class FileDemo06{
public static void main(String args[]){
File f = new File("d:"+File.separator) ; // 实例化File类的对象
File files[] = f.listFiles() ; // 列出全部内容
for(int i=0;i<files.length;i++){
System.out.println(files[i]) ;
}
}
};
程序运行结果:
以上直接打印的是File类对象,可以把一个完整的路径取出。两者比较之后可以发现,使用listFile()方法列出目录中的内容更加方便。
判断一个给定的路径是否是目录
import java.io.File ;
import java.io.IOException ;
public class FileDemo07{
public static void main(String args[]){
File f = new File("d:"+File.separator) ; // 实例化File类的对象
if(f.isDirectory()){ // 判断是否是目录
System.out.println(f.getPath() + "路径是目录。") ;
}else{
System.out.println(f.getPath() + "路径不是目录。") ;
}
}
};
程序运行结果:
以上列出了一些File类中的常用方法,下面再看一个实例,以加深对File类的理解
给定一个目录,要求列出此目录下的全部内容,因为给定目录可能存在子文件夹,此时要求也可以把所有的子文件夹的文件列出来。
操作的流程如图所示:
import java.io.File ;
import java.io.IOException ;
public class FileDemo08{
public static void main(String args[]){
File my = new File("d:" + File.separator) ; // 操作路径
print(my) ;
}
public static void print(File file){ // 递归调用
if(file!=null){ // 判断对象是否为空
if(file.isDirectory()){ // 如果是目录
File f[] = file.listFiles() ; // 列出全部的文件
if(f!=null){ // 判断此目录能否列出
for(int i=0;i<f.length;i++){
print(f[i]) ; // 因为给的路径有可能是目录,所以,继续判断
}
}
}else{
System.out.println(file) ; // 输出路径
}
}
}
};
程序运行结果:
以上程序采用递归的调用形式不断地判断传进来的路径是否为目录,如果是目录,则继续列出子文件夹,如果不是,则直接打印路径名称。
未完待续!