[英]Check file size while writing file and create new file
我正在嘗試編寫 java 代碼來編寫“.dat”文件。 書寫時,還要檢查尺寸。 每 200 KB 創建新的“.dat”文件並繼續寫入文件。 有什么辦法可以做到嗎?
當文件大於 200KB 時,創建一個這樣的新文件:
第一個文件名:1_filename
第二個文件名:2_filename
第三個文件名:3_filename
...
或者如果只創建了一個文件(意味着它小於 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)
我建議你創建一個單獨的類,它的唯一工作是創建文件(按順序),將數據寫入文件,注意大小,並根據需要關閉/打開文件。 這將使您的代碼更有條理 - 您將能夠更清楚地看到您的錯誤。 該類將具有以下方法:
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: }
關閉文件后,下一次寫入文件的嘗試將失敗 - 這就是您看到的錯誤。
從 Java 8(或者 Java 7)開始,有一種更好的方法來檢查文件大小(並采取相應的措施)
if(Files.size(Paths.get(csvFile.toURI())) > 3000000 ){
// Create a new file at same path and use from next time - if current file is greater than X MB
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.