Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用DataOutputStream和DataInputStream进行序列化/反序列化?_Java_Serialization_Deserialization_Datainputstream_Dataoutputstream - Fatal编程技术网

Java 如何使用DataOutputStream和DataInputStream进行序列化/反序列化?

Java 如何使用DataOutputStream和DataInputStream进行序列化/反序列化?,java,serialization,deserialization,datainputstream,dataoutputstream,Java,Serialization,Deserialization,Datainputstream,Dataoutputstream,我试图用DataOutputSteam和DataInputSteam而不是ObjectInputStream/ObjectOutputStream来序列化/反序列化事物 序列化失败。txt文件保持为空。 当然,test2字符串最终都是空的(不能反序列化空文件) 这是我的目标: public class Test implements Serializable { public String[] nom; public Test() { nom = new S

我试图用DataOutputSteam和DataInputSteam而不是ObjectInputStream/ObjectOutputStream来序列化/反序列化事物

序列化失败。txt文件保持为空。 当然,test2字符串最终都是空的(不能反序列化空文件)

这是我的目标:

public class Test implements Serializable {
    public String[] nom;


    public Test() {

        nom = new String[5];
        nom[0] = "Coucou";
        nom[1] = "Je suis un tab de String";
        nom[2] = "Je vais me faire serialiser";
        nom[3] = "Et deserialiser aussi !";
        nom[4] = "Je suis le roi du monde !";
    } 
}
以下是我的尝试:

    Test test = new Test();
    Test test2 = new Test();


    test2.nom[0] = "";
    test2.nom[1] = "";
    test2.nom[2] = "";
    test2.nom[3] = "";
    test2.nom[4] = "";

     DataInputStream dis;
     DataOutputStream dos;

   // serialisation manuelle
    try {
      dos = new DataOutputStream(
              new BufferedOutputStream(
                new FileOutputStream(
                  new File("nom2.txt"))));

      for(int i = 0; i < 5; i++)
      {  
             dos.writeUTF(test.nom[i]);
      } 
        } catch (FileNotFoundException e) {
    } catch (IOException e) {}      




    // deserialisation manuelle
       dis = new DataInputStream(
              new BufferedInputStream(
                new FileInputStream(
                  new File("nom2.txt"))));

    try { 
        test.nom[0] = dis.readUTF();
        test.nom[1] = dis.readUTF();
        test.nom[2] = dis.readUTF();
        test.nom[3] = dis.readUTF();
        test.nom[4] = dis.readUTF();
            } catch (FileNotFoundException e) {
    } catch (IOException e) {}
Test Test=新测试();
测试2=新测试();
test2.nom[0]=“”;
test2.nom[1]=“”;
test2.nom[2]=“”;
test2.nom[3]=“”;
test2.nom[4]=“”;
数据输入流dis;
数据输出流dos;
//连载手册
试一试{
dos=新数据输出流(
新的缓冲输出流(
新FileOutputStream(
新文件(“nom2.txt”);
对于(int i=0;i<5;i++)
{  
dos.writeUTF(测试名称[i]);
} 
}catch(filenotfounde异常){
}捕获(IOE){}
//反序列化manuelle
dis=新数据输入流(
新的BufferedInputStream(
新文件输入流(
新文件(“nom2.txt”);
试试{
test.nom[0]=dis.readUTF();
test.nom[1]=dis.readUTF();
test.nom[2]=dis.readUTF();
test.nom[3]=dis.readUTF();
test.nom[4]=dis.readUTF();
}catch(filenotfounde异常){
}捕获(IOE){}

简单解释一下,调用
dos.flush()
将强制系统获取缓冲的任何内容并将其实际写入磁盘。因此,您需要在尝试读取同一文件之前调用它。有关
flush()
的更多详细信息,我建议查看,因为之前已经回答了这个问题。

在打开输出文件进行阅读之前,请尝试关闭输出文件。在某些系统(如Windows)上,第二次打开时不会成功


关闭它将刷新
缓冲输出流。

尝试调用
dos.flush()
将内容写入文件,然后再开始读入。那可能是你的问题。@宋楚瑜,行得通!但为什么?!flush做什么?序列化数据不是文本。.txt文件扩展名不合适。