当前位置: 首页 > 面试题库 >

FileOutputStream打开一个新文件,并在创建文件时将其删除

司马祖鹤
2023-03-14
问题内容

我正在处理文件中的序列化和反序列化。而且,我正在堆叠使用FileOutputStreamwith
ObjectOutputStream。问题是我有服务器/客户端聊天应用程序,无论何时连接客户端,服务器都必须检查连接的客户端是否已注册。因此,当客户端连接到服务器时,服务器会创建一个输出流,例如

FileOutputStream fos = new FileOutputStream("src\\example\\mainList.txt");

获取链接列表以检查此列表是否包含此对象。但是,FileOutputStream总是创建一个没有内容的新文件。我知道是否将“
true”值作为附加文件的第二个参数传递,但是此.txt文件应仅包含一个对象,该对象为链表。因此,我不想在每个过程中都添加一个列表。我该如何处理问题?我只想要

  • 如果有专用文件,没有内容,则不读取对象,仅第一次添加列表
  • 如果存在具有内容的指定文件(意味着只有一个链表对象),则将其读取,然后将新客户端添加到列表中,并将链表对象写回到该文件中。

希望我对您的问题有所了解,我将为您的每一个答复表示感谢。所以还是谢谢

编辑:这是我要说的简单例子。

public class PersonTest2 {

    public static void main(String[] args) throws IOException, ClassNotFoundException {

        LinkedList<Person> list = new LinkedList<Person>();

        Person per = new Person("John","Thompson",22);
        Person per2 = new Person("Suzie","Cash",23);
        Person per3 = new Person("Peter","Jackson",24);
        Person per4 = new Person("Michael","Coch",25);

        list.add(per);
        list.add(per2);
        list.add(per3);
        list.add(per4);

        FileOutputStream fos = new FileOutputStream("person.txt");

        BufferedReader br = new BufferedReader(new FileReader("person.txt"));     
        if (br.readLine() == null ) {
            System.out.println("No errors, and file is empty");

        }

        ObjectOutputStream oos = new ObjectOutputStream(fos);

        oos.writeObject(list);
        fos.close();

        FileInputStream fis = new FileInputStream("person.txt");
        ObjectInputStream ois = new ObjectInputStream(fis);

        LinkedList<Person> list2;

        list2 = (LinkedList) ois.readObject();

        for (Iterator<Person> itr = list2.iterator(); itr.hasNext();) {
            Person rper = itr.next();

                System.out.println(rper.name + " " + rper.last_name + " " + rper.age);
        }
    }

}

每次我运行这段代码FileOutputStream都会打开一个新文件。但是,如果我使用true第二个参数,它将附加链表。


问题答案:
  • 如果有专用文件,没有内容,则不读取对象,仅第一次添加列表
  • 如果存在具有内容的指定文件(意味着只有一个链表对象),则将其读取,然后将新客户端添加到列表中,并将链表对象写回到该文件中。

您可以通过以下方式执行此操作:

File file = new File("person.txt");
boolean toWrite = false;
boolean toModify = false;
if (file.exists())
{
   if (file.length() == 0)
   {
     toWrite = true;
   }
   else 
   {
     toModify = true;
   }
}
if (toWrite || !file.exists())
{
     FileOutputStream fos = new FileOutputStream(file);
     ObjectOutputStream oos = new ObjectOutputStream(fos);
     oos.writeObject(list);
     fos.close();
     oos.close();
}
else if (toModify)
{
   FileInputStream fins = new FileInputStream(file);
   ObjectInputStream oins = new ObjectInputStream(fins);
   LinkedList<Person> temp = (LinkedList<Person>)oins.readObject();
   fins.close();
   oins.close();
   temp.add(per);
   temp.add(per2);
   temp.add(per3);
   temp.add(per4);
   FileOutputStream fos = new FileOutputStream(file);
   ObjectOutputStream oos = new ObjectOutputStream(fos);
   oos.writeObject(temp);
   fos.close();
   oos.close();
}


 类似资料:
  • 我被困在一个奇怪的情况下,实际上我有一个工作,它在一个单独的文件夹中创建文件,该工作每天都在运行,所以它每天都在该文件夹中创建文件,该文件扩展名为. dat以及它的zip文件。 现在,假设作业今天运行,它将在该文件夹中创建两个文件,第二天我希望前一天的zip文件保留在该文件夹中,但是。dat文件应在删除之前删除。今天的dat文件得到创建,我已经写了代码,但它没有发生,因为我想请建议如何实现这一点

  • 问题内容: 我正在使用XJC从XSD文件生成一堆.java文件。我还需要将这些文件编译为.class文件,并在运行时通过反射使用它们。 我遇到的问题是,在生成.java文件并尝试对其进行编译之后,编译器无法正确地对其进行编译,并给我以下错误: 我假设这与JVM不了解我刚刚生成的包,因此找不到引用的类有关。 这可以通过在生成.java文件后重新启动程序来解决。但是我很好奇,是否有一种方法可以在运行时

  • 问题内容: 我正在学习有关Android应用程序开发的课程,并尝试创建xml文件并将其写入android的内部存储中。就方法而言,我在最初设置时遇到问题。我已经写了大部分,但有我无法弄清的错误。也许因为我整天都在工作,所以不知道。这是我本节课的代码。我遇到的错误是公共String宝藏和FileOutputStream上的非法修饰符。任何帮助,将不胜感激。 好的,我找出了最初的问题,需要使用try

  • 问题内容: 我正在寻找一个小的代码段,它将在文件中找到一行并删除该行(不是内容而是行),但是找不到。因此,例如,我在以下文件中: myFile.txt: 需要具有这样的功能:,如果通过 ,我将获得如下文件: myFile.txt: 问题答案: 该解决方案可能不是最佳或漂亮的,但它可以工作。它逐行读取输入文件,并将每一行写到一个临时输出文件中。每当遇到符合您要查找的内容的行时,它都会跳过将其写出的操

  • 问题内容: 我想在此处创建的文件夹中创建一个文本文件。 但是此代码不会将文本文件创建到该文件夹​​中。而是将文本文件放置在该文件夹之外。 问题答案: java.io.File的构造函数之一带有一个父目录。您可以改为:

  • 我正在C:drive文件夹中创建一个名为abc的dat文件,如下所示,现在我的文件每天都会生成,假设我的文件是今天生成的,然后tommrow也会像往常一样生成,但在生成tommrow时,我必须确保删除前一天的文件,因为该文件夹中的空间有限,每次需要执行此检查时,前一天的文件都会从该文件夹中删除,请建议如何实现这一点。。