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

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中使用序列化或持久化数据有哪些替代方法。 我不希望数据作为字节流进入文件。

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

它会刷新仍然由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)。

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

需要同步发送时使用

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

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

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

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

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

在上面的例子中有一些问题。

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

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

  2. close方法在这里得分是多少?

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

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

    错了,你正在从ObjectInputStream读取它,它与数据的来源无关(在你的情况下它确实来自一个文件,但你的代码中没有“文件对象”)。

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

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

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

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

2)不确定你的意思,但是应该将close()调用放在finally块中以确保资源被关闭。 快速谷歌揭示 – 文章 。

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

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

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

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

  1. 对不起,不明白你的问题? 哪个得分?

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

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

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

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