在Java中从FileOutputStream创建和写入文件[英] Creating and writing file from a FileOutputStream in Java

问题描述

好吧,所以我正在研究一个项目,在该项目中,我使用Java程序来启动两个类(a FileSender和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");

全部在一个试用块中.因此,我要做的是在文件中读取FileSender读取,转换为字节,将其发送和冲洗. FileReceiver,然后在字节中读取,写入文件,冲洗并继续等待更多.我确保关闭我打开的所有内容,所以...这是奇怪的部分.

当我尝试在Eclipse中打开创建的文本文件时,它告诉我"发生了SWT错误...建议退出Workbench ...有关更多详细信息,请参见.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标准尺寸之前),并且具有正确的格式.我将接下来在图像上尝试一下,并让您更新.

推荐答案

乍一看:为什么要使用 dataoutputstream ? 完全不足以实现您的目标.只需使用您提供的输出流:

writer = connect.getOutputStream();

顺便说一句,称为"作者"是可疑的做法,Java在读者/作家(面向炭)和流(面向字节)之间有明显的概念差异.

更新:另一种不良练习,需要麻烦:您正在不必要地混合读者/作家(面向字节)和流(以字节为方面) - 并且没有指定字符集编码.

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

处理文本时必须使用读者(在知道编码中),如果您只是处理字节,请使用InputStream.

其他推荐答案

如果要在导出/保存后打开报告,则 这一定会起作用

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

其他推荐答案

关于线路断路,BufferedReader.Readline()读取数据,由线feed终止,但不会返回行供稿.因此,当您将其写回时,您需要编写一个线供稿.另外,您可以读取字节,因此您最终不会错误地转换线供稿字符或损坏包含线路馈送或运输返回的ASCII值的二进制文件.

本文地址:https://www.itbaoku.cn/post/978424.html