Что я делаю:
1. считываю имя файла с консоли
2. создаю FileInputStream
3. создают массив в котором будет храниться количество байтов; для каждого байта отдельная ячейка; индекс ячейки это значение байта + 128 (байты могут иметь значение от -128 до 127; индексы от 0 до 255)
4. считываю байты
5. для каждого считаного байта увеличиваю значение в массиве
6. прохожусь по массиву байтов и ищу минимальное значение кроме нуля
7. снова прохожусь по массиву и если значение равняется минимальному вывожу на экран
package com.javarush.task.task18.task1804;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
/*
Самые редкие байты
*/
public class Solution {
public static void main(String[] args) throws Exception {
BufferedReader reader = new BufferedReader (new InputStreamReader (System.in));
String fileName = reader.readLine();
reader.close();
FileInputStream fis = new FileInputStream (fileName);
int[] arrayOfByte = new int[256];
while (fis.available() > 0) {
arrayOfByte[fis.read() + 128]++;
}
fis.close();
int min = Integer.MAX_VALUE;
for (int i : arrayOfByte) {
if (arrayOfByte[i] < min && arrayOfByte[i] > 0) {
min = arrayOfByte[i];
}
}
for (int i : arrayOfByte) {
if (arrayOfByte[i] == min) {
System.out.print((i - 128) + " ");
}
}
}
}