1

さて、私はJavaプログラムを使用して2つのクラス(aFileSenderFileReceiver)間のソケット接続を開始するプロジェクトに取り組んでいます。私の基本的な考え方は、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の標準サイズを取得する前)で、適切なフォーマットのテキストファイルを取得します。次の画像で試してみて、最新情報をお届けします。

4

3 に答える 3

1

一見したところ:なぜDataOutputStreamを使用しているのですか?あなたの目標には完全に不十分です。提供された出力ストリームを使用するだけです。

writer = connect.getOutputStream();

ところで、その変数を「ライター」と呼ぶのは疑わしい慣習です。Javaは、リーダー/ライター(文字指向)とストリーム(バイト指向)の間に明確な概念上の違いをもたらします。

更新:問題を引き起こすもう1つの悪い習慣:リーダー/ライター(文字指向)とストリーム(バイト指向)を不必要に混合している-そして文字セットエンコーディングを指定せずに。

BufferedReader br = new BufferedReader(new InputStreamReader(input.getInputStream()));

(既知のエンコーディングで)テキストを処理する場合はReaderを使用する必要があり、バイトのみを処理する場合はInputStreamを使用する必要があります。

于 2010-04-27T16:23:33.153 に答える
1

エクスポート/保存後にレポートを開きたい場合、これは間違いなく機能します

       JasperReportBuilder report = DynamicReports.report();// a new report
       report.setDataSource(dataSource);

        String path = "d:\\PriceReport"+Math.random()+".pdf";
        File generatedfile= new File(path);
        FileOutputStream fileOutStream = new FileOutputStream(generatedfile);
        report.toPdf(fileOutStream);
        fileOutStream.close();
        fileOutStream.flush();
         if(generatedfile.exists()){
             if(Desktop.isDesktopSupported()){
                Desktop.getDesktop().open(generatedfile);
             }else{
                System.out.println("Not Supported by your desktop");
             }
         }else{
             System.out.println("File does not Exists");
         }
于 2016-04-14T09:55:02.107 に答える
0

Regarding line breaks, BufferedReader.readLine() reads data, terminated by a line feed, but it doesn't return the line feed. So, when you write it back out, you'll want to write a line feed. Alternatively, you can read and write bytes, so you don't end up mistakenly converting line feed characters or corrupting binary files that include the ascii values for line feed or carriage return.

于 2010-04-27T16:43:09.800 に答える