2015-03-07 2 views
0

Метод разделения принимает два аргумента, имя файла для разделения и размер каждого разделения. Не могли бы вы проверить, нахожусь ли я на дорожке записи? А псевдокод о том, что положить в цикл for?Сплит двоичный файл

import java.io.*; 

public class SplitFile { 

    public static void main(String[] args) throws IOException { 
     Split("testfile.pdf", 256); 

    } 

    public static Split(String filename, int splitSize) throws IOException { 

     int numberOfFiles = 0; 

     File file = new File(filename); 

     numberOfFiles = ((int) file.length()/splitSize) + 1; 

     for (; numberOfFiles >= 0; numberOfFiles--) { 

      DataInputStream in = new DataInputStream(new BufferedInputStream(
        new FileInputStream(filename))); 

      DataOutputStream out = new DataOutputStream(
        new BufferedOutputStream(new FileOutputStream(file))); //What do I put here? 

     } 


    } 

} 
+1

Добро пожаловать в Переполнение стека! Пожалуйста, отредактируйте свой вопрос, чтобы объяснить, что вы ищете: шаблоны имен файлов? код для открытия нового выходного потока? или что? Спасибо за улучшение ссылочного значения вопроса и привлечение его к ответственности! –

+0

@NathanTuggy Ну для начала я не знаю, нахожусь ли я на правильном пути. Я просто собрал код, который я нашел на этом сайте. Java IO имеет так много классов! И я зациклился на том, как действовать дальше. Псевдокод будет полезен. – Andrew

ответ

1

необходимых изменения объекта

  • файла на выходную часть, например
  • Initialize входные данные потока вне цикла, а не внутри

Код

File original = new File(filename); 
int numberOfFiles = ((int) original.length()/splitSize) + 1; 

DataInputStream in = 
    new DataInputStream(new BufferedInputStream(new FileInputStream(filename))); 

// <== just count through parts. 
for (int i = 0; i < numberOfFiles; i++) { 
    File output = new File(String.format("%s-%d", filename, i)); 
    // <== Part of file being output e.g. testfile.pdf-1, testfile.pdf-2 

    DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(output))); 

} 

Для фактического написания ...

  • прочитанных байт из входного потока с помощью чтения вызова()
  • записать байты в выходной поток, используя вызов write()

Два подхода, по одному байту за один раз - проще всего, но менее эффективны или используют буфер, сложнее кодировать, но более эффективны.

буферизацией подход

long length = original.length(); 

DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(filename))); 

int pos = 0; 
byte[] buffer = new byte[splitSize]; 
for (...) { 
    ... 

    // make sure you deal with file not being exactly divisible, 
    // last chunk might be smaller 
    long remaining = length - pos; 
    in.read(buffer, pos, (int) Math.min(splitSize, remaining)); 
    out.write(buffer, 0, (int) Math.min(splitSize, remaining)); 

    pos += splitSize; 
} 

1 байт за один раз.

for (...) { 
    ... 
    for (int i = 0; i < splitSize && pos < length; i++) { 
     out.write(in.read()); 
     pos++; 
    } 
} 
1

Вы можете сделать это с использованием Java NIO API следующим образом.

import java.io.IOException; 
import java.nio.channels.FileChannel; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.StandardOpenOption; 

public final class SplitFile { 

    public static void main(String[] args) throws IOException { 
     split("testfile.pdf", 256); 
    } 

    private static void split(String filename, int splitSize) throws IOException { 
     int i = filename.lastIndexOf('.'); 
     String basename = filename.substring(0, i); 
     String ext = filename.substring(i + 1); 

     Path inputPath = Paths.get(filename); 

     int numberOfFiles = (int) (Files.size(inputPath)/splitSize) + 1; 

     try (FileChannel inputChannel = FileChannel.open(inputPath, StandardOpenOption.READ)) { 
      for (int j = 0; j < numberOfFiles; j++) { 
       String outputFilename = String.format("%s-%04d.%s", basename, j + 1, ext); 

       Path outputPath = inputPath.getParent().resolve(outputFilename); 

       try (FileChannel outputChannel = FileChannel.open(outputPath, StandardOpenOption.CREATE, StandardOpenOption.WRITE)) { 
        inputChannel.transferTo(j * splitSize, splitSize, outputChannel); 
       } 
      } 
     } 
    } 
} 
Смежные вопросы