之前学习java io流的时候总觉得云里雾里,所以现在在来总结一下。
一.什么是io流
io流是用来处理设备之间的数据传输的,java对数据的操作是通过流的方式。java用于操作流的对象都存在于
java.io包中。其实,所谓的io流,就是一种系统资源,因为对数据的操作(例如保存)是window操作系统自带的,例
如,在记事本中写一段文本,那么这段文本就存在于内存中,保存之后,那么这段文本就从内存到了硬盘中,这个操
作就用到了window自带的输出流(写操作)。各种语言只是提供对这种系统资源的api。
二.文件File类的构造和分隔符问题
设备上数据存储最常见的表现形式为文件。File类能操作文件和目录(文件夹)。
通过文件路径来将文件封装成一个对象,常用的有3中方式,代码如下:
package com.java.IO;
import java.io.File;
public class FileDemo {
//这里提一下,private修饰的属性只能本类可以访问,其他类不能通过对象.属性和类名.属性的方式来访问
private static final String FILE_SEPARATOR = System.getProperty("file.separator");
public static void main(String[] args) {
//通过文件路径直接创建对象,相对路径是相对的是当前项目的项目名,既可以将存在的路径封装为对象,也可以将不存在的路径封装为对象
File file=new File("abc\\1.txt");
//将文件路径拆分为两部分在创建对象
File file2=new File("c:\\","1.txt");
//通过文件对象和路径来创建对象
File file3=new File("c:\\");
File file4=new File(file3,"1.txt");
/*这里要注意的是不同的操作系统所用到的文件分隔符是不同的,所以将java文件导入不同的操作系统中会出现问题
*我们有两种解决方式,一种,通过System类来获得文件分隔符,第二种是通过File类来获得,并且在java中写
*文件分隔符要用‘\\’来将‘\’进行转义。
*/
File file5=new File("c:"+FILE_SEPARATOR+"1.txt");
// System.out.println(file5); c:\1.txt
File file6=new File("c:"+File.separator+"1.txt");
System.out.println(file6);
}
}
三.File类中获取文件属性的常用方法
package com.java.IO;
import java.io.File;
public class FileDemo2 {
public static void main(String[] args) {
File file=new File("f:\\ioDemo\\1.txt");
File file2=new File("ioDemo\\1.txt");
//获取文件名称
System.out.println(file.getName()); //1.txt
//获取文件大小
System.out.println(file.length()); //25
//获取文件类型,这个java不支持,因为文件的类型是可以自定义的,所以提供类型没有意义
//获取文件的路径,比较getParent()和getPath()的区别
System.out.println(file.getParent()); //f:\ioDemo
System.out.println(file.getPath()); //f:\ioDemo\1.txt
//获取文件的相对路径
System.out.println(file2.getParent()); //ioDemo
System.out.println(file2.getPath()); //ioDemo\1.txt
}
}
四.文件和文件夹的创建和删除
package com.java.IO;
import java.io.File;
import java.io.IOException;
public class FileDemo3 {
public static void main(String[] args) throws IOException {
//创建文件。当文件存在时,返回false。当文件不存在时,创建文件,返回true。
File file=new File("f:\\ioDemo\\2.txt");
boolean result=file.createNewFile();
/*删除文件。当文件删除成功时,返回true,删除未成功时,返回false。例如:
* 当文件被应用程序占用时,就会删除失败
*/
// boolean result_delete=file.delete();
//创建一级文件夹
File file2=new File("f:\\ioDemo\\abc");
boolean result2=file2.mkdir();
//删除一级目录
boolean result_delete2=file2.delete();
//创建多级目录
File file3=new File("f:\\ioDemo\\abcd\\abc");
boolean result3=file3.mkdirs();
/*删除多级目录时,如果文件夹中有内容,那么文件夹将删除失败
* */
/*不能凭借肉眼主观来断定一个文件到底是文件夹过着文件,要使用方法来辨别
* 因为,文件可能不带后缀名,文件夹也可能有“后缀名”。
*/
file.isFile();
file.isDirectory();
//另外,获取文件绝对路径的方法
String getAbsolutePath = file.getAbsolutePath();
System.out.println(getAbsolutePath); //f:\ioDemo\2.txt
}
}
五.list()方法和listFiles()方法
package com.java.IO;
import java.io.File;
public class FileDemo4 {
public static void main(String[] args) {
//获取指定路径下所有文件和文件夹的名称。包含隐藏文件和非隐藏文件
File file=new File("f:\\");
String[] strs=file.list();
for(String str:strs) {
System.out.println(str);
}
//获取指定路径下所有文件和文件夹。包含隐藏文件和非隐藏文件
File[] files=file.listFiles();
for(File file1:files) {
System.out.println(file1);
}
/* $RECYCLE.BIN
1111.txt
BaiduNetdiskDownload
Development
DownLoadRecord.ini
eclipse-workspace
GameDownload
Hlddz
Hldn
io
ioDemo
KuGou
MyEclipse2017IWorkSpaces
Program Files
QLDownload
System Volume Information
Training template(JAVA)
Windows10Upgrade
腾讯游戏
f:\$RECYCLE.BIN
f:\1111.txt
f:\BaiduNetdiskDownload
f:\Development
f:\DownLoadRecord.ini
f:\eclipse-workspace
f:\GameDownload
f:\Hlddz
f:\Hldn
f:\io
f:\ioDemo
f:\KuGou
f:\MyEclipse2017IWorkSpaces
f:\Program Files
f:\QLDownload
f:\System Volume Information
f:\Training template(JAVA)
f:\Windows10Upgrade
f:\腾讯游戏
*/
}
}
六.文件名过滤器
1.验证部分代码:
package com.java.IO;
import java.io.File;
import java.io.FilenameFilter;
public class FileDemo5 {
public static void main(String[] args) {
//通过后缀名来过滤文件
File file=new File("f:\\");
FilenameFilter fileNameBy=new FileNameBySuffix("space");
fileNameBy=new FileNameByContains("d");
String[] strs=file.list(fileNameBy);
for(String str:strs) {
System.out.println(str); // 第一个过滤器:eclipse-workspace
//第二个过滤器:QLDownload
}
}
}
2.所定义的过滤器:
package com.java.IO;
import java.io.File;
import java.io.FilenameFilter;
public class FileNameBySuffix implements FilenameFilter {
private String filterMethod;
public FileNameBySuffix(String filterMethod) {
this.filterMethod=filterMethod;
}
@Override
public boolean accept(File dir, String name) {
return name.endsWith(filterMethod);
}
}
class FileNameByContains implements FilenameFilter{
private String filterMethod;
public FileNameByContains(String filterMethod) {
this.filterMethod=filterMethod;
}
@Override
public boolean accept(File dir, String name) {
return name.contains(filterMethod);
}
}
七.文件过滤器
1.定义测试代码:
package com.java.IO;
import java.io.File;
import java.io.FileFilter;
public class FileFilterDeml {
public static void main(String[] args) {
//定义文件过滤器
File file=new File("f:\\");
//过滤 f盘下所有的文件
FileFilter fileFilter=new FileFilterImp();
//过滤 f盘下所有后缀名为 space的文件或文件夹
fileFilter=new FileFilterImp2("space");
File[] files=file.listFiles(fileFilter);
for(File file1:files) {
System.out.println(file1); //第一个过滤器:f:\1111.txt f:\DownLoadRecord.ini
//第二个过滤器:f:\eclipse-workspace
}
}
}
2.定义文件过滤器
package com.java.IO;
import java.io.File;
import java.io.FileFilter;
public class FileFilterImp implements FileFilter{
@Override
public boolean accept(File pathname) {
return pathname.isFile();
}
}
class FileFilterImp2 implements FileFilter{
private String filter_method;
public FileFilterImp2(String filter_method) {
this.filter_method=filter_method;
}
@Override
public boolean accept(File pathname) {
return pathname.getName().endsWith(filter_method);
}
}
在学习 io,将会从 获取子目录中的内容 开始。