• ,

javarush.test.level18.lesson05.task03 HELP!

/* Разделение файла
Считать с консоли три имени файла: файл1, файл2, файл3.
Разделить файл1 по следующему критерию:
Первую половину байт записать в файл2, вторую половину байт записать в файл3.
Если в файл1 количество байт нечетное, то файл2 должен содержать бОльшую часть.
Закрыть потоки. Не использовать try-with-resources
*/
Код функцию выполняет, тестирование не проходит, помогите люди добрые

import java.io.*;

public class Solution {
    static String nameOne;
    static String nameTwo;
    static String nameThree;
    static FileInputStream fileInputStream;
    static FileOutputStream fileOutputStreamOne;
    static FileOutputStream fileOutputStreamTwo;
    public static void main(String[] args) {
        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
        try
        {
            nameOne=bufferedReader.readLine();
            nameTwo=bufferedReader.readLine();
            nameThree=bufferedReader.readLine();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        try
        {
            fileInputStream=new FileInputStream (nameOne);
            fileOutputStreamOne=new FileOutputStream(nameTwo);
            fileOutputStreamTwo=new FileOutputStream(nameThree);
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        try
        {
            byte [] byffer=new byte[fileInputStream.available()];

            while (fileInputStream.available()>0)
            {
                int count = fileInputStream.read(byffer);


                fileOutputStreamOne.write(byffer, 0, count/2+count%2);

                fileOutputStreamTwo.write(byffer,  count/2+count%2, count-count/2-count%2);

            }

        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        try
        {
            fileInputStream.close();
            fileOutputStreamTwo.close();
            fileOutputStreamOne.close();
            bufferedReader.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

    }
}

18 комментариев

arrbitr
write (byte[] buffer, int offset, int count) — записывает диапазон из count байт из массива, начиная с смещения offset, т.е. значит :«записать байты начиная с позиции offset в количестве count», с точки зрения логики все верно по-моему.
Joysi
исходный файл 3 байта. В первый запишет 3/2+3%2 2 байта, во второй — 3-3/2-3%2 1 байт.
по исходным условиям должно быть по другому.
arrbitr
Спасибо.Т.е. только в случае исходного файла размером в 3 байта, логика не правильная, а в остальном верно? исходный файл 5: 5/2+3%2=3 в первый 5-5/2-5%2=2 во второй.и такой еще вопрос, что значит «Не использовать try-with-resources»?
Joysi
Доп конструкция try. Подробнее можно узнать на habrahabr.ru/post/178405/
Joysi
3 — это просто пример.
в первый файл надо записывать с 0 count/2 данных.
во второй — остаток с позиции count/2.
arrbitr
Считать с консоли три имени файла: файл1, файл2, файл3.
файл 2 должен содержать бОльшую часть, а если «в первый файл (файл2) надо записывать с 0 count/2 данных.
во второй (файл3)— остаток с позиции count/2.» то файл 3 будет содержать бОльшую часть, или я не прав?
Joysi
Немного заблудились в 3 соснах.
Всего 2 варианта. Четный и нечетный размер файла.
На бумаге прорешайте, потом на тестовом файле длиной, допустим 3 и 4 байта. Учтите что в буфере 1 байт файла лежит в 0 позиции.
arrbitr
Вот принятый код и я не понимаю почему именно в таком виде приняло, а в моем нет
import java.io.*;

public class Solution {
    public static void main(String[] args) throws IOException
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String file1 = reader.readLine();
        String file2 = reader.readLine();
        String file3 = reader.readLine();
        FileInputStream input = new FileInputStream(file1);
        FileOutputStream out1 = new FileOutputStream(file2);
        FileOutputStream out2 = new FileOutputStream(file3);
        byte[] buffer1 = new byte[input.available()/2+input.available()%2];
        byte[] buffer2 = new byte[input.available()-buffer1.length];
        out1.write(buffer1, 0, input.read(buffer1));
        out2.write(buffer2, 0, input.read(buffer2));
        reader.close();
        input.close();
        out1.close();
        out2.close();
    }
}

функционал у принятого кода такой же как и у непринятого, только тут создается два массива байтов чтение и запись идет последовательно сперва в один, а потом во второй.
Inspiron
я так понимаю, что проверку проходит решение только через массивы
arrbitr
  • arrbitr
  • 0
  • Комментарий отредактирован 2016-03-21 11:57:26 пользователем arrbitr
К сожалению, не совсем понимаю в чем у меня не правильная логика по вашему, можете прямо написать в чем несоответствие условию задачи? по условию
первый файл (наименование по условию файл2 )должен содержать больше байтов чем второй (наименование по условию файл3 )цитата «Считать с консоли три имени файла: файл1, файл2, файл3.
Разделить файл1 по следующему критерию:
Первую половину байт записать в файл2, вторую половину байт записать в файл3.
Если в файл1 количество байт нечетное, то файл2 должен содержать бОльшую часть.», протестил на 3 и 4 байтах, результат в превом 2 во втором 1, в первом 2 во втором 2 соответственно.
arrbitr
Вот такой код приняло
import java.io.*;

public class Solution {
    public static void main(String[] args) throws IOException
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String file1 = reader.readLine();
        String file2 = reader.readLine();
        String file3 = reader.readLine();
        FileInputStream input = new FileInputStream(file1);
        FileOutputStream out1 = new FileOutputStream(file2);
        FileOutputStream out2 = new FileOutputStream(file3);
        byte[] buffer1 = new byte[input.available()/2+input.available()%2];
        byte[] buffer2 = new byte[input.available()-buffer1.length];
        out1.write(buffer1, 0, input.read(buffer1));
        out2.write(buffer2, 0, input.read(buffer2));
        reader.close();
        input.close();
        out1.close();
        out2.close();
    }
}

Хотя если исходный файл 3 байта. в первый записывает 2 а во второй 1.
Exception
  • Exception
  • 0
  • Комментарий отредактирован 2016-05-15 15:21:29 пользователем Exception
<code>
int minSize = input.available()/2;
int maxSize = input.available() - minSize;
byte [] buffer = new byte[input.available()];
</code>
зачем использовать целочисленное деление? ведь при делении int-ов не на цело в любом случае происходит округление до целого (т.е. в меньшую сторону)
и логика железной получается не надо никаких дополнительных проверок устраивать)))
коду в этой задачке у меня получилось что то строк в 17 хотя не смог решить быстро(((
Fry
  • Fry
  • 0
static FileInputStream fileInputStream;
    static FileOutputStream fileOutputStreamOne;
    static FileOutputStream fileOutputStreamTwo;


Обьявите ресурсы корректно. Так плохая практика.
arrbitr
Спасибо.такой еще вопрос, что значит «Не использовать try-with-resources»?
Bushrut

import java.io.*;

public class Solution
{
    public static void main(String[] args) throws IOException
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String reader1 = reader.readLine();
        String reader2 = reader.readLine();
        String reader3 = reader.readLine();

        FileInputStream file1 = new FileInputStream(reader1);
        FileOutputStream file2 = new FileOutputStream(reader2);
        FileOutputStream file3 = new FileOutputStream(reader3);

        final int CONST_FILE1 = file1.available();

        while (file1.available() > 0)
        {
            int baitFile1 = file1.read();
            if (CONST_FILE1 % 2 == 0)
            {
                if (file1.available() > CONST_FILE1 / 2)
                {
                    file2.write(baitFile1);
                } else
                {
                    file3.write(baitFile1);
                }
            } else
            {
                if (file1.available() >= CONST_FILE1 / 2)
                {
                    file2.write(baitFile1);
                } else
                {
                    file3.write(baitFile1);
                }
            }
        }


        reader.close();
        file1.close();
        file2.close();
        file3.close();

    }
}

Что не так с моим кодом?
zlaylink
if (CONST_FILE1 % 2 == 0)
            {
                if (file1.available() > CONST_FILE1 / 2)
                {
                    file2.write(baitFile1);
                } else
                {
                    file3.write(baitFile1);
                }
            } else
            {
                if (file1.available() >= CONST_FILE1 / 2)
                {
                    file2.write(baitFile1);
                } else
                {
                    file3.write(baitFile1);
                }
            }

Неужели проверка не выявляет ошибки? Еще раз првоерь свои условия и действия
mrANDERSON
  • mrANDERSON
  • 0
  • Комментарий отредактирован 2016-07-17 13:41:04 пользователем mrANDERSON
Зачем Вы (все) так наворачиваете? Деление с остатком и дальнейшие проверки ни к чему — при делении int на 2 дробная часть и так отбросится и останется меньшая часть; ну а как большую получить думаю понятно)
Archie369
  • Archie369
  • 0
  • Комментарий отредактирован 2017-01-25 22:52:29 пользователем Archie369
del
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.