2013-07-10 42 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