5. IO流
5.1 File类
5.1.1 文件对象的构造
这个类对一个文件(夹)的描述。
关于路径分隔符:
路径分隔符是对目录的分隔。表示一层嵌套关系。
在windows系统下,分隔符是:\
在UNIX体系下,分隔符是:/
构造方法 | 参数 |
---|---|
File(String pathName) | 使用一个指定的文件路径来实例化一个File对象 |
File(String parent, String name) | 给定一个父目录路径和一个子文件名字,系统会自动的将其拼接在一起 |
File(File parent, String child) | 给定一个父目录和一个子文件的名字,系统自动拼接路径 |
public class FileDemo {
public static void main(String[] args) {
//File构造函数演示
String pathName = "hello.java";
File f1 = new File(pathName);
System.out.println(f1);
File f2 = new File("/Users/IdeaProjects/JavaSE","hello.java");
System.out.println(f2);
//将parent封装成file对象。
File dir = new File("/Users/IdeaProjects/JavaSE");
File f3 = new File(dir,"hello.java");
System.out.println(f3);
}
}
5.1.2 文件和文件夹的常用方法
常用方 | 描述 |
---|---|
boolean exists() | 用来描述指定的路径下到底有没有文件(夹)存在。 |
boolean isFile() | 判断指定路径的内容是不是一个文件 |
boolean isDirectory() | 判断指定路径的内容是不是一个文件夹 |
boolean mkdir() | 在指定的路径创建文件夹,返回值代表创建成功还是失败 |
boolean mkdirs() | 在指定的路径创建文件夹,可以创建多级目录 |
boolean createNewFile() | 在指定的路径创建一个空文件,会有一个IOException |
boolean isHidden() | 判断一个文件是否是隐藏的 |
public static void main(String[] args) throws IOException {
// 对文件或者文件加进行操作。
File file = new File("/Users/IdeaProjects/JavaSE/file.txt");
//获取文件的绝对路径,即全路径
String absPath = file.getAbsolutePath();
//File中封装的路径是什么获取到的就是什么。
String path = file.getPath();
//获取文件名称
String filename = file.getName();
//获取文件大小
long size = file.length();
System.out.println("absPath="+absPath);
System.out.println("path="+path);
System.out.println("filename="+filename);
System.out.println("size="+size);
// 创建文件,如果文件不存在,创建 true 如果文件存在,则不创建 false。
// 如果路径错误,IOException。
boolean file1 = file.createNewFile();
System.out.println("file1=" + file1);
//-----------删除文件操作-------注意:不去回收站。慎用------
boolean flag = file.delete();
System.out.println("flag="+flag);
//-----------需要判断文件是否存在------------
boolean falg1 = file.exists();
System.out.println("falg1="+falg1);
//-----------对目录操作 创建,删除,判断------------
File dir = new File("/Users/IdeaProjects/JavaSE/");
//mkdir()创建单个目录。//dir.mkdirs();创建多级目录
boolean flag2 = dir.mkdir();
System.out.println("flag2="+flag2);
//删除目录时,如果目录中有内容,无法直接删除。
boolean flag3 = dir.delete();
//只有将目录中的内容都删除后,保证该目录为空,这个目录才可以删除。
System.out.println("flag3=" + flag3);
//-----------判断文件,目录------------
File file3 = new File("/Users/IdeaProjects/JavaSE/");
// 要判断是否是文件还是目录,必须先判断存在。
System.out.println(file3.isFile());
System.out.println(file3.isDirectory());
//-----------目录遍历------------
File dir1 = new File("/Users/IdeaProjects");
//获取的是目录下的当前的文件以及文件夹的名称。
String[] names = dir.list();
for(String name : names){
System.out.println(name);
}
//获取目录下当前文件以及文件对象,只要拿到了文件对象,那么就可以获取其中想要的信息
File[] files = dir.listFiles();
for(File file4 : files){
System.out.println(file4);
}
}
5.1.3 文件过滤器
实现自己的文件过滤器
public class FileDemo{
public static void main(String[] args) {
//获取扩展名为.java所有文件
//创建File对象
File file = new File("/Users/IdeaProjects");
//获取指定目录下的文件夹
File[] files = file.listFiles(new FileFileterByDir());
//遍历获取到的所有符合条件的文件
for (File f : files) {
System.out.println(f);
}
}
}
自定义类继承FileFilter过滤器接口
//文件过滤器
class FileFileterByDir implements FileFilter{
public boolean accept(File pathname) {
return pathname.isDirectory();
}
}
5.2 流的分类
分类:
方向:输入流和输出流
数据单元:字节流和字符流
InputStream: 字节输入流的超类
OutputStream: 字节输出流的超类
Reader: 字符输入流
Writer: 字符输出流
无论是使用什么流,在使用结束之后,一定要记得关闭这个流。
5.3 字节流
InputStream:
int read(byte[] arr):
参数:从流中读取数据,需要使用到一个字节数组。read方法会将读取到的数据填充到这个字节数组中。所以,读取完成后,我们直接从这个字节数组中取数据即可。
返回值:每次读取数据后,返回这一次读取到了多少个字节的数据。如果这个方法返回值为-1,说明本次没有读取到任何数据,读取完成。
class FileInputStreamDemo {
public static void main(String[] args) throws Exception {// 先声明
InputStream is = null;
try {
// 实例化一个流
is = new FileInputStream(new File("/Users/IdeaProjects/JavaSE/src/kaikeba/com/ArraysDemo.java"));
// InputStream: 字节输入流,数据是以字节为单位
// 从管道中读取数据:
// 实例化一个数组,用来存储每次读取到的数据
byte[] contents = new byte[100];
// 用来记录每次读取到了多少数据
int length = 0;
// 循环读取,将每次读取到的数据长度给length赋值,并判断是否为-1
while ((length = is.read(contents)) != -1) {
// 通过一个字节数组实例化一个字符串
String str = new String(contents, 0, length);
System.out.print(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 判断是否为空,因为如果最开始实例化的时候,文件不存在,则is实例化失败,依然为null
// 此时,如果is是null,那么再去关闭的时候,就会出现NullPointerException
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
outputStream:操作的数据都是字节,定义了输出字节流的基本共性功能方法。
OutputStream有很多子类,其中子类FileOutputStream可用来写入数据到文件。
FileOutputStream类,即文件输出流,是用于将数据写入 File的输出流。
public class FileOutputStreamDemo2 {
public static void main(String[] args) throws Exception {
File file = new File("myfile.txt");
FileOutputStream fos = new FileOutputStream(file, true);
String str = "\r\n"+"kaikeba.com";
fos.write(str.getBytes());
fos.close();
}
}
5.4 字符流
Reader:字符输入流
Writer:字符输出流
写操作
public static void main(String[] args) throws IOException {
//1.创建FileWriter的对象并关联对应的文件
//注意点:
//一:如果只写文件的名字,不写具体路径,默认路径是当前的工程
//二:对于关联的文件,如果之前不存在,程序会自动创建一个,如果存在,会将原来的内容覆盖
//三:可以自己指定路径,但是必须保证路径是真实存在的,否则报异常---FileNotFountException(系统找不到指定的路径。)
FileWriter fileWriter = new FileWriter("fileWrite.txt");
//调用写入方法
//注意点四:在执行write方法时,数据被临时放到了流对象的内部数组中,这个数组是一个字节数组,会默认去查编码表
fileWriter.write("晨晨");
//刷新---将临时数组中的数据放入磁盘
//fileWriter.flush();
//4.关闭流--两个功能:a:关闭流 b:刷新
//第五个注意点:流对象使用完后必须关闭
fileWriter.close();
//第六个注意点:当流对象关闭之后,不能再进行操作,否则会报异常:Stream closed
//fileWriter.write("haha");
}
读操作
public static void main(String[] args) throws IOException {
//1.创建文件读入流
FileReader fileReader = new FileReader("/Users/IdeaProjects/JavaSE/src/kaikeba/com/ArraysDemo.java");
//开始读操作
/*
* read():一个字符一个字符的读,每次读出一个字符
*/
//a:将当前的字符读出 b:将当前的指针后移一位
int value;
while ((value = fileReader.read()) != -1) {
System.out.println((char)value);
}
fileReader.close();
}
public static void main(String[] args) throws IOException {
//1.创建文件读入流
FileReader fileReader = new FileReader("/Users/liyunxia/IdeaProjects/JavaSE/src/kaikeba/com/ArraysDemo.java");
//开始读操作
/*
* read(数组):一次可以读出多个字符 ,数组的作用:每次会将读出的字符临时放到这个数组中
*/
/* 数组是临时存放数据的地方,我们会将读到的字符放到临时数组中,数组的大小决定了我们一次可以读到的字符个数.
* 一般这个数组的大小<=1kB
* 返回值代表本次读到的真实的字符个数,如果返回值是-1代表读完了.
*/
char[] cbuf = new char[2];
int num ;
while ((num = fileReader.read(cbuf)) != -1) {
//System.out.println(new String(cbuf)+" num:"+num);
System.out.println(new String(cbuf,0,num)+" num:"+num);
}
fileReader.close();
}