Почему если после записи выводить записанные данные то оказывается что в конце записались не отфильтрованные байты (в данном случае нули). А если убрать вывод записанных в файл байтов, то метод работает корректно и в файл записываются все байты кроме нулей. Как вообще вывод данных, влияет на запись этих данных?
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));
}
}
}
}
}