File类
File类只能用于获取文件的一些信息、进行新建、删除、重命名、创建目录操作,不涉及文件的读写操作。
//三种构造方法
File(String filename);
File(String directoryPath, String filename);
File(File f, String filename);
文件读写
文件流根据用途分为字节流和字符流
字节流和字符流的区别:
字节流处理单元为 1 个字节,操作字节和字节数组,主要处理原始二进制数据。
字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串。
字节流
文件字节流
FileInputStream和FileOutputStream是两大基础类
FileInputStream
用于读取诸如图像数据的原始字节流。
下面是一段测试程序
File file = new File("in.txt");
FileInputStream fin = new FileInputStream(file);
byte buffer[] = new byte[100];
int len;
while (true) {
len = fin.read(buffer);
if (len == -1) //如果读到文件末尾了,read方法会返回-1
break;
System.out.println("len=" + len);
}
in.txt内容为:
输入测试
输出结果为:
len=8
可见FileInputStream每次只读一个字节的数据,由于一个汉字占两个字节,因此四个汉字一共读了8个字节的数据。
FileOutputStream
随机流(任意流)
RandomAccessFile 可以从文件任意位置进行读写,同时具备读写能力,可以说是JavaIO中功能最丰富的类。
构造方法
RandomAccessFile(String name,String mode);
RandomAccessFile(File file,String mode);
参数mode可选: “r” 或 “rw” 或 “w”
主要方法
seek(long pos) 定位RandomAccessFile流的读写位置
getFilePointer() 获取流的当前读写位置
skipBytes(int n) 跳过n个字节的内容
其余读写方法和其他流类似
数组流
与其他流相比数组流的源是内存,因此数组流在使用完后不用进行close操作,因为java虚拟机可以直接操控内容,不用占用系统资源。
使用方法
ByteArrayInputStream
ByteArrayInputStream(byte[] buf);
ByteArrayInputStream(byte[] buf,int offset,int length);
public int read(); 向后顺序读一个字节
public int read(byte[] b,int off,int len); 将结果读到b数组中,返回实际读取的字节数
ByteArrayOutputStream
ByteArrayOutputStream();
ByteArrayOutputStream(int size);
public void write(int b); 顺序地向缓冲区写入一个字节
public void write(byte[] b,int off,int len);
public byte[] toByteArray(); 返回输出流写入到缓冲区的全部字节
对象流
ObjectInputStream和ObjectOutputStream类可以将类的实例对象写入文件或进行读取。
能被读写的类要实现Serializable接口。
使用对象流时常会遇到ClassNotFound的异常,我的解决方法是将类打包成jar文件然后再导入工程里。至于为什么会遇到这种问题,我的理解是类位于的包名不同可能也会造成对象流写入的区别。
构造方法
ObjectInputStream objis = new ObjectInputStream(new FileInputStream(file));
ObjectOutputStream objos = new ObjectOutputStream(new FileOutputStream(file));
数据流
DataInputStream和DataOutputStream类提供了可以读写各种基本数据类型的数据的各种方法。
构造方法
DataInputStream(InputStream in)
DataOutputStream(OutnputStream out)
对于writeUTF出现乱码的说明
每次调用writeUTF时会在写入内容的前面增加此次写入的长度(用两个字节表示),因此会引起乱码问题,如果要验证这个问题,可以写入97个字符,再打开文件可以看到开头是一个空格和一个小写a。因此writeUTF建议和readUTF配套使用。
字符流
字符流对应的类较多,需要根据具体的功能选择合适的类。
文件字符流(底层流)
FileReader 和 FileWriter是比较底层的字符流
主要用于从文件中读取字符,根据字符
构造方法
FileReader(String filename);
FileReader(File filename);
FileWriter (String filename);
FileWriter (File filename);
读写方法和字节流差不多,只不过这里采用char数组来保存结果,因为java中char类型占两个字节,采用unicode
缓冲流
BufferedReader和BufferedWriter类
缓冲流和文件字符流在功能上非常的相似,区别在于BufferedReader和BufferedWriter有缓冲区,并且提供了readline的方法来一次读取一行,减少了IO调用的次数,因此效率上会更高。
构造方法
BufferedReader(Reader in); //默认缓冲区大小为8kb
BufferedReader(Reader in, int sz); //指定缓冲区大小(sz字节)
BufferedWriter (Writer out);
BufferedWriter (Writer out, int sz);
额外的方法
各种流的比较
这里介绍了比较全的流种类
文件对话框
JFileChooser类可以弹出一个文件选择框,方便选择文件。
这里就介绍一个简单的打开文件用法,其他的用法见API(因为实在太多了)
JFileChooser filechooser = new JFileChooser();
File selectfile;
filechooser.setFileSelectionMode(JFileChooser.FILES_ONLY); // 设置文件选择模式,也可以直接用默认的
int val = filechooser.showOpenDialog(null); // 显示文件选择窗口
if (val == JFileChooser.APPROVE_OPTION) { // 如果文件选择成功了
selectfile = filechooser.getSelectedFile(); // 调用此方法返回一个File对象的引用
System.out.println("选择的文件路径为:" + selectfile.getAbsolutePath());
}