多数程序在不获取外部数据的情况下不能顺利完成目标。数据从一个输入源获得,程序的结果被送到输出目的地。
Java程序通过流来完成输入/输出,它是生产和消费信息的抽象。流通过Java的输入/输出系统与物理设备连接,尽管与它们链接的物理设备不尽相同,但是所有流的行为具有同样的方式。这样,相同的输入/输出类和方法适用于所有类型的外部设备,这意味着一个输入流能够抽象多种不同类型的输入:从磁盘文件,从键盘或从网络套接字。同样,一个输出流可以输出到控制台、磁盘文件或相连的网络。流是处理输入/输出的一个简捷方法,例如它不需要代码理解键盘和网络的不同。Java中流的实现是基于Java.io包定义的类层次结构的。
Java的常用输入、输出流其实都是继承自4个抽象类:
基于单字节的InputStream、OutputStream类。
public abstract class InputStream extends Object implements Closeable
public abstract class OutputStream extends Object implements Closeable, Flushable
基于双字节的Unicode代码单元的Reader,Writer类。
public abstract class Reader extends Object implements Readable, Closeable
public abstract class Writer extends Object implements Appendable, Closeable, Flushable
一旦打开输入流后,程序就可从输入流串行地读数据。
从输入流读数据的过程一般如下:
1.open a stream
2.while more information
3.read information
4.close the stream
往输出流写数据的过程一般如下:
1.open a stream
2.while more information
3.write information
4.close the stream
File类的实例是不可变的;也就是说,一旦创建,File对象表示的抽象路径名将永不改变。
通过java.io.File类可以获取文件的属性信息,使用File类的关键点如下:
1. 相对路径:相对路径就是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。如:"./temp/xx.txt"将指向当前目录的temp子目录下的xx.txt文件。
2. 绝对路径:文件的真是路径。如Linux操作系统下的"/usr/Java/xx.sh",Windows下的"c:/temp/xx.txt"。
3. File类的构造方法的参数可以是文件的相对路径,也可以是文件的绝对路径,它被当作File对象的抽象路径。
4. File类的getName方法获得文件名,该文件名不包含路径信息。
5. File类的getPath方法把抽象路径中的文件分隔符用系统默认文件分隔符替换后返回。windows下的系统默认文件分隔符是"\",linux和UNIX下默认文件分隔符是"/"。
6. File类的getAbsolutePath方法获得文件的绝对路径。
7. File类的isAbsolute方法判断File对象的抽象路径是否为绝对路径。
8. File类的toURI方法获得File对象的URI,以"file:"协议开头。
9. File对象可以指向一个目录,isDirectory方法返回它是否指向目录,isFile方法返回它是否指向一个具体文件。
10. File对象指向的文件可以不存在,exists方法返回它指向的文件是否存在。
当File对象指向一个目录时,可以通过File对象来获取目录下的文件信息。
1. File类的list方法返回该目录下所有文件(包括目录)的文件名,文件名不包含路径信息。
2. File类的listFile方法返回该目录下所有文件(包括目录)的File对象。
3. FilenameFilter是文件名过滤器接口类,所有自定义的文件名过滤器必须实现改接口的accept方法。
创建文件和目录的关键技术点如下:
1. File类的createNewFile根据抽象路径创建一个新的空文件,当抽象路径制定的文件存在时,创建失败。
2. File类的mkdir方法根据抽象路径创建目录。
3. File类的mkdirs方法根据抽象路径创建目录,包括创建必需但不存在的父目录。
4. File类的createTempFile方法创建临时文件,可以制定临时文件的文件名前缀、后缀及文件所在的目录,如果不指定目录,则存放在系统的临时文件夹下。
5. 除mkdirs方法外,以上方法在创建文件和目录时,必须保证目标文件不存在,而且父目录存在,否则会创建失败。
删除文件和目录关键技术点如下:
1. File的delete方法能删除文件和目录。
2. 当File指向一个目录时,只有当目录为空(没有子目录和子文件)时,才能用delete方法将其删除。
Java程序通过流来完成输入/输出,它是生产和消费信息的抽象。流通过Java的输入/输出系统与物理设备连接,尽管与它们链接的物理设备不尽相同,但是所有流的行为具有同样的方式。这样,相同的输入/输出类和方法适用于所有类型的外部设备,这意味着一个输入流能够抽象多种不同类型的输入:从磁盘文件,从键盘或从网络套接字。同样,一个输出流可以输出到控制台、磁盘文件或相连的网络。流是处理输入/输出的一个简捷方法,例如它不需要代码理解键盘和网络的不同。Java中流的实现是基于Java.io包定义的类层次结构的。
Java的常用输入、输出流其实都是继承自4个抽象类:
基于单字节的InputStream、OutputStream类。
public abstract class InputStream extends Object implements Closeable
public abstract class OutputStream extends Object implements Closeable, Flushable
基于双字节的Unicode代码单元的Reader,Writer类。
public abstract class Reader extends Object implements Readable, Closeable
public abstract class Writer extends Object implements Appendable, Closeable, Flushable
一旦打开输入流后,程序就可从输入流串行地读数据。
从输入流读数据的过程一般如下:
1.open a stream
2.while more information
3.read information
4.close the stream
往输出流写数据的过程一般如下:
1.open a stream
2.while more information
3.write information
4.close the stream
File类的实例是不可变的;也就是说,一旦创建,File对象表示的抽象路径名将永不改变。
通过java.io.File类可以获取文件的属性信息,使用File类的关键点如下:
1. 相对路径:相对路径就是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。如:"./temp/xx.txt"将指向当前目录的temp子目录下的xx.txt文件。
2. 绝对路径:文件的真是路径。如Linux操作系统下的"/usr/Java/xx.sh",Windows下的"c:/temp/xx.txt"。
3. File类的构造方法的参数可以是文件的相对路径,也可以是文件的绝对路径,它被当作File对象的抽象路径。
4. File类的getName方法获得文件名,该文件名不包含路径信息。
5. File类的getPath方法把抽象路径中的文件分隔符用系统默认文件分隔符替换后返回。windows下的系统默认文件分隔符是"\",linux和UNIX下默认文件分隔符是"/"。
6. File类的getAbsolutePath方法获得文件的绝对路径。
7. File类的isAbsolute方法判断File对象的抽象路径是否为绝对路径。
8. File类的toURI方法获得File对象的URI,以"file:"协议开头。
9. File对象可以指向一个目录,isDirectory方法返回它是否指向目录,isFile方法返回它是否指向一个具体文件。
10. File对象指向的文件可以不存在,exists方法返回它指向的文件是否存在。
/**
* 查看文件属性
*/
public static String showFile(String path) {
//如果dirName不以文件分隔符结尾,自动添加文件分隔符
if (!path.endsWith(File.separator)) {
path = path + File.separator;
}
File file = new File(path);
if(file.exists()){
if(!file.isDirectory()){
StringBuffer strb = new StringBuffer();
strb.append("File name: " + file.getName()+"\n");
strb.append("File Abstract Path: " + file.getPath()+"\n");
strb.append("File Absolute Path: " + file.getAbsolutePath()+"\n");
strb.append("File Parental Path: " + file.getParent()+"\n");
if(file.isHidden()) {
strb.append("is a Hidden File: Yes"+"\n");
}else{
strb.append("is a Hidden File: No"+"\n");
}
if(file.canRead()) {
strb.append("Can Read: Yes"+"\n");
}else{
strb.append("Can Read: No"+"\n");
}
if(file.canWrite()) {
strb.append("Can Write: Yes"+"\n");
}else{
strb.append("Can Write: No"+"\n");
}
if(file.isAbsolute()) {
strb.append("File path is Absolute Path: Yes"+"\n");
}else{
strb.append("File path is Absolute Path: No"+"\n");
}
strb.append("Abstract Path URI: " + file.toURI()+"\n");
strb.append("Abstract Path of parent URI: " + new File(file.getParent()).toURI()+"\n");
strb.append("File Last Modify Time: " + new Date(file.lastModified()) +"\n");
strb.append("File Szie: " + file.length() + "bytes"+"\n");
return strb.toString();
}else{
return "The path is \"" + path + "\" is a Directory, Not a File.";
}
}else{
return "Not Found the file with this path:"+path;
}
}
/**
* 查看文件夹属性
*/
public static String showDirectory(String path) {
if (!path.endsWith(File.separator)) {
path = path + File.separator;
}
File dir = new File(path);
if(dir.exists()){
if(dir.isDirectory()){
StringBuffer strb = new StringBuffer();
strb.append("Directory Name:" + dir.getName()+"\n");
strb.append("Directory Abstract Path:" + dir.getPath()+"\n");
strb.append("Directory Absolute Path:" + dir.getAbsolutePath()+"\n");
strb.append("Directory's Parental:" + dir.getParent()+"\n");
if(dir.isHidden()) {
strb.append("Is Hidden Directory:Yes"+"\n");
}else{
strb.append("Is Hidden Directory:No"+"\n");
}
if(dir.isAbsolute()) {
strb.append("Directory path is Absolute Path: Yes"+"\n");
}else{
strb.append("Directory path is Absolute Path: Yes"+"\n");
}
strb.append("Abstract Path URI: " + dir.toURI()+"\n");
strb.append("Abstract Path of parent URI: " + new File(dir.getParent()).toURI()+"\n");
strb.append("Directory Last Modify Time: " + new Date(dir.lastModified())+"\n");
return strb.toString();
}else {
return "The path is \"" + path + "\" is a File, Not a Directory.";
}
}else {
return "Not Found the Directory with this path:"+path;
}
}
当File对象指向一个目录时,可以通过File对象来获取目录下的文件信息。
1. File类的list方法返回该目录下所有文件(包括目录)的文件名,文件名不包含路径信息。
2. File类的listFile方法返回该目录下所有文件(包括目录)的File对象。
3. FilenameFilter是文件名过滤器接口类,所有自定义的文件名过滤器必须实现改接口的accept方法。
/**
* 列出目录下所有文件包括子目录的文件路径
*/
public static void showAllFilesAndDirectory(String path) {
if (!path.endsWith(File.separator)) {
path = path + File.separator;
}
File dir = new File(path);
if (!dir.exists() || (!dir.isDirectory())) {
System.out.println("Not Found the Directory with this path:"+path);
return;
}
File[] files = dir.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
System.out.println(" ---File: "+files[i].getAbsolutePath());
} else if (files[i].isDirectory()) {
System.out.println("Directory: "+files[i].getAbsolutePath());
showAllFilesAndDirectory(files[i].getAbsolutePath());
}
}
}
创建文件和目录的关键技术点如下:
1. File类的createNewFile根据抽象路径创建一个新的空文件,当抽象路径制定的文件存在时,创建失败。
2. File类的mkdir方法根据抽象路径创建目录。
3. File类的mkdirs方法根据抽象路径创建目录,包括创建必需但不存在的父目录。
4. File类的createTempFile方法创建临时文件,可以制定临时文件的文件名前缀、后缀及文件所在的目录,如果不指定目录,则存放在系统的临时文件夹下。
5. 除mkdirs方法外,以上方法在创建文件和目录时,必须保证目标文件不存在,而且父目录存在,否则会创建失败。
/**
* 创建目录
* @param destDirName 目标目录名
* @return 目录创建成功返回true,否则返回false
*/
public static boolean createDirectory(String dirName) {
File dir = new File(dirName);
if (dir.exists()) {
System.out.println("Create directory \"" + dir.getName() + "\" fail."+
"\n" + "\"" + dir.getName() +"\" directory is already exist.");
return false;
}
if (!dirName.endsWith(File.separator)) {
dirName = dirName + File.separator;
}
if (dir.mkdirs()) {
System.out.println("Create directory \"" + dir.getName() + "\" success");
return true;
} else {
System.out.println("Create directory \"" + dir.getName() + "\" fail");
return false;
}
}
/**
* 创建单个文件
* @param filename 目标文件名
* @return 创建成功,返回true,否则返回false
*/
public static boolean createFile(String filename) {
File file = new File(filename);
if(file.exists()) {
System.out.println("Create file \"" + file.getName() + "\" fail."+
"\n" + "\"" + file.getName() +"\" is already exist.");
return false;
}
if (filename.endsWith(File.separator)) {
System.out.println("Create file \"" + file.getName() + "\" fail."+
"\n" + "\"" + file.getName() +"\" is a directory.");
return false;
}
if(!file.getParentFile().exists()) {
if(!file.getParentFile().mkdirs()) {
System.out.println("Create file \"" + file.getName() + "\"'s directory fail.");
return false;
}
}
try {
boolean cresteFileSuccess = file.createNewFile();
if (cresteFileSuccess) {
System.out.println("Create file \"" + filename + "\" success.");
return true;
} else {
System.out.println("Create file \"" + filename + "\" fail.");
return false;
}
} catch (IOException e) {
e.printStackTrace();
System.out.println("Create file \"" + filename + "\" with mistake." + e.getMessage());
return false;
}
}
删除文件和目录关键技术点如下:
1. File的delete方法能删除文件和目录。
2. 当File指向一个目录时,只有当目录为空(没有子目录和子文件)时,才能用delete方法将其删除。
/**
* 删除单个文件
* @param fileName 待删除的文件的文件名
* @return 单个文件删除成功返回true,否则返回false
*/
public static boolean deleteFile(String fileName) {
File file = new File(fileName);
if (file.exists() && file.isFile()) {
boolean delsuccess = file.delete();
if (delsuccess) {
System.out.println("delete file \"" + fileName + "\" success.");
return true;
} else {
System.out.println("delete file \"" + fileName + "\" fail.");
return false;
}
} else {
System.out.println("delete file \"" + fileName + "\" fail." + "\n" +
"\"" + fileName + "\" is not an file or it is not exists.");
return false;
}
}
/**
* 删除目录(文件夹)以及目录下的文件
* @param dirname 待删除目录的文件路径
* @return 目录删除成功返回true,否则返回false
*/
public static boolean deleteDir(String dirname) {
if (!dirname.endsWith(File.separator)) {
dirname = dirname + File.separator;
}
File dirFile = new File(dirname);
//如果dir对应的文件不存在,或者不是一个目录,则退出
if (!dirFile.exists() || !dirFile.isDirectory()) {
System.out.println("delete \"" + dirname + "\" fail." + "\n" +
"\"" + dirname + "\" not exists or not an directory");
return false;
}
boolean flag = true;
//删除文件夹下所有文件(包括子目录)
File[] files = dirFile.listFiles();
for (int i = 0; i < files.length; i++) {
if(files[i].isFile()) { //删除子文件
flag = deleteFile(files[i].getAbsolutePath());
if (!flag) {
break;
}
} else if (files[i].isDirectory()) { //删除子目录
flag = deleteDir(files[i].getAbsolutePath());
if (!flag) {
break;
}
}
}
if (!flag) {
System.out.println("delete \"" + dirname + "\" fail.");
return false;
}
//删除当前目录
if (dirFile.delete()) {
System.out.println("delete \"" + dirname + "\" success.");
return true;
} else {
return false;
}
}