Java: сохранить файл в два разных файла - объясните, пожалуйста, решение - PullRequest
0 голосов
/ 05 мая 2020

У меня проблема с одной из задач: Прочитать из консоли 3 имени файла: file1, file2, file3. Разделить файл: сохранить половину байтов в файл2, а вторую половину - в файл3. Если количество байтов меньше, сохраните больше байтов в file2. Закройте потоки.

Мне было интересно, как это решить, и единственное решение, которое работает правильно:

public class main {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String a = reader.readLine();
        String b = reader.readLine();
        String c = reader.readLine();

        FileInputStream fileInputStream1 = new FileInputStream(a);
        FileOutputStream fileOutputStream2 = new FileOutputStream(b);
        FileOutputStream fileOutputStream3 = new FileOutputStream(c);

        byte[] buffer = new byte[fileInputStream1.available()];

        if (fileInputStream1.available() % 2 != 0) {
            while (fileInputStream1.available() > 0) {
                int count = fileInputStream1.read(buffer);
                fileOutputStream2.write(buffer, 0, count / 2+1);
                fileOutputStream3.write(buffer, count / 2+1, count/2);
            }
        } else {
            while (fileInputStream1.available() > 0) {
                int count = fileInputStream1.read(buffer);
                fileOutputStream2.write(buffer, 0, count / 2);
                fileOutputStream3.write(buffer, count / 2, count/2);
            }
        }

        fileInputStream1.close();
        fileOutputStream2.close();
        fileOutputStream3.close();
    }
}

Мой вопрос: почему мне нужно сохранять из count / 2 для подсчета / 2? Для меня это не имеет никакого смысла. Если я буду использовать числа, предположим, что файл file1 имеет 100 байт. Я сохраняю от 0 до count / 2 (100/2 = 50) и от count / 2 до count / 2 (от 100/2 = 50 до 100/2 = 50 или даже 50/2 = 25). На мой взгляд, это должно быть от 0 до count / 2 и от count / 2 до count или buffer.length

Пожалуйста, объясните мне, почему мои решения неверны по сравнению с правильным. Спасибо.

1 Ответ

0 голосов
/ 05 мая 2020

Вот объяснение. Первая программа создает читатель буфера, источником которого является ввод с клавиатуры. Затем программа читает строку за строкой и сохраняет результаты в соответствующих строках. Затем программа создает потоки для чтения и записи в файлы (так называемые файловые потоки). После этого все байты из входного файла считываются и помещаются в массив байтов буфера. Сначала нам нужно проверить, четный или нечетный номер байта в файле, а затем выполнить соответствующие действия по копированию байтов в массивы. При копировании массива буферов имейте в виду, что диапазон является исключающим в конце и включающим в начале, например, Arrays.copyOfRange (buffer, 0, buffer.length / 2) копирует байты в этот интервал [0, buffer.length / 2>. Теперь нам нужно только записать байты в соответствующие файлы. Надеюсь, это поможет.

       public static void main(String[] args) throws IOException  {

       BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        String inputFile = reader.readLine();
        String outFile2 = reader.readLine();
        String outFile3 = reader.readLine();

        FileInputStream  fileInputStream1  = new FileInputStream(inputFile);
        FileOutputStream fileOutputStream2 = new FileOutputStream(outFile2);
        FileOutputStream fileOutputStream3 = new FileOutputStream(outFile3);

        byte[] buffer = Files.readAllBytes(Paths.get(inputFile));
        byte[] bytesForOut2, bytesForOut3;

        if(buffer.length % 2 == 0) {
            bytesForOut2 = Arrays.copyOfRange(buffer, 0, buffer.length / 2);
            bytesForOut3 = Arrays.copyOfRange(buffer, buffer.length /2, buffer.length);
        }
        else {
            bytesForOut2 = Arrays.copyOfRange(buffer, 0, buffer.length / 2 + 1);
            bytesForOut3 = Arrays.copyOfRange(buffer, buffer.length /2 + 1, buffer.length);
        }

        fileOutputStream2.write(bytesForOut2);
        fileOutputStream3.write(bytesForOut3);

        fileInputStream1.close();
        fileOutputStream2.close();
        fileOutputStream3.close();

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...