2017-05-13 11 views
0

2つの静的メソッド:writeFilereadFileを持つクラスを書く必要があります。ただし、readFile()を実行した後は何も返しません。Javaはオブジェクトのarraylistにファイルを読み込み、そのarraylistを返します

class writereadFile { 
    public static void writeFile(ArrayList<Object> list, File file){ 
     try { 
      try (FileOutputStream fos = new FileOutputStream(file);ObjectOutputStream oos = new ObjectOutputStream(fos)) { 
       oos.writeObject(list); 
       oos.close(); 
      } 
     }catch(IOException e){e.getMessage();} 
    } 

    public static ArrayList<Object> readFile(ArrayList<Object>list, File file){ 
     try { 
      try (FileInputStream fis = new FileInputStream(file);ObjectInputStream ois = new ObjectInputStream(fis)) { 
       Object o = ois.readObject(); 
       list = (ArrayList<Object>) o; 
       ois.close(); 
      } 
     }catch(IOException | ClassNotFoundException e){e.getMessage();} 
     System.out.println(list); 
     return list; 
    } 
} 

EDIT: テストのために、この私のクラス。私のオブジェクトは、あなただけのコメントをカスタムオブジェクトが必要な場合、カスタムオブジェクトのarraylistです。

class main { 
    public static void main(String[] args) { 
     Date date = new Date(); 
     Book b1 = new Book("abc", "Phi", true, date, null); 
     Book b2 = new Book("cba", "Someone", true, date, null); 
     Books booklist = new Books(); 
     booklist.add(b1); 
     booklist.add(b2); 

     File filetoDo = new File("book.txt"); 

     //write arraylist into file 
     writereadFile.writeFile(booklist, filetoDo); 

     //clear the arraylist 
     booklist.clear(); 

     //read book from file 
     writereadFile.readFile(booklist, filetoDo); 
     System.out.println(booklist); 
    }  
} 
+1

おそらく、あなたの 'writeFile'メソッドで例外を出力することをお勧めします。 –

答えて

1

あなたのテストでは、次のようになります。

bookList = writereadFile.readFile(booklist, filetoDo); 
をして、道によって、あなたは本当に単純にあなたの readFileメソッドをリファクタリングする必要があります

public static ArrayList<Object> readFile(File file) 

あなたは引数を変更することはできませんJavaは常にpass-by-value呼び出しのセマンティクスなので、参照のように参照してください。 (あなたは、関数内list引数内容を変更することができ、それは、あなたがやっていることはありません。)

+0

ありがとう、これは動作する、私はパスと返信を誤解した –

+0

@ PhiTruongチャンスを得るときに受け入れられた答えとしてマークしてください...ありがとう男! :) –

+0

申し訳ありません、私は新鮮です:) –

0

をあなたはストリームを使用してJava 8の試行を使用している場合:私はこれで遊んでい

public static readFile(String filePath) { 
    List<Object> list = new ArrayList<>(); 

    try (Stream<String> stream = Files.lines(Paths.get(filePath))) { 
     stream.forEach(list::add); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return list; 
} 
+0

それは素敵で素敵なテキストファイルですが、OPはオブジェクトとシリアル化を扱っています – WrRaThY

0

を私自身の話題ですので、あなたの役に立つコードをご覧ください。 例としては、非常に短いと簡単ですので、私はあなたがちょうどあなたのコード:)

public class ExternalIO { 

private ExternalIO() { 
} 

public static ObjectOutputStream objectOutputStream(String basePath, String pathToFile) throws IOException { 
    FileOutputStream fileOutputStream = new FileOutputStream(createFileIfDoesNotExist(absolutePath(basePath, pathToFile))); 
    return new ObjectOutputStream(fileOutputStream); 
} 

public static ObjectInputStream objectInputStream(String basePath, String pathToFile) throws IOException { 
    FileInputStream fileInputStream = new FileInputStream(absolutePath(basePath, pathToFile)); 
    return new ObjectInputStream(fileInputStream); 
} 

private static File createFileIfDoesNotExist(String absolutePath) throws IOException { 
    File file = new File(absolutePath); 
    if (file.exists()) { 
     return file; 
    } 

    file.getParentFile().mkdirs(); 
    file.createNewFile(); 
    return file; 
} 

private static String absolutePath(String basePath, String pathToFile) { 
    return Paths.get(basePath, pathToFile).toAbsolutePath().toString(); 
} 

}

出力の使用にe.printStackTrace()を使用しないことを願っています:

List<ItemType> input = null; //create your input list here 
try (ObjectOutputStream objectOutputStream = ExternalIO.objectOutputStream(CONFIG, FILENAME)) { 
    objectOutputStream.writeObject(input); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

入力用法:

try (ObjectInputStream objectInputStream = ExternalIO.objectInputStream(CONFIG, FILENAME)) { 
    return (List<ItemType>) objectInputStream.readObject(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

希望すること; )

+0

詳細について行くことができますabsolutePath()? –

+0

まあ...相対パスを使用するのではなく、ファイルへの絶対パスを返します。おそらくこれを取り除くかもしれません。なぜなら、おそらくあなたの用途のために何も変えないからです。私はちょうどそれがコードをコンパイルすることを確認するためにそれを貼り付け:) – WrRaThY

関連する問題