2013-07-10 2 views
-1

Попытка написать код Java для записи файла «.dat» .. При одновременном откручивании контрольного размера .. каждые 200 КБ создайте новый «.dat», продолжайте писать файл. Есть ли способ, что я могу сделать ..Java Создать новый файл автоматически зависит от размера

когда файл более 200 КБ и создать новое одно имя файла, как этот

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

или если файл создать только один файл, тем меньше, чем 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) 
+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(), а на следующей итерации через петлю вы получаете .append(). Вам необходимо будет инициализировать (то есть открыть) datfileвнутри цикла.

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(); 
    } 

Edit: Делает ли это смысл?

Вот суть. Цикл for выполняет итерацию в размере блока BLOCK_SIZE (200 КБ). Если размер файла меньше BLOCK_SIZE, вам не нужно добавлять суффиксы (см. , если блок). Еще вы добавите суффикс , а затем напишите файл. Строка задается локальной переменной для записи. Вы уже прочитали весь файл и сохранили байты в actualBytes. Надеюсь, это имеет больше смысла.

+0

Прошу прощения, я все еще не понял. Можете ли вы мне больше рассказать ... помогите мне .. спасибо! – user2559055

+0

Посмотрите, имеет ли смысл _edit_. – bsd

+0

Эй, я пробовал это, Но он все еще создавал только 1 файл с 439 КБ .. он должен был создать 3 файла правильно? Пожалуйста, помогите мне!! Заранее спасибо!! Я редактирую этот код .. пожалуйста, проверьте это .. и помогите мне пожалуйста! – user2559055

Смежные вопросы