Java IO
File类
文件类,代表物理文件或目录
创建文件对象,通过文件对象的方法,可以操作文件或目录的属性(路径、权限、日期和时间等)
File类常用方法
流
动态的概念,是一连串连续动态的数据集合
分类
按流向分类:
输入流:OutputStream 和 Writer 作为基类
输出流:InputStream 和 Reader 作为基类
输入输出流是相对于计算机内存来说的,而不是相对于源和目标
按处理数据单元分:
字节流:
字节输入流:OutputStream
字节输出流:InputStream
字符流:
字符输入流:Writer
字符输出流:Reader
字节流是 8 位通用字节流,字符流是 16 位 Unicode 字符流
按功能分:
节点流:可以直接从数据源或目的地读写数据。
处理流(包装流):不直接连接到数据源或目的地,是其他流进行封装。目的主要是简化操作和提高性能
文件的读写
文本文件的读写
– 用FileInputStream和FileOutputStream读写文本文件
– 用BufferedReader和BufferedWriter读写文本文件
二进制文件的读写
– 使用DataInputStream和DataOutputStream读写二进制文件以及基本数据类型数据的读写
对象的读写
– 使用ObjectInputStream和ObjectOutputStream读写对象(序列化与反序列化)
字节流读写文件
//使用FileInputStream 读文本文件
import java.io.IOException;
import java.io.FileInputStream;
FileInputStream fis= new FileInputStream(“c:\\test.txt");
int len=0;
While((len=fis.read())!=-1){
...
}
fis.close();
InputStream类常用方法
int read( )
int read(byte[] b)
int read(byte[] b,int off,int len)
void close( )
int available()子类FileInputStream常用的构造方法
FileInputStream(File file)
FileInputStream(String name)
//使用FileOutputStream 写文本文件
import java.io.IOException;
import java.io.FileOutputStream;
FileOutputStream fos = new FileOutputStream("c:\\test.txt");
String str =“HelloWorld";
byte[] words = str.getBytes();
fos.write(words, 0, words.length);
fos.close();
OutputStream类常用方法
void write(int c)
void write(byte[] buf)
void write(byte[] b,int off,int len)
void close( )子类FileOutputStream常用的构造方法
FileOutputStream (File file)
FileOutputStream(String name)
FileOutputStream(String name,boolean append)1、前两种构造方法在向文件写数据时将覆盖文件中原有的内容
2、创建FileOutputStream实例时,如果相应的文件并不存在,则会自动创建一个空的文件
字符流读写文件
//FileReader
import java.io.Reader;
import java.io.FileReader;
import java.io.IOException;
... ...
//创建 FileReader对象对象
Reader fr=null;
StringBuffer sbf=null;
try {
fr = new FileReader("D:\\myDoc\\test.txt");
char ch[]=new char[1024]; //创建字符数组作为中转站
sbf=new StringBuffer();
int length=fr.read(ch); //将字符读入数组
while ((length!= -1)) {//循环读取并追加字符
sbf.append(ch); //追加到字符串
length=fr.read();
}
}
... ...
fr.close();
//BufferedReader 使用缓冲区,提高效率
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
Reader fr = new FileReader("C:\\myTest.txt ");
BufferedReader br = new BufferedReader(fr);
br.readLine();
br.close();
fr.close();
Reader类常用方法
int read( )
int read(byte[] c)
read(char[] c,int off,int len)
void close( )子类BufferedReader常用的构造方法
BufferedReader(Reader in)
子类BufferedReader特有的方法
readLine()
//使用FileWriter写文件
import java.io.Reader;
import java.io.FileWriter;
import java.io.IOException;
... ...
Writer fw = null;
try {
//创建一个FileWriter对象
fw = new FileWriter("D:\\myDoc\\111.txt");
//写入信息
fw.write("hello world!");
fw.flush(); //刷新缓冲区
}catch(IOException e){
System.out.println("文件不存在!");
}
… …
fw.close(); //关闭流
… …
//使用 BufferedWriter 写文件
import java.io.FileWriter ;
import java.io.BufferedWriter ;
import java.io.IOException;
FileWriter fw = new FileWriter("C:\\myTest.txt");
BufferedWriter bw = new BufferedWriter(fw);
bw.write("hello");
bw.flush();
fw.close();
Writer类常用方法
write(String str)
write(String str,int off,int len)
void close()
void flush()子类BufferedWriter常用的构造方法
BufferedReader(Writer out)
小结
流操作的基本规律
1、明确源和目的
a)源:输入流 InputStream Reader
b)目的:输出流 OutputStream Writer
2、操作的数据是否是纯文本
是:字符流 Reader,Writer
不是:字节流 InputStream,OutputStream
3、具体的操作设备
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台
操作对象的流
操作对象的流
序列化对象:ObjectOutputStream
反序列化对象:ObjectInputStream
序列化:
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt"));
oos.writeObject(new Person("张三",19));// 序列化
oos.close();
反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt"));
Person p=(Person)ois.readObject();//反序列化
System.out.println(p);
注意
1、类必须实现Serializable接口
2、给类加个序列化编号,给类定义一个标记,新的修改后的类还可以操作曾经序列化的对象
3、静态是不能被序列化的,序列化只能对堆中的进行序列化 ,不能对“方法区”中的进行序列化
4、不需要序列化的字段前加 transient
操作基本数据的流
//写入数据
DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt"));
dos.writeInt(234);
dos.writeBoolean(false);
dos.writeDouble(9943.00);
dos.writeUTF("中国");
dos.close();
//读取数据
DataInputStream dis = new DataInputStream(new FileInputStream("data.txt"));
int num=dis.readInt();
boolean isFind=dis.readBoolean();
double price=dis.readDouble();
String str=dis.readUTF();
System.out.println(num+"\t"+isFind+"\t"+price+"\t"+str)