evgeniy8705
@evgeniy8705
Повелитель вселенной

Почему в фильтре записываются не отфильтрованные байты?

Почему если после записи выводить записанные данные то оказывается что в конце записались не отфильтрованные байты (в данном случае нули). А если убрать вывод записанных в файл байтов, то метод работает корректно и в файл записываются все байты кроме нулей. Как вообще вывод данных, влияет на запись этих данных?

import java.io.*;
import java.util.Arrays;
import java.util.Random;

public class App {
    public static void main(String[] args) throws IOException {
        byte[] arr = new byte[10000];

        for (int i = 0; i < arr.length; i++) {
            arr[i] = (byte) (Math.random() * 2);
        }

        try (InputStream is = new ByteArrayInputStream(arr); OutputStream fos = new FileOutputStream("c://outfile.txt")) {
            long startTime = System.nanoTime();

            Filters.zeroFilter(is, fos, 1024);

            long deltaTime = System.nanoTime() - startTime;

            System.out.println("Скорость работы: " + deltaTime);
        }

        try (InputStream fis = new FileInputStream("c://outfile.txt")) { // Если убрать этот вывод, то все работает норм
            int value;

            while ((value = fis.read()) != -1) {
                System.out.print(value);
            }
        }
    }
}

class Filters {
    public static void zeroFilter(InputStream src, OutputStream dst, int buffSize)  throws IOException {
        try (OutputStream os = new BufferedOutputStream(dst)) {
            final byte STATE_ZERO = 0;
            final byte STATE_NUMBERS = 1;

            int count;
            byte[] buffer = new byte[buffSize];

            while ((count = src.read(buffer)) != -1) {
                byte state = STATE_ZERO;
                int fromIndex = -1;

                for (int index = 0; index < count; index++) {
                    byte elem = buffer[index];

                    switch (state) {
                        case STATE_ZERO:
                            if (elem == 0) {
                                state = STATE_ZERO;
                            } else {
                                state = STATE_NUMBERS;

                                fromIndex = index;
                            }

                            break;
                        case STATE_NUMBERS:
                            if (elem == 0) {
                                state = STATE_ZERO;

                                os.write(Arrays.copyOfRange(buffer, fromIndex, index));
                            } else {
                                state = STATE_NUMBERS;
                            }
                    }
                }

                if (state == STATE_NUMBERS) {
                    os.write(Arrays.copyOfRange(buffer, fromIndex, buffer.length));
                }
            }
        }
    }
}
  • Вопрос задан
  • 166 просмотров
Пригласить эксперта
Ответы на вопрос 1
1. С использованием BufferedOutputStream можно было уложиться в пару строчек.(zeroFilter)
2. Входные данные рандомные, выходной результат возможно тоже.( success/failed)

>>Как вообще вывод данных, влияет на запись этих данных
Никак в идеале.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы