Witam Temat odczytu plików w Linux. Są to pliki dość nietypowe, to znaczy przechowują dane wejścia z urządzeń. Akurat pliki js odpowiadają za rożnego rodzaju kontrolery np pady.
Struktura pliku takiego pliku jest zapisana mniej więcej w ten sposób.
struct js_event {
__u32 time; /* event timestamp in milliseconds */
__s16 value; /* value */
__u8 type; /* event type */
__u8 number; /* axis/button number */
};
Czyli łącznie 8 bajtów
podczas otwarcia pliku jest około 160 bajtów inicjalizacji informacji.
natomiast dalej są dane przekazywane jak w strukturze.
Mój kod wygląda mniej więcej tak.
public static void main(String[] args) throws FileNotFoundException, IIOException {
System.out.println("test");
try {
FileInputStream f = new FileInputStream("/dev/input/js1");
BufferedInputStream bf = new BufferedInputStream(f);
while (true) {
byte[] x= bf.readNBytes(8);
if (x[7]==-1) break;
else {
System.out.println(test(x));
}
}
f.close();
}
catch (IOException e) {
System.err.println("Błąd " + e);
}
}
Nie ma tutaj funkcji test ale zwraca ona liste [Time , Value, Typ, Numer,]
Ogólnie kod działa ale..
Plik jest dość specyficzny to znaczy tak jak by był nieskończony ale jednocześnie zerowy :D nie wiem jak to wytłumaczyć.
Nie da się zakończyć odczytywania a jednocześnie zakończenie odczytywania pliku nie jest mi na rękę bo ponowne otwarcie wypluje znowu 160 bajtów niepotrzebnych mi danych.
Plik odczytuje paczki po 8 bajtów ale te 8 bajtów pojawia się dopiero jak kontroler coś prześle co skutkuje zatrzymaniem programu i czekaniem aż pojawi się 8 bajtów do odczytu.
czyli jak bym umieścił dalszą część programu poniżej .
byte[] x= bf.readNBytes(8);
to zostanie dopiero wykonane jak pojawią się dane z kontrolera. Czyli trochę niedopuszczalne.
Myślałem o jakimś wskaźniku albo markerze ale w przepadku tego pliku to nie działa. (albo źle to robię)
Jakie macie pomysły aby program wykonywał się dalej pomimo że w pliku nie ma nic do odczytania?
Albo zrobić osobą funkcję lub klasę w jakimś innym wątku która będzie się wykonywała niezależnie (cały czas) i raportowała różne zdarzenia w zmiennych swojej klasy?.
Jednak w Javie jestem bardzo początkujący i nie wiem czy to możliwe.
Proszę o jakieś sugestie.