在RandomAccessFile中保存枚举

时间:2015-05-17 15:15:30

标签: java enums randomaccessfile

好的,我有一个名为Encuadernacion.java

的班级
public enum Encuadernacion {
    NONE("Ninguno"),
    RUSTICA("Rustica"),
    CARTONE("Cartone"),
    PIEL("Piel"),
    ESPIRAL("Espiral"),
    GRAPADA("Grapada");

    private final String ENCUADERNAR;

    Encuadernacion(String descripcion){
        this.ENCUADERNAR = descripcion;
    }
    public String getDescripcion(){
        return ENCUADERNAR;
    }
}

然后创建了名为Libro.java

的图书
public class Libro implements Serializable{
    private Encuadernacion encuadernado;
    public void setEncuadernado(int encuadernar){
        this.encuadernado = Encuadernacion.values()[encuadernar];
        //this encuadernar index is handled on another class.
    }
    public String getEncuadernacion(){
        return encuadernado.getDescripcion();
     }
        @Override
        public String toString(){
            return encuadernado.getDescripcion();
        }

然后是名为Test.java

的主类
public class Test{
    public static void main(String[] args)throws IOException{
        RandomAccessFile fichero = null;
        try {
                fichero = new RandomAccessFile("BIBLIO.DAT", "rw");

        }catch (FileNotFoundException e){
            System.out.printf("Mensaje: %s", e.getMessage());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

当我将枚举写入BIBLIO.DAT时,它会被写成一个字符串,直到这一步都没问题。但是当我想阅读它时,我会在阅读这些文字时创建一本新书。 Listar.java

    public class Listar {
        public static void lista(RandomAccessFile fichero)throws IOException, ClassNotFoundException{    
            try{
                while(true){
                    Libro libro=new Libro();
                    libro.setEncuadernado(fichero.readUTF());
                    System.out.println(libro.toString());
                }
        }catch(EOFException e){
            if(fichero!=null) fichero.close();
        }
    }
}

在此libro.setEncuadernado(fichero.readUTF());这是不可能的,因为这必须是来自Encuadernacion SOMETHING;的值 我怎么解决这个问题?将此字符串转换为枚举值,或以不同的方式将枚举写入BIBLIO.DAT,但RandomAccessFile没有方法可以执行此操作。

为了更好的阅读而削减代码。

2 个答案:

答案 0 :(得分:1)

我认为值得尝试:

public void setEncuadernado(String encuadernar){
    this.encuadernado = Encuadernacion.valueOf(encuadernar);
    //this encuadernar index is handled on another class.
}

在Libro课程中。但由于您的代码不是MCVE,我没有对其进行测试。

答案 1 :(得分:1)

解决了这样的问题。

public static String listarEncuadernados(){
        Scanner scann=new Scanner(System.in);
        int i =0;
        for (Encuadernacion tipos: Encuadernacion.values()){
            System.out.printf("\n%d.- %s", i, tipos.getDescripcion());
            i++;
        }
        System.out.println();

        int op = scann.nextInt();
        return Encuadernacion.values()[op].getDescripcion();
    }


public class Libro implements Serializable{
    public void setEncuadernado(String encuadernar){
            this.encuadernado = Encuadernacion.valueOf(encuadernar.toUpperCase());

    }

    @Override
    public String toString(){
        return encuadernado.getDescripcion();
    }
}

public class Listar {
    public static void lista(RandomAccessFile fichero)throws IOException, ClassNotFoundException{

        try{
            while(true){
                Libro libro=new Libro();
                libro.setEncuadernado(fichero.readUTF());
                System.out.println(libro.toString());
        }
       }catch(EOFException e){
        if(fichero!=null) fichero.close();
    }
}

}