EOFException, когда я извлекаю поток ввода / вывода объекта - PullRequest
0 голосов
/ 16 мая 2019

Я использую ObjectInput / Output для инициализации хеш-карты с именем temp, и она помещает всю запись хеш-карты с именем map, которая инициализируется в новое, а затем использую OutputStream для сохранения ее в формате файла .ser эта работа отлично ...

import java.io.*;
import java.util.HashMap;

public class PlayerInfo implements Serializable {

    ObjectOutputStream out;
    ObjectInputStream in;
    File userData =new File("path.ser");
    HashMap map ;
    HashMap temp;
    private Integer ID;
    String name ;
    boolean isItNull =false;

    public static void main(String[] args) {
        new PlayerInfo();
    }
    PlayerInfo(){
        try {
        initializeHashMap();

        }catch (Exception e){
            e.printStackTrace();
        }

    }
    @SuppressWarnings("unchecked")
    private void initializeHashMap(){

    try {
//initialize ObjectInputStream in same method when I use it and close it then
        in =new ObjectInputStream(new FileInputStream(userData));

        if (isItNull){
            temp =new HashMap<Integer,PlayerInfo>();

        }else {
            map =new HashMap<Integer,PlayerInfo>();
            temp = (HashMap<Integer, PlayerInfo>) in.readObject();
            in.close();
        }
    }catch (Exception e){
        isItNull =true;
        initializeHashMap();
    }

    }

    private void getInfo(){

        System.out.println("Ok we are in get info so write your ID:-");
        int id = 10;
    }

    @SuppressWarnings("unchecked")
    private void createInfo()throws IOException{
//same here initialize ObjectOutputStreamin same method when I use it and close it then
        out =new ObjectOutputStream(new FileOutputStream(userData));

        System.out.println("Ok we are in create info so write your ID:-");
        ID =10;
        String scnS ="Mohammed";
        System.out.println("Write your name");
        map.put(ID,new PlayerInfo(scnS));
        temp.putAll(map);

        System.out.println("Saving....");
        out.writeObject(temp);
        out.close();
    }

    public PlayerInfo(String name){
        this.name =name;
    }


}

но это бросок EFOException


import java.io.*;
import java.util.HashMap;

public class PlayerInfo implements Serializable {

    ObjectOutputStream out;
    ObjectInputStream in;
    File userData =new File("path.ser");
    HashMap map ;
    HashMap temp;
    private Integer ID;
    String name ;
    boolean isItNull =false;

    public static void main(String[] args) {

        new PlayerInfo();

    }
    PlayerInfo(){
        try {
        openTheOutPutObjectStreamer();
        openTheInPutObjectStreamer();
        initializeHashMap();

        }catch (Exception e){
            e.printStackTrace();
        }

    }
//here I initialize it in separated method 
    private void openTheOutPutObjectStreamer()throws IOException{
        out =new ObjectOutputStream(new FileOutputStream(userData));

    }
//same here I initialize it in separated method 

    private void openTheInPutObjectStreamer()throws IOException{

        in =new ObjectInputStream(new FileInputStream(userData));

    }

    @SuppressWarnings("unchecked")
    private void initializeHashMap(){

    try {

        if (isItNull){
            temp =new HashMap<Integer,PlayerInfo>();

        }else {
            map =new HashMap<Integer,PlayerInfo>();
            temp = (HashMap<Integer, PlayerInfo>) in.readObject();
            in.close();
        }
    }catch (Exception e){
        isItNull =true;
        initializeHashMap();
    }

    }

    @SuppressWarnings("unchecked")
    private void createInfo()throws IOException{

        System.out.println("Ok we are in create info so write your ID:-");
        ID =10;
        String scnS ="Mohammed";
        System.out.println("Write your name");
        map.put(ID,new PlayerInfo(scnS));
        temp.putAll(map);

        System.out.println("Saving....");
        out.writeObject(temp);
        out.close();
    }

    public PlayerInfo(String name){
        this.name =name;
    }

}

если вы видите это, разница состоит только в том, чтобы отделить ввод / вывод объекта от метода и вызвать их и мне жаль, что я новичок на этом сайте Я не очень разбираюсь в IO, но мне кажется, что я не могу отделить его от методов и вызвать его?

1 Ответ

0 голосов
/ 16 мая 2019

Проблема в том, что в вашем первом коде вы (правильно) открываете входной поток, используете его, а затем закрываете его, прежде чем делать что-либо еще с тем же файлом, но во второй версии кода вы также открываете выходной поток для того же файла, прежде чем прочитав его, и этот выходной поток помещает маркер (место для чтения или записи) в конец файла, поэтому при использовании входного потока вы получаете ошибку конца файла.

Изменение кода на это должно работать

openTheInPutObjectStreamer();
initializeHashMap();
openTheOutPutObjectStreamer();
...