さて、私はJavaプログラムを使用して2つのクラス(aFileSender
とFileReceiver
)間のソケット接続を開始するプロジェクトに取り組んでいます。私の基本的な考え方は、FileSender
次のようになるというものでした。
try {
writer = new DataOutputStream(connect.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//While we have bytes to send
while(filein.available() >0){
//We write them out to our buffer
writer.write(filein.read(outBuffer));
writer.flush();
}
//Then close our filein
filein.close();
//And then our socket;
connect.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
コンストラクターには、ファイルが存在するかどうか、ソケットが接続されているかどうかなどを確認するコードが含まれています。私のFileReaderの中にはこれがあります:
input = recvSocket.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(input.getInputStream()));
FileOutputStream fOut= new FileOutputStream(filename);
String line = br.readLine();
while(line != null){
fOut.write(line.getBytes());
fOut.flush();
line = br.readLine();
}
System.out.println("Before RECV close statements");
fOut.close();
input.close();
recvSocket.close();
System.out.println("After RECV clsoe statements");
すべてtry-catchブロック内にあります。だから、私がやろうとしているのはFileSender
、ファイルを読み取り、バイトに変換し、送信してフラッシュすることです。 FileReceiver
、次にバイトを読み込み、fileOutに書き込み、フラッシュし、さらに待機し続けます。開いたものはすべて閉じるようにしているので...ここに奇妙な部分があります。
作成したテキストファイルをEclipseで開こうとすると、「SWTエラーが発生しました...ワークベンチを終了することをお勧めします...詳細については.logを参照してください。」と表示されます。「未処理のイベントループ例外(これ以上ハンドルはありません)」という別のウィンドウがポップアップ表示されます。ただし、送信されたテキストファイルをnotepad2で開こうとすると、次のようになります。
ThisIsASentTextfile
これは良いことです(まあ、改行があるはずだという事実を除いて、私はそれに取り組んでいます...)。なぜこれが起こっているのか誰かが知っていますか?そして、チェックしている間に、改行を追加する方法は?
(そして、これは他のライブラリを取得せずにJava経由でファイルを転送するための特に悪い方法ですか?)
編集:更新:送信者を変更せずに、コードを次の(FileReceiver)に変更しました:
try {
input = recvSocket.accept();
//InputStream br = new InputStream(input.getInputStream());
FileWriter fOut= new FileWriter(filename);
//BufferedWriter out = new BufferedWriter(fOut);
//String line = br.
byte info = (byte) input.getInputStream().read();
while((int)info != 0){
fOut.write(info);
fOut.flush();
info = (byte) input.getInputStream().read();
}
fOut.flush();
System.out.println("Before RECV close statements");
fOut.close();
//input.close();
recvSocket.close();
System.out.println("After RECV clsoe statements");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
これは機能します。バイト単位で適切なサイズ(4Kbの標準サイズを取得する前)で、適切なフォーマットのテキストファイルを取得します。次の画像で試してみて、最新情報をお届けします。