Files
使用 FileInputStream 或 FileReader 可以用于读入文件,前者基于二进制,后者基于文本。使用它们不需要读取整个文件,但是只能按照它们存储的顺序,依次读取字节,或字符。
使用 FileOutputStream 或 FileWriter 可以把数据写出到文件,按照数据被写入的顺序,依次存储数据。
RandomAccessFile 可以在文件中跳转,读入数据,或者写出数据到文件。Random Access 并不意味着你真的从随意的位置读入数据,或者把数据写入到随意位置。而是意味着你可以在文件中跳跃,然后在停留的位置读入数据,并且写出数据。写出数据时,是覆盖原来的数据,不会是数据。
File 类用于获取文件大小,属性,不能用于获取文件内容。
File 类
Java IO API 中的 File 类可以访问底层文件系统,获取文件的信息元,即获取用于描述文件的信息,例如文件大小,属性等。如果需要访问文件内容,需要使用 FileInputStream, FileOutpuStream, RandamAccessFile。在 Java NIO 中,则使用 java.nio.FileChannel 读入文件内容。
创建文件对象的实例
File file = new File("/tmp/tony/a.txt");
检查文件是否存在
在创建 File 对象时,即使文件不存在,构造器也不会报错。
File file = new File("/tmp/tony/a.txt"); boolean isFileExist = file.exists();
创建目录
mkdirs() 方法可以创建 File 路径上面没有的全部文件夹。 下面例子中,如果 resources 以及之前的目录已存在,而 aaa 和 bbb 两层目录不存在,mkdirs() 会创建 aaa/ 以及其子目录 bbb/。
File folder = new File("/tmp/tony/aaa/bbb/"); boolean isSuccess = folder.mkdirs();
mkdir() 方法只会最里面的那个目录。上面例子如果使用 mkdir() ,bbb 不会被创建,因为没有 aaa 目录,返回 false.
文件大小
File file = new File("/tmp/tony/a.txt"); long size = file.length();
移动文件、改名
修改文件名字,移动文件位置,都是用 renameTo() 方法,和 Linux 中的 mv 命令相似。
File file = new File("/tmp/tony/a.txt"); boolean isSuccess = file.renameTo(new File("/tmp/tony/aaa/xx.txt"));
删除文件
File file = new File("/tmp/tony/a.txt"); file.delete();
列举目录下的文件
list() 方法获得目录下的全部文件名, listFiles() 方法获得目录下的全部文件,以 File 对象的形式存在。
File file = new File("/tmp/tony/a.txt"); String[] subfileNames = file.list(); File[] subFiles = file.listFiles();
FileInputStream 和 FileOutputStream
FileInputStream
FileInputStream 按照 stream 的方式,基于字节,读取文件的内容。FileInputStream 是 InputSteam 的子类。
InputStream is = new FileInputStream("/tmp/tony/a.txt"); int data = is.read(); while(data != -1){ System.out.print((char)data); data = is.read(); } is.close();
FileInputStream 的构造器有:
a. 接收一个 String 类型
String filePath = "/tmp/tony/a.txt"; InputStream is = new FileInputStream(filePath);
b. 接收一个 File 对象为参数
File file = new File("/tmp/tony/a.txt"); InputStream is = new FileInputStream(file);
read() 方法,一次读取一个字节,并返回该字节对应的 int 值
read(byte[]) 一次读取一个字节数组
close() 关闭 stream
FileOutputStream
写出数据到文件
OutputStream os = new FileOutputStream("/tmp/tony/b.txt"); os.write("abcd\n".getBytes());
FileOutputStream 构造器
a. 接收一个参数, String 类型
OutputStream os = new FileOutputStream("/tmp/tony/a.txt");
b. 接收一个参数,File 类型
File file = new File("/tmp/tony/b.txt"); OutputStream os1 = new FileOutputStream(file);
c. 接收两个参数。第一个参数用于定位文件,String 或 File 类型;第二个参数表示,在写出数据到文件时,追加还是覆盖 File 文件原有的内容。
OutputStream os1 = new FileOutputStream("/tmp/tony/a.txt", true); // append content OutputStream os2 = new FileOutputStream("/tmp/tony/a.txt", false); // overwrite content
wirte() 一次写出一个字节
write(byte[]) 一次写出一个字节数组
flush() 清刷写到 FileOutputStream 的缓冲区的数据到硬盘上。
RandomAccessFile
RandomAccessFile 可以跳到文件中的某个位置,开始读入和写出数据。写出数据时,会覆盖掉文件在该位置原有的内容,这是 FileInputStream 和 FileOutputStream 无法实现的。
FileReader 和 FileWriter
FileReader
FileReader 按照 stream 的方式,基于字符,读取文件的内容,和 FileInputStream 相似。区别在于 FileInputStream 基于 byte , 而 FileReader 基于字符。
Reader reader = new FileReader("/tmp/tony/a.txt"); int data = reader.read(); while(data != -1){ System.out.print((char)data); data = reader.read(); } reader.close
字符集编码
FileReader 使用应用所在环境的编码集,对读入的数据进行解码。如果写出文件的编码集和读入文件时的编码集不一样,就会导致乱码。这时需要制定字符集,不是用 FileReader ,而是用基于 FileInputStream 的 InputStreamReader 。
InputStream is = new FileInputStream("/tmp/tony/b.txt"); Reader reader = new InputStreamReader(is, "UTF-8"); int data = reader.read(); while(data != -1){ System.out.print((char)data); data = reader.read(); } reader.close();
FileWriter
FileWriter 按照 stream 的方式,基于字符,把数据写出到文件中,和 FileOutputStream 相似。区别在于 FileOutputSteam 基于 byte, 而 FileWriter 基于字符。
Writer writer = new FileWriter("/tmp/tony/c.txt"); writer.write("aaabbb\n"); writer.close();
两个参数的构造器,第一个参数用于定位文件,第二参数表示在写出数据到文件时,是追加还是覆盖文件中原有的内容。
Writer writer1 = new FileWriter("/tmp/tony/a.txt", true); //appends to file Writer writer2 = new FileWriter("/tmp/tony/a.txt", false); //overwrites file
FileWriter 在写出数据时,无法指定特定的字符编码集。如果需要指定编码集,则不用用 FileWriter ,而是用基于 FileOutputStream 的 OutputSteamWriter。
os = new FileOutputStream("/tmp/tony/d.txt"); Writer wt = new OutputStreamWriter(os, "UTF-8"); wt.write("aaa\n你好"); wt.close();
参考资料