I think in my program can be problems with synchronized. Maybe something else? Some tips please :)
package pl.codegym.task.task18.task1823;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/*
Wątki i bajty
*/
public class Solution {
public static Map<String, Integer> resultMap = new HashMap<String, Integer>();
public static void main(String[] args) throws IOException, InterruptedException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String fileName = "";
// D:/JAVA/CodeGym/CodeGymTasks/2.JavaCore/src/File1.txt
// D:/JAVA/CodeGym/CodeGymTasks/2.JavaCore/src/File2.txt
while (!(fileName = reader.readLine()).equals("exit")) {
ReadThread readThread = new ReadThread(fileName);
readThread.start();
// readThread.join();
}
System.out.println(resultMap);
}
public static class ReadThread extends Thread {
int max = Integer.MIN_VALUE;
int frequentBait = 0;
ArrayList<Integer> list = new ArrayList<>();
HashMap<Integer, Integer> map = new HashMap<>();
FileInputStream FIS;
String name;
public ReadThread(String fileName) throws IOException {
this.FIS = new FileInputStream(fileName);
this.name = fileName;
}
@Override
public void run() {
while (true) {
try {
if (!(FIS.available() > 0)) {
break;
}
int data = FIS.read();
list.add(data);
} catch (IOException e) {
e.printStackTrace();
}
}
for (Integer bait : list) {
int count = map.containsKey(bait) ? map.get(bait) : 0;
map.put(bait, count + 1);
}
for (Map.Entry<Integer, Integer> number : map.entrySet()) {
if (number.getKey() > max) {
max = number.getValue();
frequentBait = number.getKey();
}
}
resultMap.put(name, frequentBait);
try {
FIS.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/*
Wątki i bajty
Odczytuj nazwy plików z konsoli do momentu wprowadzenia słowa "exit".
Przekaż nazwę pliku do ReadThread thread.
ReadThread thread powinien odnajdywać bajt, który występuje w pliku najczęściej i dodawać go do resultMap,
gdzie parametr String jest nazwą pliku, a parametr Integer jest odpowiednim bajtem.
Zamknij strumienie.
Requirements:
1. Program musi odczytywać nazwy plików z konsoli do momentu wprowadzenia słowa "exit".
2. Dla każdego pliku należy utworzyć i uruchomić ReadThread thread.
3. Po uruchomieniu każdego z wątków, ReadThread powinien tworzyć własny strumień wejściowy pliku.
4. Następnie każdy z wątków musi odnajdywać w swoim pliku najczęściej występujący bajt i dodawać go do resultMap.
5. Strumień wejściowy pliku w każdym z wątków musi zostać zamknięty.
*/