什么时候在java中使用flush()?

时间:2011-09-04 16:45:36

标签: java serialization

import java.io. * ;
public class Ser {

    public static void main(String args[]) {

        try {
            John myObj = new John("Sachin", "Cricket");
            System.out.println(myObj);
            FileOutputStream fos = new FileOutputStream("FileName");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(myObj);
            oos.flush();
            oos.close();
        } catch (Exception e) {
            System.out.println("Expection" + e);
            System.exit(0);
        }

        try {
            John myObj2;
            FileInputStream fis = new FileInputStream("FileName");
            ObjectInputStream ois = new ObjectInputStream(fis);
            myObj2 = (John) ois.readObject();
            ois.close();
            System.out.println("New Object" + myObj2);
        } catch (Exception e) {
            System.out.println("Expection" + e);
            System.exit(0);
        }

    }
}

class John implements Serializable {

    private String name;
    private String department;

    public John(String name, String department) {
        this.name = name;
        this.department = department;
    }

    public String toString() {
        return "Name" + name + " " + "Department" + department;

    }

}

我在上面的例子中有几个问题。

  1. 何时使用冲洗方法,为什么要使用它?
  2. close方法在这里得分是什么?
  3. myObj2 = (John) ois.readObject(); ...请纠正我,如果我错了,我正在读取文件对象并存储到另一个对象并对文件对象进行类型转换。
  4. 使用Java进行序列化或持久化数据的替代方法有哪些。我不希望数据作为字节流进入文件。

6 个答案:

答案 0 :(得分:10)

  
      
  1. 何时使用冲洗方法,为什么要使用它?
  2.   

当需要同步发送

时使用

例如,你有一个双工(2路)连接,你刚刚发送了一条消息,现在需要等待它的回复,没有刷新缓冲的输出流可能会保持它,直到缓冲区填满(死锁)

  
      
  1. myObj2 = (John) ois.readObject();如果我错了,请纠正我,我正在读取文件对象并存储到另一个对象并对文件对象进行类型转换。
  2.   

错误!您从流中读取了一些数据,将其转换为John(如果读取的对象不是John,则会抛出)

  
      
  1. 使用Java进行序列化或持久化数据的替代方法有哪些。我不希望数据作为字节流进入文件。
  2.   

您可以将其写为文本(将字段写为行上的文本)并提供将其解析为对象的方法

答案 1 :(得分:7)

  

何时使用冲洗方法,我们为什么要使用它?

它刷新了OutputStream仍然缓冲的任何内容。 JavaDoc中提供了详细说明。


  

close方法在这里得分是什么?

我不确定'带分数'是什么意思,但close方法最终会关闭资源(输入或输出),它会释放,例如文件句柄。您应该始终在finally块中调用close来清理操作系统可能具有的所有引用。

InputStream is = null;
try {
    is = new FileInputStream(...);
    // do stuff
} catch (IOException e) {
    // do stuff
} finally {
    if (is != null) {
        is.close();
    }
}

  

myObj2 =(John)ois.readObject();如果我错了,请纠正我,   我正在读取文件对象并存储到另一个对象和   对文件对象进行类型转换。

以某种方式更正,您之前反序列化写入该文件的对象。这些文件是专有的,只能被Java理解,所以你最后一个问题是一个!


  

序列化或持久化数据的替代方法是什么?   Java的。我不希望数据作为字节流进入文件。

您有很多选择。对于客户端应用程序,您可能希望使用XML,JSON或轻量级数据库(如SQLlite)。在服务器端,您可以查看更强大的数据库(例如MySQL)。

答案 2 :(得分:4)

在上面的例子中有几个问题。

  1. 何时使用flush方法,为什么要使用它?

    您通常不需要flush()OutputStream,如果您最终close()它,它将不会丢失任何数据。有时,您希望与底层数据接收器(例如网络Socket,本地File或其他OutputStream)进行通信,以便刷新/处理写入流的任何数据 - - 但根据flush() API文档,无法保证会发生。

  2. close方法在这里得分是什么?

    我真的不明白这一部分,但是close()关闭OutputStream并导致它写出仍然缓冲的任何数据 - 所以不需要调用{{1}在flush()之前。关闭后无法写入close()

  3. OutputStream ...请纠正我,如果我错了,我正在读取文件对象并存储到另一个对象并对文件对象进行类型转换。

    错了,你正在阅读myObj2 = (John) ois.readObject(); ObjectInputStream,它与数据的来源无关(在你的情况下确实来自文件,但没有“文件对象) “在你的代码中)。

    ois可以重建以前由ObjectInputStream编写/序列化的所有数据 - 因此在这种情况下,您反序列化类型为ObjectOutputStream的先前序列化对象。因为序列化仅适用于某些Java类型(John的原语和实现者),所以它不知道您的特定类Serializable。但是你知道,你之前已经对John对象进行了分类,因此您可以安全地从John转换为Object并将其分配给本地变量。

  4. 在Java中使用序列化或持久化数据有哪些替代方法。我不希望数据作为字节流进入文件。

    您可以查看其他序列化/编组方法,例如XStreamJSON或滚动您自己的(复杂,只有在您有充分理由时才执行此操作)。其中大部分都比内置序列化更复杂,因此请确保您有充分理由不将“itno文件写为字节流”。

答案 3 :(得分:1)

  1. 使用 flush()清除内部缓冲区(如果有)并强制将所有待处理数据写入(即刷新)到流目标。
  2. close()方法用于关闭流,一旦调用,就不能再使用流了。
  3. 即可。您正在阅读“文件中的John对象”。 John类型的对象应该先前已经序列化到文件中。
  4. Java序列化有很多替代方法,例如XStream。请参阅alternatives to serialization的这个答案。

答案 4 :(得分:1)

1)确保写入任何可能的缓冲字节。请参阅java.io.OutputStream.flush()

2)不确定您的意思,但应将close()调用放在finally块中以确保资源已关闭。 Google快速透露 - article

3)您没有阅读文件对象。您正在从文件中读取以前序列化的Java对象。希望这个对象是John类型,否则你将获得ClassCastException。它将是John类型,因为您之前称为“oos.writeObject(myObj)”,其中myObj的类型为John。

4)Google用于序列化Java对象。有许多库可以将Java对象序列化为二进制文件,xml,json等等.JDK本身带有一个名为XMLEncoder的库。

答案 5 :(得分:1)

  1. 何时使用flush:
  2. 刷新功能是明确要求Java程序将某些东西写入磁盘,这意味着要做IO。假如我们使用bufferedOutputStream,当我们写(“某事”)时,它存储在缓冲区中,但尚未存储在磁盘中。当您调用flush时,它会将缓冲区中的内容写入磁盘。通常,您不需要自己调用刷新,因为它需要IO并降低速度。当缓冲区已满时,流将自动刷新。除非您希望将某些内容更新到磁盘,否则可以使用flush。

    1. 抱歉,不明白你的问题?哪个得分?

    2. 这是序列化的功能,它允许您将一些对象存储到文件系统中并将其恢复。您正在读取字节流并将其转换回对象。

    3. 有很多方法(xml,数据库,txt文件),编写自己的格式将数据存储在本地文件中,或将它们存储在数据库中。让我在这里使用你的例子约翰。它具有名称和部门属性。您可以编写一个格式输出来获取John实例,并执行以下操作。

      outputStream.write(“class John \ n”); outputStream.write(“toString:”+ instance +“\ n”); outputStream.close();

    4. 然后它将保存为本地txt文件,您可以打开它并阅读它。