2010-04-27 104 views
1

好的,所以我正在使用Java程序啓動兩個類之間的套接字連接(FileSenderFileReceiver)的項目。我的基本想法是,FileSender是這樣的:在Java中使用FileOutputStream創建和寫入文件

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,轉換爲字節,發送並清除它。然後讀取字節,寫入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(); 
    } 

This works。我得到一個正確大小的文本文件(在獲得4Kb標準大小之前),並且格式正確。我將在下一張圖片上嘗試它,並讓您更新。

+1

嘗試在十六進制編輯器打開創建的文本文件,看看是否有可能是怪異的字節導致Eclipse的問題。 – 2010-04-27 16:23:20

回答

1

乍一看:你爲什麼用DataOutputStream? 完全不適合你的目標。只需使用你提供的OutputStream:

writer = connect.getOutputStream(); 

順便說一句,這是值得懷疑的做法叫「作家」這個變量,Java使得讀/寫器(面向字符)和流(面向字節)之間的明確概念上的差異。

更新:另一個不好的做法,它要求麻煩:你不必要地混合讀取器/寫入器(字符導向)和流(字節導向) - 並且沒有指定字符集編碼。

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

當你與文字處理(在知道編碼)必須使用一個閱讀器,使用的InputStream如果你只是處理字節。

+1

習慣。我在我的程序的其餘部分使用DOS(他們工作的很好),所以我在這裏也使用了一個。 *去查找差異...你知道的越多,對嗎?* – Althane 2010-04-27 16:26:27

+0

@Althane,+1表示斜體位 – Pops 2010-04-27 16:44:42

+0

因此,leonbloy,我需要一些說明。這是否意味着在這兩個類(FileSender和FileReceiver)中,我應該使用相同的輸入/輸出設備(讀寫器或流?)。由於我現在正在使用它,所以它似乎會讀取文本文件的內容,並將其打印到「副本」文件中。但我不確定這將如何改變與流。 對不起,我很困惑,這是一個我從未見過的話題..所以是啊.. – Althane 2010-04-27 17:14:25

0

關於換行符,BufferedReader.readLine()讀取由換行符終止的數據,但它不返回換行符。所以,當你寫回來時,你會想寫一個換行符。或者,您可以讀取和寫入字節,因此不會錯誤地轉換換行符或損壞的包含換行符或回車符的ascii值的二進制文件。

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"); 
     }