Разделение файла

  • 20
  • Недоступна
Считать с консоли три имени файла: файл1, файл2, файл3. Разделить файл1 по следующему критерию: Первую половину байт записать в файл2, вторую половину байт записать в файл3. Если в файл1 количество байт нечетное, то файл2 должен содержать бОльшую часть. Закрыть потоки.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (389)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
An N
Уровень 20, Cheboksary, Russian Federation
6 августа, 07:26
Научите правильно закрывать потоки FileOutputStream fos = new FileOutputStream(fileName2); fos.write(...); fos.close(); // Здесь обязательно закрывать поток? fos = new FileOutputStream(fileName3); fos.write(...); fos.close(); После записи файла fileName2 я повторно использую переменную fos. Нужна ли первая строка fos.close() ? Программа работает и с одним закрытием потока и с двумя закрытиями. Но как делать правильно? Возможно fos = new FileOutputStream(fileName3); вызывает автоматическое закрытие fos и создание нового fos ?
An N
Уровень 20, Cheboksary, Russian Federation
6 августа, 07:15
В комментариях люди придумывают разные способы вычисления размеров файлов. По-моему тут все просто. размер третьего файла это половина размера первого. размер второго файла это размер первого минус размер третьего.
An N
Уровень 20, Cheboksary, Russian Federation
6 августа, 07:02
Очень странно: В последней лекции изучали чтение и запись блоками, а в правильном решении используется чтение и запись по одному байту.
Sergio Pi
Уровень 28, Полтава, Ukraine
2 августа, 18:17
админы; Если в файл1 количество байт нечетное, то файл2 должен содержать большую часть. в правильном ВАШЕМ решении нет данного условия
An N
Уровень 20, Cheboksary, Russian Federation
6 августа, 07:04
Правильное решение выполняет данное условие. Обрати внимание на строку int halfOfFile = (fileInputStream.available() + 1) / 2;
Brain4Real
Уровень 24, Москва
26 июля, 14:05
Делить нацело в большую сторону можно стандартными средствами:
fos1.write(buff, 0, (size + 1)/2);
fos2.write(buff, (size + 1)/2, size/2);
Михаил
Уровень 19, Харьков, Украина
27 июля, 11:30
не понятно в первой строчке у тебя записывается от 0 до половины , а во второй что то непонятное типа от половины до половины?? Грубо говоря у нас size = 31; тогда (size + 1)/2 будет равняться 16 , а дальше size/2 = 15,5 пять десятых откидывается остается 15 и выходит такая запись:
fos2.write(buff, 16, 15);
или я что то не понял?
Михаил
Уровень 19, Харьков, Украина
27 июля, 11:44
решил затестить и это работает, записало вторую половину байтов
byte[] buffer = new byte[fileInputStream.available()];
int count = fileInputStream.read(buffer);
 fileOutputStream2.write(buffer, count/2, count/2);
чет я окончательно запутался я думал что в третьем аргументе мы указываем до куда будем записывать а получается это выглядит примерно так:
fileOutputStream2.write(откуда берем байты, с какой позиции берем байты, сколько берем байтов);
я делал вот так:
byte[] buffer = new byte[fileInputStream.available()];
int count = fileInputStream.read(buffer);
fileOutputStream1.write(buffer, 0, count/2);
fileOutputStream2.write(buffer, count/2, count);
и постоянно кидало эксепшн выход за границу массива , а я вдуплить не мог почему выходим за границу забил на это и начал решать по другой схеме твой коммент прям в тему я хоть понял как надо:
byte[] buffer = new byte[fileInputStream.available()];
int count = fileInputStream.read(buffer);
fileOutputStream1.write(buffer, 0, count/2);
fileOutputStream2.write(buffer, count/2, count/2);
рабочий вариант для четного количества байтов
Oss Osip
Уровень 28, minsk, Belarus
29 июля, 20:20
блин идеально
RomanGV
Уровень 22, Россия
22 июля, 21:50
Нуу....¯\_(ツ)_/¯ Конечно не так изящно как в правильном решении, но пойдет))) ,без всяких ифов)))
bufferBytesFirst = new byte[bytesAvailable - (bytesAvailable / 2)];
bufferBytesSecond = new byte[bytesAvailable / 2];
inputStream.read(bufferBytesFirst);
....
Lua gato
Уровень 20
22 июля, 08:04
Что-то после предыдущих задач меня унесло в усложнение решения 😱 А можно было читать и писать сразу 😅 Если кому пригодится как узнать нечетное: if((someNumber & 1) > 0) isOdd = true; 😇 т.к. syntaxpro не проходил - пропустил момент с try-with-resources more than one at a time
Эльдар
Уровень 18, Ростов-на-дону
12 июля, 20:18
Решал через циклы:первый файл сохранял в массиве лист,потом через ифы заполнял второй и третий файлы
Anton
Уровень 24, Москва, Russian Federation
26 июля, 12:08
Ну это
Сонмониус
Уровень 39, Харьков, Ukraine
12 июня, 18:29
Мне в правильном решении понравилась реализация счетчика для четных и нечетных чисел. Это красиво
Дмитрий Щебрюк
Уровень 23, Москва, Russian Federation
24 мая, 13:45
Ошибка в файле com/javarush/task/task18/task1808/Solution.java в строке : 19 Не найден метод "readAllBytes()" в переменной "file1" ну как так, Михалыч? Вы же судя по рекламе все задачи обновляете, курс актуальный и тэдэитэпэ.
SergGlav
Уровень 20
7 июля, 00:29
Угу((