2017-05-13 1 views
0

두 개의 정적 메소드 인 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; 
    } 
} 

편집 : 테스트를 위해이 내 수업. 사용자 정의 객체가 필요하면 내 객체는 사용자 객체의 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

자세히 설명해주세요. 절대 경로()? –

+0

음 ... 상대 경로를 사용하는 대신 파일의 절대 경로 만 반환합니다. 당신의 사용을 위해 아무것도 바뀌지 않을 것이기 때문에 다시 한번, 당신은 단지 이것을 제거 할 수 있습니다. 코드를 컴파일하기 위해 붙여 넣기했습니다. :) – WrRaThY

관련 문제