Написал программу, которая расщепляет файл любого размера с буферизацией. У меня на машине разделила файл 1.2Гб за 35 секунд. Но валидатору что-то не нравится, якобы программа работает слишком долго. На маленький файлах все работает за миллисекунды, очевидно. Где тут ошибка или как скормить такое решение валидатору? Спасибо.
package com.javarush.task.task18.task1808;
/*
Разделение файла
*/
import java.io.*;
public class Solution {
final static int BUFFER_SIZE = 1024 * 10; //Размер буфера
public static void main(String[] args) throws IOException {
//Читаем имена файлов
String fileName1 = null, fileName2 = null, fileName3 = null;
try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
fileName1 = reader.readLine();
fileName2 = reader.readLine();
fileName3 = reader.readLine();
} catch (IOException e) {
System.out.println("Ошибка ввода имени файла");
}
long halfOfFile = (new File(fileName1).length() + 1) / 2; //Кол-во байт которое нужно записать во второй файл
File file2 = new File(fileName2);
//Создаем потоки с нашим размером буфера
BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(fileName1), BUFFER_SIZE);
BufferedOutputStream outputStream1 = new BufferedOutputStream(new FileOutputStream(fileName2), BUFFER_SIZE);
BufferedOutputStream outputStream2 = new BufferedOutputStream(new FileOutputStream(fileName3), BUFFER_SIZE);
long startTime = System.currentTimeMillis(); //Для замера скорости работы программы
byte[] buffer = new byte[BUFFER_SIZE]; //массив, куда записываются считанные байты
int count; //кол-во байт которое вернул метод read
while ((count = inputStream.read(buffer)) != -1) {
if (file2.length() + count < halfOfFile) outputStream1.write(buffer, 0, count);
else if (file2.length() < halfOfFile) {
long length = file2.length();
outputStream1.write(buffer, 0, (int) (halfOfFile - length));
outputStream1.flush();
outputStream2.write(buffer, (int) (halfOfFile - length), (int) (count - (halfOfFile - length)));
}
else outputStream2.write(buffer, 0, count);
}
outputStream1.flush();
outputStream2.flush();
//для тестирования выводим время и кол-во байт во всех трех файлах
long endTime = System.currentTimeMillis();
System.out.println("Время на чтение и запись: " + (endTime - startTime)/1000 + " сек");
System.out.println("Размер исходного, 1-го и 2-го файла " +
new File(fileName1).length() + " " + new File(fileName2).length() + " " + new File(fileName3).length());
inputStream.close();
outputStream1.close();
outputStream2.close();
}
}
package com.javarush.task.task18.task1808;
/*
Разделение файла
*/
import java.io.*;
public class Solution {
final static int BUFFER_SIZE = 1024 * 10; //Размер буфера
public static void main(String[] args) throws IOException {
//Читаем имена файлов
String fileName1 = null, fileName2 = null, fileName3 = null;
try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
fileName1 = reader.readLine();
fileName2 = reader.readLine();
fileName3 = reader.readLine();
} catch (IOException e) {
System.out.println("Ошибка ввода имени файла");
}
long halfOfFile = (new File(fileName1).length() + 1) / 2; //Кол-во байт которое нужно записать во второй файл
File file2 = new File(fileName2);
//Создаем потоки с нашим размером буфера
BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(fileName1), BUFFER_SIZE);
BufferedOutputStream outputStream1 = new BufferedOutputStream(new FileOutputStream(fileName2), BUFFER_SIZE);
BufferedOutputStream outputStream2 = new BufferedOutputStream(new FileOutputStream(fileName3), BUFFER_SIZE);
long startTime = System.currentTimeMillis(); //Для замера скорости работы программы
byte[] buffer = new byte[BUFFER_SIZE]; //массив, куда записываются считанные байты
int count; //кол-во байт которое вернул метод read
while ((count = inputStream.read(buffer)) != -1) {
if (file2.length() + count < halfOfFile) outputStream1.write(buffer, 0, count);
else if (file2.length() < halfOfFile) {
long length = file2.length();
outputStream1.write(buffer, 0, (int) (halfOfFile - length));
outputStream1.flush();
outputStream2.write(buffer, (int) (halfOfFile - length), (int) (count - (halfOfFile - length)));
}
else outputStream2.write(buffer, 0, count);
}
outputStream1.flush();
outputStream2.flush();
//для тестирования выводим время и кол-во байт во всех трех файлах
long endTime = System.currentTimeMillis();
System.out.println("Время на чтение и запись: " + (endTime - startTime)/1000 + " сек");
System.out.println("Размер исходного, 1-го и 2-го файла " +
new File(fileName1).length() + " " + new File(fileName2).length() + " " + new File(fileName3).length());
inputStream.close();
outputStream1.close();
outputStream2.close();
}
}