Forum: PC-Programmierung Java - RandomAccessFile - Bufferlänge bestimmen, oder nicht blockierender Read-Befehl


von Samuel Schmidt (Gast)


Lesenswert?

Hallo,

ich habe ein kleines Java-Problem. Ich lese mittels Java Daten von der 
Seriellen-Schnittstelle. Da ich nicht auf jedem PC die RXTX- oder JAVAX- 
Bibliothek installieren möchte, habe ich mich für die Lösung mittels der 
Bibliothek java.io.* und dort im Speziellen für das Objekt 
RandomAccessFile entschieden.

Es läuft alles perfekt. Nur eine Sache nicht. Der Read-Befehl ist 
blockierend. Wenn ich jetzt nur ein Byte zuviel abholen möchte, bleibt 
meine kleine Java-Anwendung für immer stehen. Ich suche jetzt nach einer 
Möglichkeit die Anzahl der Bytes im Buffer abzufragen, oder einen nicht 
blockierenden Read-Befehl. Leider finde ich trotz langer Suche nicht. 
Aber vielleicht ist es auch einfach zu spät.

Meine bisherige Lösung ist es den String mit einem Stringende zu 
markieren. Das ist mir jedoch zu wenig Fehlertolerant. Meine Idee wäre 
es jetzt einen Thread zu programmieren der permanent im Hintergrund 
läuft. Aber erstens müsste ich mich da noch in sehr vieles Einlesen und 
zweitens kann ich nicht glauben, dass es einen solchen Befehl nicht 
gibt. ;-).


Vlt. Kann mir einer von Euch helfen.

Grüße

Samuel

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Samuel Schmidt schrieb:
> Ich lese mittels Java Daten von der
> Seriellen-Schnittstelle

Ok...

Samuel Schmidt schrieb:
> habe ich mich für die Lösung mittels der
> Bibliothek java.io.*

Welche Lösung? Quellcode wäre hilfreich.

Samuel Schmidt schrieb:
> das Objekt
> RandomAccessFile

Scheint mir wenig zielführend, wo kommt das zum Einsatz. Eine Serielle 
Schnittstelle kann man sicher als vieles sehen, aber bestimmt nicht als 
RandomAccessFile...

Samuel Schmidt schrieb:
> Möglichkeit die Anzahl der Bytes im Buffer abzufragen

Bei einer RandomAccessFile ist die aktuelle Größe bekannt und du kannst 
auf jedes byte jederzeit zu greifen es gibt also keinen "buffer".

Falls du einen Inputstream meinst, da gibt es die Klasse 
BufferedInputstream, welche z.B. die Methode available()
( 
http://download.oracle.com/javase/6/docs/api/java/io/BufferedInputStream.html 
)

Samuel Schmidt schrieb:
> oder einen nicht
> blockierenden Read-Befehl

Das funktioniert mit dem NIO Package:
http://download.oracle.com/javase/1.4.2/docs/api/java/nio/channels/package-summary.html#multiplex

Alles in allem ist es aber trotzdem üblich eher

Samuel Schmidt schrieb:
> jetzt einen Thread zu programmieren der permanent
> im Hintergrund läuft

Und wenn dir das schon zu kompliziert ist solltest du eventuell 
erstmal was einfacheres machen, es sit nämlich keinesweg so das es für 
alles "einen Befehl" gibt.

von Roland H. (batchman)


Lesenswert?

Samuel Schmidt schrieb:
> und dort im Speziellen für das Objekt
> RandomAccessFile entschieden.

Zeig Doch mal den Source, das würde mich auch interessieren, nämlich ob 
und wie es geht, ohne RXTX mittels RandomAccessFile die serielle 
Schnittstelle zu bedienen.

> Meine Idee wäre
> es jetzt einen Thread zu programmieren der permanent im Hintergrund
> läuft. Aber erstens müsste ich mich da noch in sehr vieles Einlesen und
> zweitens kann ich nicht glauben, dass es einen solchen Befehl nicht
> gibt. ;-).

Threads sind die (allgemeine) Lösung, damit man eben nicht für alles 
wieder etwas Spezielles haben muss. In den Threads darf dann auch 
hemmungslos sleep() eingesetzt werden, und der Algorithmus bleibt 
linear.

Die Programmierung von Threads ist m. A. nach wesentlich einfacher und 
eingängiger als der Ansatz mit nur "einem Thread", in welchem man alle 
Dinge nicht blockierend auslegen muss.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.