# Problem beim Einlesen von /dev/input...



## Schnacki (7. Juni 2011)

Hallo zusammen.
Ich versuche unter Ubuntu einen USB-Joystick anzusprechen.

Wenn ich es mit einem FileReader auslese klappt alles.


```
FileReader r = new FileReader(new File("/dev/input/js0"));
```

Ich möchte den Joystick aber lieber byteweise auslesen.

Wenn ich den FileReader aber durch einen InputStreamReader ersetze kommt immer folgender Fehler:

java.io.IOException: Invalid argument
	at java.io.FileInputStream.read(Native Method)
	at Joystick.main(Joystick.java:33)
java.io.IOException: Invalid argument

Wisst ihr woran das liegen könnte?

Schnacki


----------



## SE (7. Juni 2011)

Eines vorweg : du hast gesagt du willst den Input BYTEweise auslesen. Dann musst du auch mit BYTEstreams arbeiten. Alle Reader und Writer sind ausschließlich für text/plain - Inhalt vorgesehen. Für RAW-Daten IMMER einen normalen InputStream verwenden !

Versuch es doch mal mit einem FileInputStream ... also so

```
FileInputStream fis=new FileInputStream(new File("/dev/input/js0"));
```
Denn der FileInputStream ist der einzige InputStream *und auch sein gegenstück der FileOutputStream* die ein File-Objekt verarbeiten können.
Alternativ wäre auch noch RandomAccessFile möglich. Allerdings musst du dann die Methode RandomAccessFile.getInputStream() verwenden. Auch musst du darauf achten ein RandomAccessFile am Ende mit close() wieder freizugeben.

Nur mal als Frage nebenbei : wie hast du versucht den InputStreamReader zu erstellen ?


----------



## Schnacki (7. Juni 2011)

Danke erstmal für die Antwort.

Habe mich gestern abend verschrieben, habe auch einen FileInputStream gemeint.

Doch auch die Methode mit dem RandomAccessFile wirft den selben Fehler:

java.io.IOException: Invalid argument
	at java.io.RandomAccessFile.read(Native Method)
	at Joystick.main(Joystick.java:34)

Ist es vielleicht einfach nicht möglich Dateien in /dev/input/ über einen InputStream auszulesen?

Schnacki


----------



## SE (7. Juni 2011)

Da unter Unix das Motto gilt : "alles ist ein File" sollte das eigentlich schon funktionieren ...
Allerdings kenne ich keine Situation bei der java.io.IOException : Invalid argument fliegt ...
Außerdem wundert es mich warum es dann mit FileReader funktioniert. Kann ich so leider nicht nachvollziehen da ich kein Unix aufm PC hab.


----------



## Technoblade (7. Juni 2011)

Hmm, das erscheint mir sehr komisch. Ich habe mir mal den Quelltext von FileReader angesehen. Der erzeugt genau so einen FileInputStream wie du es auch tun würdest. Hier der Konstruktor von FileReader:


```
public FileReader(File file) throws FileNotFoundException 

{
        super(new FileInputStream(file));
}
```


----------



## SE (7. Juni 2011)

Mein Reden ... darum frag ich mich ja auch woher diese komische IOE kommt : Invalid argument ...
Da ich weis das es SEHR viele Gründe für eine IOE gibt braucht man hier wohl nicht anzusetzen ... aber eine IOE auf Grund eines nicht-validen Argumentes ? Das ergibt für mich irgendwie keinen Sinn xD Könnte natürlich auch von der Unix-C-Implementierung kommen *native method*.


----------



## Technoblade (7. Juni 2011)

Dann dürfte der FileReader aber auch nicht funktionieren. ^^ Im Zweifelsfall holt man sich einfach über Reflections den fertigen InputStream aus dem FileReader raus xD


----------



## Schnacki (7. Juni 2011)

Wenn der Filereader im Konstruktor wirklich bloß einen FileInputStream instantiiert macht dsa Problem echt keinen Sinn.

Denn wenn ich folgendes Programm laufen lasse:

```
import java.io.*;
class Joystick {
        public static void main(String[] args) {
		try {
			FileReader r = new FileReader("/dev/input/js0");
			for(int i=0; i<8; i++) {
				System.out.println(r.read());
			}
			r.close();
			FileInputStream in = new FileInputStream("/dev/input/js0");
			for(int i=0; i<8; i++) {
				System.out.println(in.read());
			}
			in.close();
		} catch(IOException ex) {
			ex.printStackTrace();
			System.err.println(ex.toString());
		}
	}
}
```

bekomme ich als Ausgabe:

24
53
97
0
0
0
65533
0
java.io.IOException: Invalid argument
	at java.io.FileInputStream.read(Native Method)
	at Joystick.main(Joystick.java:37)
java.io.IOException: Invalid argument


Vielleicht sollte ich das doch besser in C machen, da klappts nämlich.^^


----------



## SE (7. Juni 2011)

Ok ... das ist so ein typischer WHAT THE ... -Momment. Da ja Techno schon den Hinweis gegeben hat das FileReader(String) nichts weiter macht als FileReader.super(new FileInputStream(new File(String))) dann stehe ich gerade dermaßen aufm Schlauch das ich ich nicht mal sicher bin ob es an Java liegt oder an einer bestimmten Implementierung auf einer bestimmten Ebene zwischen dem Input und der Klasse *für alle die es interessiert : dazwischen liegen unter anderen : Kernel , Driver , Interrupts , Bus , CPU , Java-Native und die VM* ...
Müsste man mal bei Sun im Bug-Tracker suchen ob es sowas schon mal gab.


----------



## Schnacki (7. Juni 2011)

Ok, werde mal nachgucken.

Muss aansonsten halt gucken, dass ich das mit dem FileReader mache, oder wie gesagt halt in c.

Trotzdem vielen Dank.


----------



## Technoblade (7. Juni 2011)

Einfach mal nur aus Interesse, versuch doch mal das auszuführen:


```
import java.io.*;
import java.lang.reflect.*;
class Joystick {
        public static void main(String[] args) {
        try {
            FileReader r = new FileReader("/dev/input/js0");
            Class<Reader> clazz = Reader.class;
            Field lock = clazz.getDeclaredField(lock);
            lock.setAccessible(true);
            InputStream in = (InputStream) lock.get(r);
            for(int i=0; i<8; i++) {
                System.out.println(in.read());
            }
            r.close();
        } catch(IOException ex) {
            ex.printStackTrace();
            System.err.println(ex.toString());
        }
        catch(Exception exc) {
            exc.printStackTrace();
        }
    }
}
```


----------

