2013-07-10 78 views
-1

試圖編寫java代碼來編寫「.dat」文件..同時檢查大小以及..每200 KB創建新的「.dat」繼續寫入文件。有什麼辦法,我能做到這一點..Java自動創建新文件取決於文件大小

當文件超過200KB,並創建新的文件名這樣

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

,或者如果文件只創建一個文件,意味着小於200KB比

Filenamd ..文件名,如代碼..

我寫的代碼寫入文件,但..其唯一的書寫2個文件..這不是做正確的方式..

她e是我的代碼..

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) 
+6

您需要告訴我們哪一行導致異常xmlfile1filebytes.java:65。另外,我編輯了你的問題,刪除了一些不必要的乞討。 –

回答

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:  } 

一旦你關閉了文件,你的下一個嘗試寫它會失敗 - 這就是你所看到的錯誤。

0

你做datfile.close(),並在下一個循環通過for循環你.append()它。您必須初始化(即打開) 內部的 for循環。

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,則不需要附加任何後綴(請參閱,如果塊)。否則,您追加後綴然後寫入該文件。該字符串由局部變量給出給出。您已經讀取了整個文件並存儲了actualBytes中的字節。希望這更有意義。

+0

對不起,我仍然沒有得到它..你能否擴大我請..幫助我..謝謝! – user2559055

+0

看看_edit_更有意義。 – bsd

+0

嘿,我試過了,但它仍然只創建了439 KB的一個文件..它應該創建3個文件嗎?請幫幫我!!先謝謝了!!我編輯該代碼..請檢查...並幫助我! – user2559055