0

while ループを使用してコンソールと html ファイルの両方に出力するプログラムがあります。ただし、コンソールに出力されても、プログラムは最終行のみを html ファイルに出力します。これは、9行目から16行目までのテキストファイルから抽出された情報を出力することになっているループのコードです。

  //read the txt file
Path objPath = Paths.get("dirsize.txt");  
if (Files.exists(objPath))
{

    File objFile = objPath.toFile();
  try(BufferedReader in = new BufferedReader(
                          new FileReader(objFile)))
   {
    String line = in.readLine();
    int lineNum = 1;
    //extract the month
    String monthSubstring = line.substring(25,27);
    month = Integer.parseInt(monthSubstring) -1 ;
    //extact the year
    String yearSubstring = line.substring(31,35);
    year = (Integer.parseInt(yearSubstring));
    //extract the date
    String daySubstring = line.substring(28,30);
    day = Integer.parseInt(daySubstring);
     PrintWriter out = new PrintWriter (new BufferedWriter(new FileWriter("Output.html")));
    while(line != null)
    {
      line = in.readLine();
      lineNum ++;
      if (lineNum == 3)
       {
           //extract the hour
            String hourSubstring = line.substring(21,23);
             hour = Integer.parseInt(hourSubstring); 
            //extract the minute
            String minuteSubstring = line.substring(24,26);
             minute = Integer.parseInt(minuteSubstring);
            //extract the second
            String secondSubstring = line.substring(27,29);
            second= Integer.parseInt(secondSubstring);
           }
      if(lineNum ==5)
       {
            //Extract the branch
            strBranch = line.substring(22, 27);        
       }        
      if (lineNum == 6)
      {
             //Extract the computer
             strCPU = line.substring(26,32);
      }   
     if (lineNum >= 9 && lineNum <= 16)
      {
          //call the MyDirectory methods to get the files name,size and number of files
          MyDirectory directory = new MyDirectory(line);
          fileName = directory.getName();
          fileSize = directory.getsize();
          fileNum = directory.getNum();
          //create the dteDate calender
          GregorianCalendar dteDate = new GregorianCalendar(year, month, day, hour, minute, second);
          //fromat the date
          SimpleDateFormat strDate = new SimpleDateFormat("MMM dd, yyyy h:m");
        //Write the data to the file
         out.println((strBranch + "; " +
                  strCPU + "; "  + 
                  strDate.format(dteDate.getTime())) + "; " +
                  fileName + "; " +
                  fileSize + "; " + 
                  fileNum);
         //create the necessary output for the console
          System.out.println((strBranch + "; " +
                  strCPU + "; "  + 
                  strDate.format(dteDate.getTime())) + "; " +
                  fileName + "; " +
                  fileSize + "; " + 
                  fileNum);
        }    
       out.flush();
    }

   }   

  //catch any IOExceptions and print out e
 catch (IOException e)
  {
    System.out.println(e);  
  }

}

編集:回答に投稿されたアドバイスにより、すべての出力が得られましたが、フォーマットするのに苦労しています.htmlファイルにはすべての行があり、出力の最後に「\ n」を使用してみましたが、コードnullは許可されていないため、コンパイルされません.printメソッドの最後に「\ n」を配置できない場合、これを行にフォーマットする方法を知っている人はいますか?

これがコードが多すぎるのか、問題を解決するのに十分でないのかはわかりません。投稿に何かを追加したり、何かを削除したりする必要がある場合は、お知らせください。

4

2 に答える 2

3

これは明らかです - while ループが繰り返されるたびにファイルを作成します (以下を参照)。

             PrintWriter out = new PrintWriter (
                           new BufferedWriter(
                           new FileWriter("Output.html")));
        //Write the data to the file
         out.println((strBranch + "; " +
                  strCPU + "; "  + 
                  strDate.format(dteDate.getTime())) + "; " +
                  fileName + "; " +
                  fileSize + "; " + 
                  fileNum);
        //flush the data and close the output stream
         out.close();

代わりに while ループに入る前にファイルを作成する必要があります。

したがって、コードは次のようになります。

     PrintWriter out = new PrintWriter (new BufferedWriter(new FileWriter("Output.html")));
     while(line != null)
    {
        //perform your file operations here
    }
    out.close();

- - 編集 - -

コードを更新しましたが、それでも問題ありません。2 番目のループ内でファイルを閉じます。

        (...)
 while (lineNum >= 9 && lineNum <= 16)
  {
      //call the MyDirectory methods to get the files name,size and number of files
      MyDirectory directory = new MyDirectory(line);
      fileName = directory.getName();
      fileSize = directory.getsize();
      fileNum = directory.getNum();
      //create the dteDate calender
      GregorianCalendar dteDate = new GregorianCalendar(year, month, day, hour, minute, second);
      //fromat the date
      SimpleDateFormat strDate = new SimpleDateFormat("MMM dd, yyyy h:m");
    //Write the data to the file
     out.println((strBranch + "; " +
              strCPU + "; "  + 
              strDate.format(dteDate.getTime())) + "; " +
              fileName + "; " +
              fileSize + "; " + 
              fileNum);
    //flush the data and close the output stream
     //################# YOU CLOSE YOUR FILE HERE:
     out.close();
     //create the necessary output for the console
      System.out.println((strBranch + "; " +
              strCPU + "; "  + 
              strDate.format(dteDate.getTime())) + "; " +
              fileName + "; " +
              fileSize + "; " + 
              fileNum);
     //move on in the loop so it's not infinte
      break;
   }    
}

このループが次に繰り返されると、ファイルへの書き込みを試みます (そして、前の繰り返しで閉じられたにもかかわらず、もう一度閉じます)。

于 2013-04-20T23:51:52.717 に答える
0

書き込むたびにファイルを上書きしているため、出力ファイルには 1 行しか表示されません。

while(linenum >=9 && linenum <=16) ループ内で PrintWriter を作成する必要がある場合は、追加モードでファイルを開きます。

new FileWriter("Output.html", true);

あなたの問題を解決します。

于 2013-04-20T23:55:17.177 に答える