Программа выводит код наиболее частого байта в файле. Если файл пустой выводится null. Если файл не существует в обработчике исключения выводится "No such file". Не понимаю, чего еще валидатору нужно для полного счастья.
package com.javarush.task.task18.task1823;
import java.io.*;
import java.util.*;
/*
Нити и байты
*/
//Нити и байты
// Читайте с консоли имена файлов, пока не будет введено слово "exit".
// Передайте имя файла в нить ReadThread.
// Нить ReadThread должна найти байт, который встречается в файле максимальное число раз, и добавить его в словарь resultMap,
// где параметр String - это имя файла, параметр Integer - это искомый байт.
// Закрыть потоки.
//
//
// Требования:
// 1. Программа должна считывать имена файлов с консоли, пока не будет введено слово "exit".
// 2. Для каждого файла создай нить ReadThread и запусти ее.
// 3. После запуска каждая нить ReadThread должна создать свой поток для чтения из файла.
// 4. Затем нити должны найти максимально встречающийся байт в своем файле и добавить его в словарь resultMap.
// 5. Поток для чтения из файла в каждой нити должен быть закрыт.
public class Solution {
public static Map<String, Integer> resultMap = new HashMap<String, Integer>();
public static void main(String[] args) throws IOException, InterruptedException{
BufferedReader con = new BufferedReader(new InputStreamReader(System.in));
List<ReadThread> threads = new ArrayList<>();
String fn;
ReadThread th;
while (true)
try {
fn = con.readLine();
if(fn.equals("exit"))
break;
th = new ReadThread(fn);
threads.add(th);
th.start();
} catch (IOException e) {
System.out.println("No such file");
}
try {
con.close();
} catch (IOException e)
{
e.printStackTrace();
}
for (ReadThread i : threads) {
i.join();
}
for (Map.Entry<String, Integer> j : resultMap.entrySet()) {
System.out.println(j.getKey() + " " + j.getValue());
}
}
public static class ReadThread extends Thread
{
FileInputStream fis;
String fileName;
public ReadThread(String fileName) throws IOException {
this.fileName = fileName;
this.fis = new FileInputStream(fileName);
}
@Override
public void run(){
HashMap<Integer, Integer> acc = new HashMap<>();
int i = 0;
try {
while ((i = fis.read()) != -1) {
Integer c = i;
int cnt = 0;
if (!acc.containsKey(c)) {
acc.put(c, 1);
} else {
cnt = acc.get(c);
cnt++;
acc.remove(c);
acc.put(c, cnt);
}
}
fis.close();
if(acc.size() == 0)
resultMap.put(fileName, null);
else {
Integer[] Asciis = new Integer[acc.entrySet().size()];
int j = 0;
for (Map.Entry<Integer, Integer> v : acc.entrySet()) {
Asciis[j++] = v.getKey();
}
Arrays.sort(Asciis, Collections.reverseOrder());
resultMap.put(fileName, Asciis[0]);
}
} catch (IOException e)
{
e.printStackTrace();
}
}
}
}