一、文件操作
1、java.io定义的大多数类都是流式操作,但File类不是,它直接处理文件和文件系统。
2、File类没有指定信息怎样从文件读取或向文件存储,它描述了文件本身的属性。
3、File对象用来获取或处理与磁盘文件相关的信息,例如权限、时间、日期和目录路径。
File还浏览子目录层次结构。java中的目录当成File 对待,它具有附加的属性——一个可以被list()方法检测的文件名列表。
4、File的构造方法:
//根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
File(File parent, String child)
//通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例
File(String pathname)
// 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例
File(String parent, String child)
//通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例
File(URI uri)
例如:
//一个目录路径参数
File f1 = new File("/Users/mumutongxue/");
//对象有两个参数——路径和文件名
File f2 = new File("/Users/mumutongxue/","a.bat");
//指向f1文件的路径及文件名
File f3 = new File(f1,"a.bat");
5、File的一些方法:
6、示例代码
package com.shiyanlou;
import java.io.File;
import java.io.IOException;
public class FileDemo {
public static void main(String[] args){
//这是我电脑上的路径,同学们可以直接在桌上生成文件。桌面路径为"/root/Desktop"
//构造函数File(String pathname)
File f1 =new
File("/Users/mumutongxue/1.txt");
//File(String parent,String child)
File f2 =new File("/Users/mumutongxue","2.txt");
//separator 跨平台分隔符
File f3 =new File("/Users"+File.separator+"mumutongxue");
File f4 =new File(f3,"3.txt");
try {
System.out.println(f1);
//当文件存在时返回 false;不存在时返回 true
System.out.println(f2.createNewFile());
//当文件不存在时返回 false
System.out.println(f3.delete());
}catch(IOException e) {
e.printStackTrace();
}
//列出磁盘下的文件和文件夹
File[] files =File.listRoots();
for(File file:files){
System.out.println(file);
if(file.length()>0){
String[] filenames =file.list();
for(String filename:filenames){
System.out.println(filename);
}
}
}
}
}
二、随机访问文件
1、对于 FileInputStream/FileOutputStream、FileReader/FileWriter 来说,它们的实例都是顺序访问流,即只能进行顺序读/写。而类 RandomAccessFile 则允许文件内容同时完成读和写操作,它直接继承 object,并且同时实现了接口 DataInput 和 DataOutput。
2、随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。
3、RandomAccessFile 提供了支持随机文件操作的方法:
(1)readXXX()或者 writeXXX():如 ReadInt(),ReadLine(),WriteChar(),WriteDouble()等
(2)int skipBytes(int n):将指针向下移动若干字节
(3)length():返回文件长度
(4)long getFilePointer():返回指针当前位置
(5)void seek(long pos):将指针调用所需位置
在生成一个随机文件对象时,除了要指明文件对象和文件名之外,还需要指明访问文件的模式。
4、RandomAccessFile的构造方法:
RandomAccessFile(File file,String mode)
RandomAccessFile(String name,String mode)
mode 的取值:
(1) r:只读,任何写操作都讲抛出 IOException
(2)rw:读写,文件不存在时会创建该文件,文件存在是,原文件内容不变,通过写操作改变文件内容。
(3)rws:打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。
(4)rwd:打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。
5、示例代码
package com.shiyanlou;
import java.io.IOException;
import java.io.RandomAccessFile;
public class FileDemo {
public static void main(String[] args){
int data_arr[] = {12, 32, 43, 45, 1, 5};
try {
RandomAccessFile randf=new RandomAccessFile("temp.dat","rw");
for(int i = 0; i < data_arr.length; i++){
randf.writeInt(data_arr[i]);
}
for(int i = data_arr.length-1 ; i >= 0; i--){
//int 数据占4个字节
randf.seek(i * 4L);
System.out.println(randf.readInt());
}
randf.close();
}catch(IOException e){
System.out.println("File access error" + e);
}
}
}
三、总结
(1)在 java 中有数据传输的地方都用到 I/O 流(通常是文件、网络、内存和标准输入输出等)
(2)InputStream 和 OutputStream 是所有字节流的祖先(只有 RandAccessFile 类是一个列外),read 和 write 是它们最基本的方法,读写单位是字节
(3)Reader 和 Writer 是所有字符流的祖先,read 和 write 是它们最基本的方法,读写单位是字符。
(4)在众多的流对象中,并不是每一种都单独使用,其中过滤流的子类在数据送出去之前做必要的处理。
参考: