0

計算されたデータ レートの出力をファイルに保存しようとしています。データ レートは整数型で、ファイルに保存できず、次のエラーが発生します。

Exception in thread "main" java.io.IOException: Write error
at java.io.FileOutputStream.write(Native Method)
at java.io.DataOutputStream.write(Unknown Source)
at UDPSend.main(UDPSend.java:60)

コードは次のとおりです。

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;


public class UDPSend {


public static void main(String[] args) throws IOException
{
    FileInputStream fstream = new FileInputStream("T.txt");
    DataInputStream in = new DataInputStream(fstream);
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
    String path="DataRateBefore.txt";
    FileOutputStream f = new FileOutputStream(path);
    DataOutputStream fo = new DataOutputStream (f);
    InetAddress addr = InetAddress.getByName("localhost");
    byte[]  buf  = new byte[10000];

    String DataLine;
    long lastTime = System.currentTimeMillis();
    long firstTime = lastTime;
    int nobits = 0;

    long start = System.currentTimeMillis();
    System.out.println("Start Time: " + start);

    while ((DataLine = br.readLine()) != null)  
    { 
      DatagramPacket packet =new DatagramPacket(DataLine.getBytes(),DataLine.length() , addr, 4553);
      System.out.println (DataLine);
      DatagramSocket socket = new DatagramSocket();
      socket.send(packet);

      nobits+=packet.getLength() * 8;
      System.out.println(packet.getLength());
      System.out.println("no of bits is:");
      System.out.println(nobits);



      if ((System.currentTimeMillis() - lastTime) > 11) 
      {
         lastTime = System.currentTimeMillis();
         System.out.println("data rate is ");
         System.out.println(nobits); 
         fo.write(nobits);
         nobits= 0;
         fo.close();
         fo.flush();
      }

  }//end while loop

  // Get the end time of the process
    long end = System.currentTimeMillis();
    System.out.println("End Time : " + end);
    long elapsedTime = end - start;
  // Show how long it took to finish the process
    System.out.println("The process took approximately: " + elapsedTime + " milliseconds");
  }//end main method 
 }

誰でもこれを解決するのを手伝ってもらえますか?

4

3 に答える 3

2

ストリームを閉じたら、それ以上操作を実行しないでください。検討:

fo.close(); 
fo.flush(); 

少なくとも、これら 2 つの行を交換する必要があります。また、foループの他の繰り返しで書き込むことができるように再度開くか、ループの途中で閉じないでください (ただし、ループが終了した後)。

于 2012-05-15T14:43:19.973 に答える
1

ファイルに書き込んだ後にファイルを閉じてから、もう一度書き込もうとしたためですか?while ループの後に fo.close() を配置してみてください。

于 2012-05-15T14:42:11.107 に答える
0

この方法であなたはファイルを保存することができます。ソースディレクトリからデスティニーディレクトリに読み取るメソッド。

    static public void movArchivo(File sourceDir, File destinyDir) {
    InputStream in = null;
    OutputStream out = null;

    byte[] buffer = new byte[1024];
    int len;

    try {
        in = new FileInputStream(sourceDir);
        out = new FileOutputStream(destinyDir);

        while((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }
        out.flush();
    } catch(FileNotFoundException e) {
        System.out.println("Sistem not found file: " + sourceDir.getAbsolutePath() + " or not existed path.");
    } catch(IOException e) {
        System.out.println("ERROR reading file. " + e.getMessage());
        e.printStackTrace();
    } finally {
        if(in != null) {
            try {
                in.close();
                sourceDir.delete();
                out.close();
            } catch(Exception e2) {
                e2.printStackTrace();
            }
        }
    }
}

お役に立てば幸いです。:)

于 2012-05-15T14:57:05.940 に答える