0

「.dat」ファイルを書き込む Java コードを書き込もうとしています.サイズをチェックしながら..200 KB ごとに新しい「.dat」を作成し、ファイルを書き続けます。私がそれを行うことができる方法はありますか..

200KBを超えるファイルを作成し、このような新しいファイル名を作成する場合

1st file name.. 1_filename 
2nd file name.. 2_filename
3rd file name.. 3_filename........

または、ファイルが 1 つのファイルのみを作成する場合、200KB 未満を意味します

Filenamd.. コード内のファイル名..

私はファイルを書き込むコードを書きましたが..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

3 に答える 3

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-10T13:28:37.033 に答える
0

さて、簿記の問題のように見えます。

これがどのように見えるかです

    .
    .
    . 
    long datfilesize = datfileinfolder.length();;
    final int BLOCK_SIZE = 200 * 1024;
    for (int curBlock = 0; curBlock < actualBytes.length; curBlock += BLOCK_SIZE) {
        String toWrite = new String(
            Arrays.copyOfRange(actualBytes, curBlock, Math.min(curBlock + BLOCK_SIZE, actualBytes.length)
        );
        String suffix = "";
        if (curBlock > 0) {
            //append underscores other file information and then perform writes
            suffix =  String.valueOf(curBlock /  BLOCK_SIZE);
        }    

        //Your code more or less
        BufferedWriter datfile1 = null;
        String outdatfile1 = ("07072013\\" + suffix + timeStamp + ".dat");
        datfile1 = new BufferedWriter(new FileWriter(outdatfile1));


        datfile1.append(toWrite);
        datfile1.close(); 
    }

編集:これはもっと理にかなっていますか?

これが要点です。for ループは、BLOCK_SIZE (200 KB) のブロック サイズで繰り返されます。ファイル サイズが BLOCK_SIZE 未満の場合は、接尾辞を追加する必要はありません ( if ブロックを参照してください)。それ以外の場合は、サフィックスを追加してからファイルに書き込みます。文字列はローカル変数toWriteによって与えられます。すでにファイル全体を読み取り、バイトをactualBytesに格納しています。これがより理にかなっていることを願っています。

于 2013-07-10T13:40:39.187 に答える
0

あなたはそれdatfile.close()を実行し、次の for ループの繰り返しでそれを実行.append()します。for ループdatfile で初期化 (つまり、開く) する必要があります。

于 2013-07-10T13:31:05.060 に答える