【问题标题】:Java.io/Android File() instance vs actual file-system object, when is it created?Java.io/Android File() 实例与实际文件系统对象,何时创建?
【发布时间】:2016-09-10 00:31:42
【问题描述】:

我在澄清有关 Java.io.File 的文档时遇到了一些麻烦。

来自Android docs

此类的实例可能表示也可能不表示实际的文件系统对象,例如文件或目录。如果它确实表示这样的对象,则该对象驻留在分区中。分区是文件系统的特定于操作系统的存储部分。单个存储设备(例如物理磁盘驱动器、闪存、CD-ROM)可能包含多个分区。该对象(如果有)将驻留在分区上

据我了解,File 对象很像文件系统结构中某个位置的路径/指针。

关于分区的部分让我很困惑,

当我打电话时:

File file = new File(getFilesDir(),"myFileName.txt")

是否为名为“myFileName.txt”的新文件系统对象分配了新的硬盘空间块?即。

Memory: Documents hats.png

调用构造函数后:

Memory: OR Memory Partition Land: Documents Documents myFileName.txt hats.png hats.png myFileName.txt

如果不是这个名为“myFileName.txt”的文件系统对象是如何/何时物理创建的?

【问题讨论】:

  • 关于这个:“这个类的实例可能表示也可能不表示实际的文件系统对象,例如文件或目录”我认为这是在谈论像/proc 这样的虚拟文件系统。 /proc 中的“文件”不是真正的文件(磁盘上的 0 字节)。这些“文件”用于获取进出内核的信息。看到这个:kernel.org/doc/Documentation/filesystems/proc.txt

标签: java android file io


【解决方案1】:

Java 文件只是对文件的引用,无论它是否存在。您展示的方法使用指定的目录生成一个新文件,同时自动包含正确的路径分隔符。

您可以检查file.exists() 以查看您引用的文件是否确实存在于系统上。

在您打开文件之前不会创建文件。

你也可以使用file.createNewFile();,效果和在命令行调用touch一样。

【讨论】:

    【解决方案2】:

    据我了解,File 对象很像文件系统结构中某个位置的路径/指针。

    没有。 File 封装了一个文件name。而已。它不必是现有文件的名称。

    当我打电话时:

    File file = new File(getFilesDir(),"myFileName.txt")
    

    是否为名为“myFileName.txt”的新文件系统对象分配了新的硬盘空间块?

    不是。

    如果不是,这个名为“myFileName.txt”的文件系统对象是如何/何时物理创建的?

    当您执行以下任一操作时:

    • 致电File.createNewFile()(除非您喜欢零长度文件,否则几乎不需要)
    • FileOutputStreamFileWriter 的构造函数中使用File,或在mode 参数中使用RandomAccessFilew
    • 通过Path 间接使用它来构造上述之一或FileChannel

    【讨论】:

      【解决方案3】:

      每当我们创建一个不考虑类的对象时,我们总是使用一个引用变量来引用作为堆内实际内存位置的对象。

      Ex-Animal deer = new Animal();
      

      这里的Animal是类,deer是Animal类型的引用变量,而deer是指动物类对象。如果我们想操作我们的成员(成员变量和成员函数),我们肯定需要一个引用变量。

      但是下面的语句->

      File file = new File( getFilesDir() ,"myFileName.txt");
      

      这里的文件肯定是指myFileName.txt文件,但是不能确定这个文件物理上是否存在?

      Assumption-1 ->你的目录中不存在文件(getFilesDir() 指的是什么……)

      如果你的程序只包含这个语句,这将永远不会创建实际的文件,因为我们有不同的方法,如 createNewFile()、createTempFile(有一些正式的参数)来创建实际的文件等。

      Assumption-2 ->文件存在于您提供的目录中..

      如果您在程序的第一次执行中创建了文件,那么在程序的后续执行中,您的引用变量文件将引用实际文件。

      考虑这个程序->

          try
          {
              File myFile = new File("information.txt");
              System.out.println("Does your File Exists.."+myFile.exists());
              boolean returnValue = myFile.createNewFile();
              System.out.println("Return Value Is "+returnValue);
          }
          catch(Exception ee )
          {
              ee.printStackTrace();
          }
      

      以上代码至少执行2次,注意区别..

      请记住,当文件被物理创建时,它会占用内存中的空间..

      更多信息请参考这个 api -> https://developer.android.com/reference/java/io/File

      【讨论】:

        猜你喜欢
        • 2013-04-03
        • 1970-01-01
        • 2021-05-26
        • 1970-01-01
        • 1970-01-01
        • 2012-05-11
        • 2016-03-19
        • 2013-06-18
        • 2021-01-13
        相关资源
        最近更新 更多