]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.db.common/src/org/simantics/db/common/ByteFileReader.java
Merge commit 'bf75fd9'
[simantics/platform.git] / bundles / org.simantics.db.common / src / org / simantics / db / common / ByteFileReader.java
1 package org.simantics.db.common;\r
2 \r
3 import java.io.File;\r
4 import java.io.FileInputStream;\r
5 import java.io.IOException;\r
6 import java.nio.ByteBuffer;\r
7 import java.nio.channels.ReadableByteChannel;\r
8 \r
9 import org.simantics.db.common.utils.Logger;\r
10 import org.simantics.db.service.Bytes;\r
11 \r
12 final public class ByteFileReader {\r
13 \r
14         public static int BUFFER = 65536;\r
15 \r
16         final private FileInputStream fs;\r
17         final private ReadableByteChannel channel;\r
18         final private ByteBuffer byteBuffer;\r
19         \r
20         final private byte[] bytes = new byte[BUFFER];\r
21         private int size;\r
22 \r
23         protected int byteIndex = 0;\r
24 \r
25         final protected ReadableByteChannel getChannel() {\r
26                 return channel;\r
27         }\r
28         \r
29         final protected ByteBuffer getByteBuffer() {\r
30                 return byteBuffer;\r
31         }\r
32 \r
33         final protected byte[] getBytes() {\r
34                 return bytes;\r
35         }\r
36 \r
37         final public byte[] readBytes(int amount) throws IOException {\r
38 \r
39                 byte[] result = new byte[amount];\r
40                 \r
41                 int has = size-byteIndex;\r
42                 if(amount >= has) {\r
43                         ReadableByteChannel c = channel;\r
44                         System.arraycopy(bytes, byteIndex, result, 0, has);\r
45                         ByteBuffer bb2 = ByteBuffer.wrap(result);\r
46                         bb2.position(has);\r
47                         while(has < amount)\r
48                                 has += c.read(bb2);\r
49                         getSome();\r
50                 } else {\r
51                         System.arraycopy(bytes, byteIndex, result, 0, amount);\r
52                         byteIndex += amount;\r
53                 }\r
54 \r
55                 return result;\r
56                 \r
57         }\r
58 \r
59         final public void getSome() throws IOException {\r
60 \r
61                 ReadableByteChannel c = channel;\r
62                 ByteBuffer bb = byteBuffer;\r
63                 bb.position(0);\r
64                 bb.limit(BUFFER);\r
65                 size = c.read(bb);\r
66                 if(size == 0) {\r
67                         long start = System.nanoTime();\r
68                         while(size == 0) {\r
69                                 if(System.nanoTime() - start > 10000000000L) throw new IOException("Timeout");\r
70                                 size = c.read(bb);\r
71                         }\r
72                 }\r
73                 bb.position(0);\r
74                 byteIndex = 0;\r
75                 \r
76         }\r
77         \r
78         final public int readShort() throws IOException {\r
79 \r
80                 if(byteIndex >= (size-3)) {\r
81                         short result = 0;\r
82                         if(byteIndex == size) {\r
83                                 getSome();\r
84                         }\r
85                         result |= ((short)(bytes[byteIndex++]&0xff)<<0);\r
86                         if(byteIndex == size) {\r
87                                 getSome();\r
88                         }\r
89                         result |= ((short)(bytes[byteIndex++]&0xff)<<8);\r
90                         if(byteIndex == size) {\r
91                                 getSome();\r
92                         }\r
93                         return result;\r
94                 } else {\r
95                         int result = Bytes.readLE2(bytes, byteIndex);\r
96                         byteIndex += 2;\r
97                         return result;\r
98                 }\r
99                 \r
100         }\r
101         \r
102         final public int readInt() throws IOException {\r
103 \r
104                 if(byteIndex >= (size-5)) {\r
105                         int result = 0;\r
106                         if(byteIndex == size) {\r
107                                 getSome();\r
108                         }\r
109                         result |= ((int)(bytes[byteIndex++]&0xff)<<0);\r
110                         if(byteIndex == size) {\r
111                                 getSome();\r
112                         }\r
113                         result |= ((int)(bytes[byteIndex++]&0xff)<<8);\r
114                         if(byteIndex == size) {\r
115                                 getSome();\r
116                         }\r
117                         result |= ((int)(bytes[byteIndex++]&0xff)<<16);\r
118                         if(byteIndex == size) {\r
119                                 getSome();\r
120                         }\r
121                         result |= ((int)(bytes[byteIndex++]&0xff)<<24);\r
122                         if(byteIndex == size) {\r
123                                 getSome();\r
124                         }\r
125                         return result;\r
126                 } else {\r
127                         int result = Bytes.readLE4(bytes, byteIndex);\r
128                         byteIndex += 4;\r
129                         return result;\r
130                 }\r
131                 \r
132         }\r
133         \r
134         final public long readLong() throws IOException {\r
135 \r
136                 if(byteIndex >= (size-9)) {\r
137                         long result = 0;\r
138                         if(byteIndex == size) {\r
139                                 getSome();\r
140                         }\r
141                         result |= ((long)(bytes[byteIndex++]&0xff)<<0);\r
142                         if(byteIndex == size) {\r
143                                 getSome();\r
144                         }\r
145                         result |= ((long)(bytes[byteIndex++]&0xff)<<8);\r
146                         if(byteIndex == size) {\r
147                                 getSome();\r
148                         }\r
149                         result |= ((long)(bytes[byteIndex++]&0xff)<<16);\r
150                         if(byteIndex == size) {\r
151                                 getSome();\r
152                         }\r
153                         result |= ((long)(bytes[byteIndex++]&0xff)<<24);\r
154                         if(byteIndex == size) {\r
155                                 getSome();\r
156                         }\r
157                         result |= ((long)(bytes[byteIndex++]&0xff)<<32);\r
158                         if(byteIndex == size) {\r
159                                 getSome();\r
160                         }\r
161                         result |= ((long)(bytes[byteIndex++]&0xff)<<40);\r
162                         if(byteIndex == size) {\r
163                                 getSome();\r
164                         }\r
165                         result |= ((long)(bytes[byteIndex++]&0xff)<<48);\r
166                         if(byteIndex == size) {\r
167                                 getSome();\r
168                         }\r
169                         result |= ((long)(bytes[byteIndex++]&0xff)<<56);\r
170                         if(byteIndex == size) {\r
171                                 getSome();\r
172                         }\r
173                         return result;\r
174                 } else {\r
175                         long result = Bytes.readLE8(bytes, byteIndex);\r
176                         byteIndex += 8;\r
177                         return result;\r
178                 }\r
179                 \r
180         }\r
181 \r
182         public void close() {\r
183                 try {\r
184                         fs.close();\r
185                 } catch (IOException e) {\r
186                         Logger.defaultLogError(e);\r
187                 }\r
188         }\r
189         \r
190         public ByteFileReader(File file) throws IOException {\r
191 \r
192                 byteBuffer = ByteBuffer.wrap(bytes);\r
193 \r
194                 fs = new FileInputStream(file);\r
195                 \r
196                 channel = fs.getChannel();\r
197                 \r
198                 this.size = channel.read(byteBuffer);\r
199                 \r
200                 byteBuffer.position(0);\r
201                 \r
202         }\r
203         \r
204 }\r