理解实质,记住形式。让理解更加直观,可以画个图。
一、File类
在整个io包中,File类是唯一与文件本身有关的类,File类的对象用于创建或删除文件等常用操作
构造方法:File(String pathname)
常用方法:
boolean createNewFile() throws IOException;
boolean delete():
boolean mkdir():
boolean mkdirs():
boolean exists():
boolean isFile():
boolean isDirectory():
String[] list():
File[] listFiles():
String getName():
String getPath():
String getAbsolutePath():
列出指定目录下所有的文件
public static void fun(File file){//要查询的目录
//判断file是目录还是文件
if(file.isFile()){
System.out.println("该文件所在的绝对路径:"+file.getAbsolutePath());
}else{
//2.获取该目录下所有子文件和子目录对象
File[] childFiles=file.listFiles();
if(childFiles!=null){
for(File f:childFiles){//a b a.txt
fun(f); //调用方法自己
}
}
}
}
二、字符流
字符流以字符为单位操作流,多用于文本文件的读写,包含的两个根类都是抽象类,不可实例化,如下:
1.Reader
FileReader是Reader的子类,常用的构造函数:FileReader(File file)、FileReader(String fileName)
BufferedReader是相应的处理流类,构造方法:BufferedReader(Reader in) 、BufferedReader(Reader in, int size)
2.Writer
FileWriter是Writer的子类,常用的构造函数:FileWriter(File file)、FileWriter(String fileName)
BufferedWriter是相应的处理流类,构造方法:BufferedWriter(Writer out) 、BufferedWriter(Writer out, int size)
例:复制文本文件
public class Copy1 {
public static void main(String[] args) {
File file1 = new File("H:\\javase\\a.txt");
File file2 = new File("H:\\javase\\b.txt");
FileReader fileReader = null;
FileWriter fileWriter = null;
try {
fileReader = new FileReader(file1);
fileWriter = new FileWriter(file2);
char[] cs = new char[5];
int i = fileReader.read(cs);
while(i != -1) {
fileWriter.write(cs,0,i);
i = fileReader.read(cs);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fileReader!=null && fileWriter!=null) {
try {
fileReader.close();
fileWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
三、字节流
字节流以字节为单位操作流,多用于非文本文件(doc 、jpg、ppt etc.)的读写,包含的两个根类都是抽象类,不可实例化,如下:
1.InputStream
FileInputStream是InputStream的子类,常用的构造函数:FileInputStream(File file)、FileInputStream(String fileName)
BufferedInputStream是相应的处理流类,构造方法:BufferedInputStream(InputStream in) 、BufferedInputStream(InputStream in, int size)
2.OutputStream
FileOutputStream是OutputStream的子类,常用的构造函数:FileOutputStream(File file)、FileOutputStream(String fileName)
BufferedOutputStream是相应的处理流类,构造方法:BufferedOutputStream(OutputStream out) 、BufferedOutputStream(OutputStream out, int size)
例:复制图片
public class Copy2 {
public static void main(String[] args) {
File file1 = new File("H:\\javase\\pic1.jpg");
File file2 = new File("H:\\javase\\pic2.jpg");
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream(file1);
out = new FileOutputStream(file2);
byte[] bytes = new byte[50];
int i = in.read(bytes);
while(i != -1) {
out.write(bytes, 0, i);
i = in.read(bytes);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (in!=null && out!=null) {
try {
in.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
四、对象流
对象输入流ObjectInputStream,继承InputStream,构造方法:ObjectInputStream(InputStream in)
对象输出流ObjectOutputStream,继承OutputStream,构造方法:ObjectOutputStream(OutputStream out)
序列化(Serialize): 用ObjectOutputStream类将一个Java对象通过IO流写入到数据源中
public static void main(String[] args) throws Exception
{
OutputStream os=new FileOutputStream("D://a.txt");
ObjectOutputStream oos=new ObjectOutputStream(os);
//注意:该类People 必须实现Serializable接口。
// 该类中所有要序列化的属性的类型必须也实现Serializable接口
People p=new People("张三",19);
oos.writeObject(p); //把一个对象通过ObjectOutputStream写入到数据源
oos.close();
os.close();
}
反序列化(Deserialize):用ObjectInputStream类从数据源中恢复该Java对象。
public static void main(String[] args) throws Exception
{
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("D://a.txt"));
Object o=ois.readObject(); //获取该文件中的对象
People p=(People)o; //向下转型
System.out.println(p.getName()+"=====>"+p.getAge()+"----->");//toString();
ois.close();
}