IO流
- File类
- 字节流
- 字符流
1. File
File类的对象主要用来获取文件本身的一些信息,例如文件所在目录、文件的长度或者文件的读写权限等,不涉及对文件的读写操作。要对文件进行读写操作需要使用IO流。
创建一个File对象的构造方法有3种:
- File(String filename);
- File(String directoryPath,String filename);
- File(File dir,String filename);
其中filename是文件名,directorypath是文件路径,dir为一个目录。使用File(String filename)创建文件时,该文件被认为与当前应用程序在同一目录中。
1.1文件的属性
可以使用File类的一些方法来获取文件本身的一些信息
File类的常用方法
- public String getName() 获取文件的名字
- public boolean canRead() 判断文件是否可读
- public boolean canWrite() 判断文件是否可被写入
- public boolean exists() 判断文件是否存在
- public long length() 获取文件的长度(单位是字节)
- public String getAbsolutePath() 获取文件的绝对路径
- public String getParent() 获取文件的父目录
- public boolean isFile() 判断文件是否是一个普通文件而不是目录
- public boolean isDirectory() 判断文件是否是一个目录
- public boolean isHidden() 判断文件是否是隐藏文件
1.2 目录
创建目录
File对象调用方法 public boolean mkdir() 创建一个目录,如果创建成功返回true,否则返回false(如果该目录已存在将返回false)
如果File对象是一个目录,那么该对象调用下述方法列出该目录下的文件和子目录
- public String[] list() 用字符串形式返回目录下全部文件
- public File[] listFiles() 用File对象形式返回目录下的全部文件
import java.io.File;
/*
* 使用递归打印目录树
* list():列出下级名称
* listFiles():列出下级File对象
*/
public class TestFileTree {
public static void main(String[]args) {
File f=new File("F:\\大一上学期工作学习任务");
printFile(f,0);
}
static void printFile(File file,int level) {
//输出层数
for(int i=0;i<level;i++)
System.out.print("-");
System.out.println(file.getName());
if(file.isDirectory()) {
File[] files=file.listFiles();//是获取该目录下所有文件和目录的绝对路径
for(File temp:files) {
printFile(temp,level+1);
;
}
}
}
}
1.3 文件的创建与删除
当使用File类创建一个文件对象后,如
File file=new File("C:/myFile""abc.txt");
如果目录下没有名为abc.txt的文件,文件对象file调用方法
- public boolean createNewFile();
就可以在C:\myFile目录下新建名为abc.txt 的文件。
文件对象file调用方法
- public boolean delete()
可以删除当前文件。
2.字节流
字节流分为字节输出流和字节输入流。FileOutputStream类(字节输出流)是OutputStream的抽象类,FileInputStream(字节输入流)是InputStream的子类
InputStream和OutputStream都是抽象类
2.1文件字节输入流
使用输入流通常包括4个基本步骤
- 设定输入流的源
- 创建指向源的输入流
- 让输入流读取源中的数据
- 关闭输入流
FileInputStream的构造方法
- FileInputStream(String name)
- FileInputStream(File file)
第一种构造方法使用给定的文件名name创建FileInputStream流,第二个构造方法使用File对象创建FileINputStream流。参数name和file指定的文件称为输入流的源。
FileInputStream的常用方法
- int read() 从源中读取单个字节,该方法返回类型为字节,如果没有读出字节则返回-1
- int read(byte [] b) 从源中读取b.length个字节到字节数组b中,如果读取成功则返回实际读取的字节数目。如果到达文件末尾则返回-1
- int read(byte [] b,int off,int len) 从源中读取len个字节到字节数组b中,如果读取成功个则返回实际读取的字节数目,如果到达文件末尾则返回-1,参数off指定从字节数组的某个位置开始存放读取的数据。
- public void close() 输入流
注意,FileStream流顺序读取文件,只要不关闭流,每次调用read方法就顺序地读取源中其余的内容,直到源的末尾或流被关闭
实例代码如下
import java.io.*;
public class Example1 {
public static void main(String[]args) {
int n=-1;
byte[]a=new byte[100];
try {
File f=new File("src/Example1","Example1.java"); //设定输入流的源
InputStream in=new FileInputStream(f); //创建指向源的输入流
while((n=in.read(a,0,100))!=-1) { //让输入流读取源中的数据
String s=new String(a,0,n);
System.out.println(s);
}
in.close();
} catch (IOException e) {
System.out.println("File read Error"+e);
}
}
}
2.2文件字节输出流
使用输出流通常包括4个基本步骤
- 给出输出流的目的地
- 创建指目的地的输出流
- 让输出流把数据写入到目的地
- 关闭输出流
FileOutputStream的构造方法
- FileOutputStream(String name)
- FileOutputStream(File file)
第一种构造方法使用给定的文件名name创建FileOutputStream流,第二个构造方法使用File对象创建FileOutputStream流。参数name和file指定的文件称为输出流的目的地。
注意:使用上述的构造方法,如果输出流指向的文件不存在,Java就会创建新文件,如果指向的文件是已经存在的文件,输出流将刷新该文件 - FileOutputStream(String name,boolean append)
- FileOutputStream(File file,boolean append)
注意:参数append取值为true时,输入流不会刷新所指向的文件(假如文件已经存在),输出流的write方法将从文件的末尾开始向文件写入数据。参数append取值为false时,输出流将刷新所指向文件(假如文件已存在)
FileOutputStream的常用方法
- void write(int n) 输出流向目的地写入单个字节。
- void write(byte[]b) 输出流向目的地写入一个字节数组
- void write(byte[] b,int off,int len)从目的地off位置写入len个字节到目的地
- void flush()将缓存区的内容写入到目的地
- void close()关闭输出流
示例代码如下
import java.io.*;
public class Example10_5 {
public static void main(String args[]) {
byte[]a="HelloWorld".getBytes();//将字符串转换为字节
byte[]b="ByeByeWorld".getBytes();
File file=new File("distinction.txt");
try {
OutputStream out=new FileOutputStream(file);//创建目的地的输出流
System.out.println(file.getName()+"的大小:"+file.length()+"字节");
out.write(a); //写入数据
out.close(); //关闭输出流
out=new FileOutputStream(file,true);
System.out.println(file.getName()+"的大小:"+file.length()+"字节");
out.write(b,0,b.length);
System.out.println(file.getName()+"的大小:"+file.length()+"字节");
out.close();
} catch (IOException e) {
System.out.println("Error"+e);
}
}
}
3.字符流
字符流分为文件字符输入流、输出流。FileReader和FileWriter分别是Reader和Writer的子类。字符输入、出流的read和write方法使用字符数组读写数据,即以字符为基本单位处理数据。
FileReader的构造方法
- FileReader(String filename)
- FileReader(File file)
- FileWriter(String filename)
- FileWriter(File file)
- FileWriter(String filename,boolean append)
- FileWriter(File filename,boolean append)
import java.io.*;
public class Example3 {
public static void main(String args[]) {
File sourceFile=new File("source.txt");
File targetFile=new File("target.txt");
char c[]=new char[19];
try {
Writer out=new FileWriter(targetFile,true);
Reader in=new FileReader(sourceFile);
int n=-1;
while((n=in.read(c))!=-1) {
out.write(c,0,n);
}
out.flush();
out.close();
} catch (IOException e) {
System.out.println(e);
}
}
}