task18.task1820

Доброй ночи господа. Столкнулся с такой вот проблемой, Валидатор практически по всем пунктам не доволен моим кодом, не могу понять почему, помогите разобраться, программа работает корректно (Вроде) но по всей видимости я сотворил не пойми что)
Округление чисел
Считать с консоли 2 имени файла.
Первый файл содержит вещественные(дробные) числа, разделенные пробелом. Например, 3.1415.
Округлить числа до целых и записать через пробел во второй файл.
Закрыть потоки.
Принцип округления:
3.49 — 3
3.50 — 4
3.51 — 4
-3.49 — -3
-3.50 — -3
-3.51 — -4

Программа должна два раза считать имена файлов с консоли.+
Для первого файла создай поток для чтения. Для второго — поток для записи.-
Считать числа из первого файла, округлить их и записать через пробел во второй.-
Должны соблюдаться принципы округления, указанные в задании.-
Созданные для файлов потоки должны быть закрыты.-


package com.javarush.task.task18.task1820;

/* 
Округление чисел
*/

import java.io.*;

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

        //Считываем 2 имени файла и закрываем поток ридер.
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        String s1 = reader.readLine();
        String s2 = reader.readLine();
        reader.close();

        //Открываем поток для чтения и записи с введенными предварительно именами.
        FileInputStream fileInputStream = new FileInputStream(s1);
        FileOutputStream fileOutputStream = new FileOutputStream(s2);

        //Массив для хранения байтов из файла
        byte[] buffer = new byte[fileInputStream.available()];

        //Заполняем массив байтами
        while (fileInputStream.available() > 0) {
            fileInputStream.read(buffer);
        }

        //Закрываем поток чтения.
        fileInputStream.close();

        /*
        Тут я намудрил конечно, но зато работает корректно (Вроде)
        Из массива записываем в Стрингу целые числа по очереди отнимая от них 48
        чтобы работать с "Истинными" значениями, а не их представлениях в байтах.
        Если 46 - ставим точку
        Если 45 - ставим знак "Минус"
        Если 32 - значит пробел и мы переводим стрингу в дабл, округляем ее и записываем в инт
        После чего снова переводим в стнингу и записываем символы в массив чар
        Знаю намудрил, но не суть.
        Далее идет цикл который записывает из массива чар символы в новый файл.
        Добавляем пробел и обнуляем стрингу.
         */
        String s = "";
        double d;
        int b;

        for (int i = 0; i < buffer.length; i++) {
            if (buffer[i] >= 49 && buffer[i] <= 58)
                s += (buffer[i] - 48);
            else if (buffer[i] == 46)
                s += '.';
            else if (buffer[i] == 45)
                s += '-';
            else if (buffer[i] == 32) {
                d = Double.parseDouble(s);
                b = (int) Math.round(d);
                s = ""+b;
                char[] chars = s.toCharArray();
                for (int j = 0; j < chars.length; j++) {
                    fileOutputStream.write(chars[j]);
                }
                fileOutputStream.write(32);
                s = "";
            }
        }

        /*
        Из за рукожопости последнее значение не учитывается, поэтому оно добавляется вне цикла тем же способом.
         */
        d = Double.parseDouble(s);
        b = (int) Math.round(d);
        s = ""+b;
        char[] chars = s.toCharArray();

        for (int i = 0; i < chars.length; i++) {
            fileOutputStream.write(chars[i]);
        }

        //Закрываем поток для чтения.
        fileOutputStream.close();
    }
}

2 комментария

EleNikIvi
  • EleNikIvi
  • +1
  • Комментарий отредактирован 2017-03-20 17:11:53 пользователем EleNikIvi
Не хочу обидеть ваш поток мыслей, но не проще воспользоваться (int) Math.round();? А для чтения из файла лучше использовать new BufferedReader(new FileReader()). С его помощью считывать строки, делить их по пробелу и дальше работать с готовыми числами
BargystVelp
Задача решена, спасибо.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.