1 package org.simantics.db.common;
\r
4 import java.io.FileNotFoundException;
\r
5 import java.io.FileOutputStream;
\r
6 import java.io.IOException;
\r
7 import java.nio.ByteBuffer;
\r
8 import java.nio.channels.FileChannel;
\r
10 import org.simantics.db.common.utils.Logger;
\r
12 final public class ByteFileWriter {
\r
14 public static int BUFFER = 65536;
\r
16 private FileChannel channel;
\r
17 private FileOutputStream out;
\r
19 byte[] bytes = new byte[BUFFER];
\r
20 ByteBuffer bb = ByteBuffer.wrap(bytes);
\r
23 public ByteFileWriter(File file) throws FileNotFoundException {
\r
24 out = new FileOutputStream(file);
\r
25 channel = out.getChannel();
\r
28 public void write(short s) {
\r
29 // System.err.println("write " + s);
\r
30 if(byteIndex < (BUFFER-2)) {
\r
31 bytes[byteIndex++] = (byte)(s&0xff);
\r
32 bytes[byteIndex++] = (byte)((s>>>8)&0xff);
\r
34 int has = BUFFER-byteIndex;
\r
35 if(has == 0) writeReset(BUFFER);
\r
36 bytes[byteIndex++] = (byte)(s&0xff);
\r
37 if(has == 1) writeReset(BUFFER);
\r
38 bytes[byteIndex++] = (byte)((s>>>8)&0xff);
\r
39 if(has == 2) writeReset(BUFFER);
\r
43 public void write(int i) {
\r
44 // System.err.println("write " + i);
\r
45 if(byteIndex < (BUFFER-4)) {
\r
46 bytes[byteIndex++] = (byte)(i&0xff);
\r
47 bytes[byteIndex++] = (byte)((i>>>8)&0xff);
\r
48 bytes[byteIndex++] = (byte)((i>>>16)&0xff);
\r
49 bytes[byteIndex++] = (byte)((i>>>24)&0xff);
\r
51 int has = BUFFER-byteIndex;
\r
52 if(has == 0) writeReset(BUFFER);
\r
53 bytes[byteIndex++] = (byte)(i&0xff);
\r
54 if(has == 1) writeReset(BUFFER);
\r
55 bytes[byteIndex++] = (byte)((i>>>8)&0xff);
\r
56 if(has == 2) writeReset(BUFFER);
\r
57 bytes[byteIndex++] = (byte)((i>>>16)&0xff);
\r
58 if(has == 3) writeReset(BUFFER);
\r
59 bytes[byteIndex++] = (byte)((i>>>24)&0xff);
\r
60 if(has == 4) writeReset(BUFFER);
\r
64 public void write(long l) {
\r
65 // System.err.println("write " + l);
\r
66 if(byteIndex < (BUFFER-8)) {
\r
67 bytes[byteIndex++] = (byte)(l&0xff);
\r
68 bytes[byteIndex++] = (byte)((l>>>8)&0xff);
\r
69 bytes[byteIndex++] = (byte)((l>>>16)&0xff);
\r
70 bytes[byteIndex++] = (byte)((l>>>24)&0xff);
\r
71 bytes[byteIndex++] = (byte)((l>>>32)&0xff);
\r
72 bytes[byteIndex++] = (byte)((l>>>40)&0xff);
\r
73 bytes[byteIndex++] = (byte)((l>>>48)&0xff);
\r
74 bytes[byteIndex++] = (byte)((l>>>56)&0xff);
\r
76 int has = BUFFER-byteIndex;
\r
77 if(has == 0) writeReset(BUFFER);
\r
78 bytes[byteIndex++] = (byte)(l&0xff);
\r
79 if(has == 1) writeReset(BUFFER);
\r
80 bytes[byteIndex++] = (byte)((l>>>8)&0xff);
\r
81 if(has == 2) writeReset(BUFFER);
\r
82 bytes[byteIndex++] = (byte)((l>>>16)&0xff);
\r
83 if(has == 3) writeReset(BUFFER);
\r
84 bytes[byteIndex++] = (byte)((l>>>24)&0xff);
\r
85 if(has == 4) writeReset(BUFFER);
\r
86 bytes[byteIndex++] = (byte)((l>>>32)&0xff);
\r
87 if(has == 5) writeReset(BUFFER);
\r
88 bytes[byteIndex++] = (byte)((l>>>40)&0xff);
\r
89 if(has == 6) writeReset(BUFFER);
\r
90 bytes[byteIndex++] = (byte)((l>>>48)&0xff);
\r
91 if(has == 7) writeReset(BUFFER);
\r
92 bytes[byteIndex++] = (byte)((l>>>56)&0xff);
\r
93 if(has == 8) writeReset(BUFFER);
\r
97 public void write(byte[] data) {
\r
100 int left = data.length;
\r
101 int has = BUFFER-byteIndex;
\r
105 System.arraycopy(data, 0, bytes, byteIndex, left);
\r
108 } else if(has == left) {
\r
110 System.arraycopy(data, 0, bytes, byteIndex, left);
\r
111 writeReset(BUFFER);
\r
115 System.arraycopy(data, 0, bytes, byteIndex, has);
\r
116 writeReset(BUFFER);
\r
122 int length = Math.min(left, BUFFER);
\r
123 System.arraycopy(data, offset, bytes, 0, length);
\r
127 if(length < BUFFER) byteIndex = length;
\r
128 else writeReset(BUFFER);
\r
136 public void commit() {
\r
138 if(byteIndex > 0) writeReset(byteIndex);
\r
139 //channel.force(false);
\r
141 } catch (IOException e) {
\r
142 Logger.defaultLogError(e);
\r
146 private void writeReset(int size) {
\r
153 for(int got=0;got < size;) {
\r
154 got += channel.write(bb);
\r
156 new Exception().printStackTrace();
\r
161 } catch (IOException e) {
\r
162 e.printStackTrace();
\r