Hoi,
Ik ben al twee uur aan het prutsen met het volgende: ik heb een eigen InputStream gemaakt, en deze voer ik vervolgens aan een InputStreamReader. Constructen gaat prima, echter zodra ik een read() doe op de InputStreamReader, blijft deze om een of andere reden doorlezen (continue read()'s dus) op mijn eigen InputStream, die na een tijdje natuurlijk gewoon blockt omdat er niet meer data is.
Tevens wordt het debuggen niet makkelijker gemaakt door het feit dat hoewel de InputStreamReader open source is, deze min of meer een closed-source library (sun.nio.cs.StreamDecoder) wrapped, waardoor ik niet kan zien hoe of wat.
Uiteraard heb ik ook zelf lopen zoeken naar een antwoord, maar ben enkel iemand met hetzelfde probleem tegengekomen.
De InputStream code (geknipte code, is een inner class):
De testcode:
Het resultaat:
Each invocation of one of an InputStreamReader's read() methods may cause one or more bytes to be read from the underlying byte-input stream. To enable the efficient conversion of bytes to characters, more bytes may be read ahead from the underlying stream than are necessary to satisfy the current read operation.
Echter, zie ik niet in waarom hij meer dan 10 bytes gaat lezen, aangezien hij dit ook niet doet als ik "stack1.getInputStream()' hierboven vervang door System.in.
Hopend dat iemand ziet wat fout gaat
. Alvast bedankt!
Ik ben al twee uur aan het prutsen met het volgende: ik heb een eigen InputStream gemaakt, en deze voer ik vervolgens aan een InputStreamReader. Constructen gaat prima, echter zodra ik een read() doe op de InputStreamReader, blijft deze om een of andere reden doorlezen (continue read()'s dus) op mijn eigen InputStream, die na een tijdje natuurlijk gewoon blockt omdat er niet meer data is.
Tevens wordt het debuggen niet makkelijker gemaakt door het feit dat hoewel de InputStreamReader open source is, deze min of meer een closed-source library (sun.nio.cs.StreamDecoder) wrapped, waardoor ik niet kan zien hoe of wat.
Uiteraard heb ik ook zelf lopen zoeken naar een antwoord, maar ben enkel iemand met hetzelfde probleem tegengekomen.
De InputStream code (geknipte code, is een inner class):
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| protected class RTProInputStream extends InputStream { protected byte[] currentPacketData; protected int atByte; public RTProInputStream() { this.currentPacketData = new byte[0]; this.atByte = 0; } public int read() throws IOException { try { if (this.atByte >= currentPacketData.length) { System.out.println("Retrieving new packet..."); Packet next = RTProPresentationLayer.this.transport.readPacket(); System.out.println("Got packet..." + next); this.currentPacketData = next.getData(); this.atByte = 0; } byte b = this.currentPacketData[this.atByte++]; System.out.println("input stream read: " + b); return b; } catch (InterruptedException e) { return -1; } } public int available() throws IOException { int a = this.currentPacketData.length - atByte + RTProPresentationLayer.this.transport.availableBytes(); System.out.println("Available: " + a); return a; } } |
De testcode:
Java:
1
2
3
4
5
6
7
8
9
| // ...knip... InputStreamReader readert = new InputStreamReader(stack1.getInputStream()); System.out.println("readln.."); do { System.out.println("actual read: " + readert.read()); } while (readert.ready()); System.out.println("readln d.."); // ...knip |
Het resultaat:
code:
waarna er niks meer gebeurt. Nu staat er in InputStreamReader API wel vermeld:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| readln.. Retrieving new packet... Got packet...DataPacket [id: 0, type: 0, length: 12] input stream read: 84 input stream read: 69 input stream read: 83 input stream read: 84 input stream read: 13 input stream read: 10 input stream read: 84 input stream read: 69 input stream read: 83 input stream read: 84 input stream read: 13 input stream read: 10 Retrieving new packet... |
Each invocation of one of an InputStreamReader's read() methods may cause one or more bytes to be read from the underlying byte-input stream. To enable the efficient conversion of bytes to characters, more bytes may be read ahead from the underlying stream than are necessary to satisfy the current read operation.
Echter, zie ik niet in waarom hij meer dan 10 bytes gaat lezen, aangezien hij dit ook niet doet als ik "stack1.getInputStream()' hierboven vervang door System.in.
Hopend dat iemand ziet wat fout gaat
[ Voor 5% gewijzigd door Verwijderd op 18-05-2006 07:48 ]