2017-10-23 3 views
0

내 클래스 메시지는 File의 클래스 래퍼입니다. deserialize 및 파일 가져 오기 메시지를 직렬화하고 서버에서 보내고 싶습니다. 하지만 deserializing 때, 나는 File name 만 얻는다. 내가 뭘 잘못하고있어?필드를 참조하는 객체로 필드를 직렬화하는 방법은 무엇입니까?

클래스 래퍼 :

public class Message implements Serializable{ 
    private int id; 
    private File file; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public File getFile() { 
     return file; 
    } 

    public void setFile(File file) { 
     this.file = file; 
    } 
} 

직렬화 복원 코드 :

ObjectInputStream objectInputStream = new ObjectInputStream(in); 
     Message message = (Message)objectInputStream.readObject(); 
     objectInputStream.close(); 
     String fileText = ""; 
     FileReader fileReader = new FileReader(message.getFile()); 
     BufferedReader br = new BufferedReader(fileReader); 
     fileText = br.readLine(); 

내가이 일을하려고, 내가 FileNotFoundException이 얻을. 도와주세요. 고맙습니다.

+0

어떻게 직렬화 하시겠습니까? – pirho

+1

'File' 객체는 경로를 통해 접근 할 수있는 파일이나 디렉토리의 내용이 아닌 경로 * 이름 *을 나타냅니다. 그게 바로 당신이 보는 것입니다. 대신에 내용을 원한다면 적절한 형식의 필드, 아마도'byte []','char []'또는'List '을 선언하십시오. 당신은 아마 하나 또는 다른 것을 원할 것입니다. '파일'과 내용 모두가 아닙니다. –

+0

@pirho'메시지 message = 새 Message(); System.out.println ("파일 경로 설정 :"); String path = scanner.nextLine(); message.setFile (새 파일 (경로)); message.setId ((int) (Math.random() * 10)); ObjectOutputStream objectOutputStream = 새로운 ObjectOutputStream (출력); objectOutputStream.writeObject (message); objectOutputStream.flush(); objectOutputStream.close(); ' –

답변

1

File은 파일의 추상 표현입니다. 기본적으로 실제 파일의 경로입니다. 당신은 직렬화 할 수없고, 네트워크에서 보내고, 파일의 실제 바이트가있는 것처럼 행동 할 수 없습니다.

실제로 파일에서 바이트를 읽고 네트워크를 통해 전송해야합니다. 작은 파일로 작업하는 경우 Filebyte[] (아마도 파일 이름이나 다른 메타 데이터를 추가 할 수 있음)으로 바꾸고 작업 할 수 있습니다.

큰 파일로 작업하는 경우 메모리 요구량이 너무 커지면 일련 화 이외의 다른 작업을 고려해야합니다.

+0

Ok, ty. 지금 그것의 명확한. 하지만 래퍼는 어떻게 사용할 수 있습니까? 그게 정말로 필요합니다. –

+0

Message 클래스에 바이트 순차 처리기가 필요합니다. –

+0

래퍼? 너 무슨 소리 야? – Kayaman

관련 문제