Best Practice für mit Steckdosen (Java), bis eine Markierung zu lesen?
-
03-10-2019 - |
Frage
Ich erstelle eine mobile App auf einem Handy laufen zu lassen und zu versuchen, Daten von ihm auf die effizienteste Art und Weise zu lesen. Die Anwendung wird Daten auf meinen Server App senden (in Form von Bytes, die nicht unbedingt Zeichen).
Ich werde nicht die Länge der Daten kennen; das Ende wird mit einem 3-Byte-Marker (d.h. 0x11,0x22,0x33), und dann wird ein neuer Satz von Daten markiert werden gesendet. Es ist wahrscheinlich, dass eine große Menge an Daten in jedem „Satz“ von Daten gesendet werden. Ich frage mich also, was der effizienteste Weg, diese Daten zu lesen ist. Soll ich InputStreamReader
verwenden? BufferedReader
? Natürlich, ich muß jedes Zeichen untersuchen, um zu sehen, ob es Teil des Markers ist, und wenn ja, alle die Daten vor der Markierung auf einem andere Methode zur Verarbeitung senden.
Von dem, was ich sagen kann, BufferedReader.readLine()
wäre, was ich will , wenn mein Ende Marker ein \n
war (offensichtlich ist dies nicht der Fall ist). Muss ich meine eigene Methode schreiben, eine BufferedReader
Byte-für-Byte und sucht meine Marker zu lesen? (Ich weiß nicht, auch wenn dies der effizienteste Weg sein würde?)
Lösung
Unter der Annahme, dass Ihre Daten Byte-Daten eher als Zeichendaten, sollten Sie Ihren Buchse Eingangsstrom in einem BufferedInputStream
wickeln, und verwenden Sie, dass die Daten ein Byte zu einem Zeitpunkt, zu lesen, das Bytes in einem Byte-Puffer irgendeine Art zu speichern. (Eine Möglichkeit ist es, eine ByteArrayOutputStream
zu verwenden, um den Daten-Bytes zu puffern, dass Sie aus dem BufferedInputStream
gelesen haben.)
BufferedReader
und readLine()
ist NICHT der Weg zu gehen:
- Unter der Annahme, dass die Daten nicht Zeichendaten, wenn Sie es nach einigen Zeichensatz zu entschlüsseln versuchen, sind Sie verpflichtet, es mangle.
- Die
readLine
Methode versteht nur getrennt durch Linien'\n'
und / oder'\r'
Zeichen. Es gibt keine Möglichkeit, es zu verstehen andere „Linie“ Separatoren zu erhalten.
Schließlich ist zu beachten, dass der BufferedInputStream
ist sehr wichtig für die Performance-Gründe. Wenn Sie eine nicht verwenden, und zu einem Zeitpunkt aus der Steckdose Input ein Byte lesen, werden Sie wahrscheinlich eine erhebliche Leistungseinbußen aufgrund der großen Anzahl von syscalls entstehen, dass Ihre Java-Anwendung führt.
Andere Tipps
Ein Reader ist für das Lesen von Text, so dass Sie wahrscheinlich stattdessen eine Input wollen. Ströme im allgemeinen sind effizienter, wenn man sie puffern, so BufferedInputStream verwenden. Und ich weiß nicht, jeden integrierte Funktion Marker in Stromdaten zu erfassen, so dass Sie selbst tun müssen.