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