zoukankan      html  css  js  c++  java
  • [Java] Java IO Files

    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
    ".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
    ");
                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
    你好");
                wt.close();

    参考资料

    Java IO Tutorial, jenkov

  • 相关阅读:
    Google官方关于Android架构中MVP模式的示例续-DataBinding
    值不值
    [译]Godot系列教程五
    [译]Google官方关于Android架构中MVP模式的示例
    遭遇Web print
    如何寻找有价值的点
    充电时间 Go中的数组、切片、map简单示例
    一段良好的程序永远不应该发生panic异常
    居然是Firefox没有抛弃我们
    macOS 升级到了10.12.1
  • 原文地址:https://www.cnblogs.com/TonyYPZhang/p/6155433.html
Copyright © 2011-2022 走看看