2015-06-05 3 views
0

как читать данные файла из файла/десериализовать объект. Я создал файл, который является двоичным файлом, который содержит список данных компаний, которые я могу добавить новую компанию и связанные с ней данные, но когда я хочу, чтобы читать обратно все файлы ДАННЫЕ это дает только первая компания ДАННЫЕ и печатает нулевой ..what является ниже проблемой является то, что я сделалDeserializing a Object только считывает данные

public class CompanyInfo extends Company { 
    int counter=0; 
    Scanner in=new Scanner(System.in); 
    private ArrayList<Company> companyinfo; 

public CompanyInfo() { 
    companyinfo=new ArrayList<Company>(); 
} 

public void registercompany() { 

    System.out.println("Enter Company Name \n"); 
    companyName=in.nextLine(); 
    System.out.println("\n"); 
    System.out.println("Enter Company Code \n"); 
    companyCode=in.nextLine(); 
    System.out.println("\n"); 
    System.out.println("Enter the Share Number \n"); 
    shareNo=in.nextInt(); 
    System.out.println("\n"); 
    System.out.println("Enter Closing Rate \n"); 
    closingRate=in.nextDouble(); 
    Company cin=new Company(companyName,companyCode,shareNo,closingRate); 
    companyinfo.add(cin); 

    try { 
     ObjectOutputStream outObjFile =new ObjectOutputStream(new FileOutputStream("companies.dat",true)); 
     Company company = new Company(companyName,companyCode,shareNo,closingRate); 
     outObjFile.writeObject(company); 
     outObjFile.writeChars("\n"); 
     outObjFile.close(); 

    } catch (Exception e) { 
     // TODO: handle exception 
     System.out.println("A file error has occurred. Sorry."); 
     System.out.println(e.getMessage()); 
    } 


    counter++; 

    } 
public void viewcompany(){ 
    try { 
     ObjectInputStream inObjFile = new ObjectInputStream(
       new FileInputStream("companies.dat")); 
       System.out.println(inObjFile.readObject()); // displays first object 
       Company company = (Company)inObjFile.readObject(); // restores object 
       System.out.println(company); // displays restored object 
       inObjFile.close(); // finished with the file now. 
    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
    } 
+0

Вы только сериализации/десериализации компании, если вы хотите, чтобы получить все из них вы должны сериализации/deserialize 'companyinfo' –

+0

Мне не понравилось! не могли бы вы объяснить? –

+1

Я угадываю флаг 'append = true' для' FileOutputStream', что может быть попытка добавить каждое записанное значение в файл. Однако, 'ObjectOutputStream' пишет специальные значения маркера в поток, поэтому вам нужно делать больше работы, если вы хотите читать несколько отдельных потоков объектов из одного файла. –

ответ

0

я буду делать два разных способа.

  1. Добавить все детали в hashmap и сериализовать этот объект. Поэтому, читая назад, я могу искать «ключ». Ключ может быть именем или идентификатором компании. Вы можете сделать то же самое с ArrayList. Поиск может быть трудным. Immutable collections from Guava меньше используемой памяти и лучше.
  2. Другим решением является создание объектного файла с ключом.dat и размещение в каталоге, называемом компанией. Так легко читать и выполнять поиск.
0

наконец я нашел ответ ... Надеюсь, что это помогает другим too..good удачи

public class CompanyInfo extends Company { 
    int counter=0; 
    private static String filename = "company.dat"; 
    Scanner in=new Scanner(System.in); 
    private ArrayList<Company> companyinfo; 

    public CompanyInfo() { 
     companyinfo=new ArrayList<Company>(); 
    } 

public void registercompany() { 


    System.out.println("Enter Company Name \n"); 
    companyName=in.nextLine(); 
    System.out.println("Enter Company Code \n"); 
    companyCode=in.nextLine(); 
    System.out.println("Enter the Share Number \n"); 
    shareNo=in.nextInt(); 
    System.out.println("Enter Closing Rate"); 
    closingRate=in.nextDouble(); 
    Company cin=new Company(companyName,companyCode,shareNo,closingRate); 
    companyinfo.add(cin); 
File file=new File(filename); 
boolean append=true; 
ObjectOutputStream out=null; 
try { 
    if (!file.exists()||!append) { 
     out=new ObjectOutputStream(new FileOutputStream(filename)); 
    } 
    else 
    { 
     out=new AppendableObjectOutputStream(new FileOutputStream (filename, append)); 
    } 
    Company company = new Company(companyName,companyCode,shareNo,closingRate); 
    out.writeObject(company); 
    out.flush(); 

} catch (Exception e){ 
    e.printStackTrace(); 
}finally{ 
    try{ 
     if (out != null) out.close(); 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

    counter++; 

    } 
public void viewcompany(){ 
    try { 
     List<Object> results = new ArrayList<Object>(); 
     FileInputStream fis = new FileInputStream(filename); 
     ObjectInputStream ois = new ObjectInputStream(fis); 
     try{ 
     while (true) { 
     results.add(ois.readObject());} 
      } 
     catch (OptionalDataException e) { 
      if (!e.eof) throw e; } 
     finally { 
      System.out.println(results); 
      //System.out.println(((Company)results.get(0)).companyName); 
      ois.close(); } 
    } 
    catch (Exception e){ 
     System.out.println(e.getMessage()); 
    } 

} 
private static class AppendableObjectOutputStream extends ObjectOutputStream { 
    public AppendableObjectOutputStream(OutputStream out) throws IOException { 
     super(out); 
    } 

    @Override 
    protected void writeStreamHeader() throws IOException {} 
    } 
} 
Смежные вопросы