2017-10-23 16 views
0

My class MessageはFileのクラスラッパーです。 deserializeしてFileを取得するよりも、Messageをシリアル化してサーバーに送信したい。しかし、私はデシリアライズすると、私はファイル名だけを取得?私は何を間違っているのですか?参照するオブジェクトでフィールドをシリアル化するにはどうすればよいですか?

クラスラッパー:

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'オブジェクトはパス* name *を表し、そのパスを介してアクセス可能なファイルまたはディレクトリの内容は表しません。それはまさにあなたが見るものです。代わりにコンテンツを必要とする場合は、適切な型のフィールド、おそらく 'byte []'、 'char []'、あるいは 'List 'を宣言してください。あなたはおそらくどちらか一方だけを望むでしょう。 「ファイル」とコンテンツの両方ではありません。 –

+0

@pirho 'メッセージメッセージ=新しいメッセージ(); 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

よ、ty。今、その明確な。しかし、どのように私はラッパーを使用できますか?本当に必要です。 –

+0

メッセージクラスにバイトシーケンスハンドラが必要です。 –

+0

ラッパー?あなたは何について話していますか? – Kayaman

関連する問題