2010-04-27 108 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"); 
     }