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?)

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top