2

「.dat」ファイルを書き込む Java コードを作成しようとしています。サイズも確認しながら書きましょう。200 KB ごとに新しい「.dat」ファイルが作成され、ファイルの書き込みが続行されます。それを行う方法はありますか?

ファイルが 200KB を超える場合は、次のように新しいファイルを作成します。

1 番目のファイル名: 1_filename
2 番目のファイル名: 2_filename
3 番目のファイル名: 3_filename
...
または、ファイルが 1 つだけ作成される場合 (つまり、200KB より小さい場合):

ファイル名: ファイル名

私はコードを書きましたが、2 つのファイルしか書いていないので、それは正しい方法ではありません。

これが私のコードです:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class xmlfile1filebytes {

  public static void main(String[] args) throws IOException {
    
    File folder = new File ("07072013");
    File[] listOfFiles = folder.listFiles();
    
    System.out.println("There are " + listOfFiles.length + " files"); 
    String filesin;
    
    String timeStamp = new SimpleDateFormat("MM-dd-yyyy[HH.mm.ss]")
     .format(Calendar.getInstance().getTime());
     System.out.println(timeStamp);
     
    BufferedWriter xmlfile = null;
    BufferedWriter datfile = null;
  
    String outxmlfile = ("07072013\\" + timeStamp + ".xml");
    xmlfile = new BufferedWriter(new FileWriter(outxmlfile));
    
    String outdatfile = ("07072013\\" + timeStamp + ".dat");
    datfile = new BufferedWriter(new FileWriter(outdatfile));
    
    int offset = 0;
    int size = 0;

    for (int i = 0; i < listOfFiles.length; i++) {
       
        File f = listOfFiles[i];
        
       // System.out.println(i + " " + f.getAbsolutePath());
        if (f.isFile()) {

            filesin = listOfFiles[i].getName();

            if (filesin.endsWith("pdf")) {
               
                Path aPath = Paths.get(f.getAbsolutePath()); 
       
                System.out.println(filesin);
                
                byte[] actualBytes = Files.readAllBytes(aPath);
                size = actualBytes.length;
             
                xmlfile.append((i + 1) + ")" + " File = " + filesin + ", Offset = " + offset + ", Size = " + size + "\n");
               
           
                offset = offset + size;
                xmlfile.newLine();
            
                String s = new String(actualBytes);
            
                datfile.append(s);
                datfile.newLine();
                
                
                File datfileinfolder = new File ("07072013\\" + timeStamp + ".dat");
                
                long datfilesize = datfileinfolder.length();
                long datfilesizeinkb = datfilesize /1024;
                
                System.out.println(datfilesizeinkb);
                
                if (datfilesizeinkb >= 200) {
                     datfile.close();

                      BufferedWriter datfile1 = null;
                      String outdatfile1 = ("07072013\\" + "1_"+ timeStamp + ".dat");
                      datfile1 = new BufferedWriter(new FileWriter(outdatfile1));
                     
                      String s1 = new String(actualBytes);
                      datfile1.append(s1);
                      datfile1.close();
                }
                
                
             }
        }
    }
    
     xmlfile.close();
  }
}

ファイルが 400 KB を超えると、エラーが発生します。

エラー:

There are 10 files
07-09-2013[16.03.00]
1192970_eBill_20130709.pdf
96
1321470_eBill_20130709.pdf
208
1724897_eBill_20130709.pdf
Exception in thread "main" java.io.IOException: Stream closed
    at java.io.BufferedWriter.ensureOpen(Unknown Source)
    at java.io.BufferedWriter.write(Unknown Source)
    at java.io.Writer.write(Unknown Source)
    at java.io.Writer.append(Unknown Source)
    at xmlfile1filebytes.main(xmlfile1filebytes.java:65)
4

2 に答える 2

2

ファイルを(順番に)作成し、ファイルにデータを書き込み、サイズを監視し、必要に応じてファイルを閉じたり開いたりするだけの別のクラスを作成することをお勧めします。これにより、コードがより整理され、間違いをより明確に確認できるようになります。クラスには次のメソッドがあります。

setMax(maxVal)                 - set the maximum file size (default 400k)
setRoot(rootPath)              - folder where files will be created
setName(rootName)              - "format string" used to generate file names 
                                 (e.g. "myFile%03d.dat")
writeData(dataSize, dataBlock) - write data. If no file open, open it. 
                                 If file too big, split it.  
closeFile()                    - flush buffers, close the last file.
                                 Could be part of the destructor
currentFile()                  - returns name of current file (for debug)
currentSize()                  - returns current file size (for debug)

このクラスの書き方を理解できれば、最初の問題を解決し、同時に再利用できるものを手に入れることができます。

(ほとんど) 既に持っているコード構造を維持したい場合は、現在の 85 行目を削除することで解決できます。

         83:         String s1 = new String(actualBytes);
         84:         datfile1.append(s1);
         85:         datfile1.close();  <<<<<<<<<<< remove this line
         86:      }

ファイルを閉じると、そのファイルへの次の書き込みは失敗します。これが表示されているエラーです。

于 2013-07-09T20:09:31.407 に答える