【问题标题】:Why does the value of count in the data file not increment? [closed]为什么数据文件中的count值不递增? [关闭]
【发布时间】:2020-02-23 01:14:26
【问题描述】:

尽管将整数写入数据文件,但文件中可用的总字节数仍为 0。

public class Q 
{
    public static void main(String[] args) throws IOException 
    {
        DataOutputStream output = new DataOutputStream(new FileOutputStream("count.dat"));
        DataInputStream input = new DataInputStream(new FileInputStream("count.dat"));
        if (input.available()==0) 
        {
            output.writeInt(1);
        }
        else
        {
            int count = input.readInt() + 1;
            System.out.println(count);
            output.writeInt(count);
        }
        output.close();
        input.close();
    }
}

【问题讨论】:

  • 您确定要访问该文件吗?也许显示你的文件结构,看看你是否正确调用 count.dat
  • 是的,我可以访问它。代码在文件上写入整数“1”,但不会增加它。相反,它只是一次又一次地重写“1”。
  • 你为什么使用input.available() == 0else 语句将永远不会在您的示例中执行。
  • 创建文件时该文件为空,并且您始终在创建它,因此您的递增代码永远不会执行。您声称该文件为空的说法是错误的。运行此代码后的大小为 4 个字节。
  • 您应该使用单个RandomAccessFile

标签: java file-handling


【解决方案1】:

这里的问题是,当您创建 FileOutputStream 时,旧数据会被删除。至于保留这些数据,我们可以在两个选项之间进行选择:

  1. 最好的方法是创建一个RandomAccessFile,它的行为就像一个大的字节数组。它有一个很棒的功能,支持阅读和写作。在分析我添加了几个cmets的代码之前,我们先看一下。

    public static void main() throws IOException{
    
        File file = new File ("count.dat");
        RandomAccessFile RAF = new RandomAccessFile(file, "rw"); // rw stands for read and write
    
        if (RAF.length() == 0){ //Checks if file is empty
    
            RAF.writeInt(1);
            System.out.println("File was empty!");
    
        }else{
    
            int count = RAF.readInt() + 1;
            RAF.seek(0); //file pointer at position 0
            System.out.println(count);
            RAF.writeInt(count);
    
        }
    
        RAF.close();
    
    }
    

    首先,我声明了 RandomAccessFile。有两个参数,一个是文件,另一个是字符串模式,这里是list:“rw”(读写)、“r”、“rws”和“rwd”。第一个条件检查文件的长度是否为 0,这意味着它是空的。如果它是真的,我们写一个 int。另一方面,如果为假,我们设置读取文件中存储的整数并加一个。然后,随着指针(就位置而言)移动,我们将其设置回位置 0 (RAF.seek(0);)。最后但同样重要的是,我们写入新值,然后关闭文件。

    RandomAccessFile 是一种在不删除先前内容的情况下结合读取和写入的好方法,如果您愿意,您可以这样做。

  2. 另一种方法是先读取,然后打开流。

    File file = new File ("count.dat");
    DataInputStream input = new DataInputStream(new FileInputStream(file));
    int count = input.readInt();
    

    然后,在 else 中更改 count++; 的计数声明

特别感谢 user207421 警告我这篇文章旧版本的错误。

【讨论】:

  • DataOutputStream 不会删除旧数据。 new FileOutputStream(...) 就是这样做的。 FileOutputStream 不继承自 FileReader,后者没有 append 参数。追加到文件不会完成整数值的重写。关闭并立即重新打开输入流是徒劳的。
  • 第一个错误仍然存​​在。在DataOutputStream 中没有“有条件的append()”之类的东西,附加到文件仍然不是解决方案,或者与解决方案有任何关系。没有什么“效率较低”的( 2),尤其是 (1) 中的代码无法编译。
  • 当我提到的大多数问题仍然存在时,感谢我并不好。没有必要打开输出文件完全仅仅读取原始值,更不用说以附加模式打开它,证明是你没有在该模式下不要进行任何写作。第三次,附加模式不再是解决这个问题的一部分。令人费解的是为什么你不这么认为。而且您还没有解释为什么您认为打开文件三次比两次更有效。不是。
  • 全部完成,现在可以了。
猜你喜欢
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多