-package org.simantics.db.common;\r
-\r
-import java.io.File;\r
-import java.io.FileNotFoundException;\r
-import java.io.FileOutputStream;\r
-import java.io.IOException;\r
-import java.nio.ByteBuffer;\r
-import java.nio.channels.FileChannel;\r
-\r
-import org.simantics.db.common.utils.Logger;\r
-\r
-final public class ByteFileWriter {\r
-\r
- public static int BUFFER = 65536;\r
-\r
- private FileChannel channel;\r
- private FileOutputStream out;\r
- \r
- byte[] bytes = new byte[BUFFER];\r
- ByteBuffer bb = ByteBuffer.wrap(bytes);\r
- int byteIndex = 0;\r
- \r
- public ByteFileWriter(File file) throws FileNotFoundException {\r
- out = new FileOutputStream(file);\r
- channel = out.getChannel();\r
- }\r
- \r
- public void write(short s) {\r
-// System.err.println("write " + s);\r
- if(byteIndex < (BUFFER-2)) {\r
- bytes[byteIndex++] = (byte)(s&0xff);\r
- bytes[byteIndex++] = (byte)((s>>>8)&0xff);\r
- } else {\r
- int has = BUFFER-byteIndex;\r
- if(has == 0) writeReset(BUFFER);\r
- bytes[byteIndex++] = (byte)(s&0xff);\r
- if(has == 1) writeReset(BUFFER);\r
- bytes[byteIndex++] = (byte)((s>>>8)&0xff);\r
- if(has == 2) writeReset(BUFFER);\r
- }\r
- }\r
-\r
- public void write(int i) {\r
-// System.err.println("write " + i);\r
- if(byteIndex < (BUFFER-4)) {\r
- bytes[byteIndex++] = (byte)(i&0xff);\r
- bytes[byteIndex++] = (byte)((i>>>8)&0xff);\r
- bytes[byteIndex++] = (byte)((i>>>16)&0xff);\r
- bytes[byteIndex++] = (byte)((i>>>24)&0xff);\r
- } else {\r
- int has = BUFFER-byteIndex;\r
- if(has == 0) writeReset(BUFFER);\r
- bytes[byteIndex++] = (byte)(i&0xff);\r
- if(has == 1) writeReset(BUFFER);\r
- bytes[byteIndex++] = (byte)((i>>>8)&0xff);\r
- if(has == 2) writeReset(BUFFER);\r
- bytes[byteIndex++] = (byte)((i>>>16)&0xff);\r
- if(has == 3) writeReset(BUFFER);\r
- bytes[byteIndex++] = (byte)((i>>>24)&0xff);\r
- if(has == 4) writeReset(BUFFER);\r
- }\r
- }\r
-\r
- public void write(long l) {\r
-// System.err.println("write " + l);\r
- if(byteIndex < (BUFFER-8)) {\r
- bytes[byteIndex++] = (byte)(l&0xff);\r
- bytes[byteIndex++] = (byte)((l>>>8)&0xff);\r
- bytes[byteIndex++] = (byte)((l>>>16)&0xff);\r
- bytes[byteIndex++] = (byte)((l>>>24)&0xff);\r
- bytes[byteIndex++] = (byte)((l>>>32)&0xff);\r
- bytes[byteIndex++] = (byte)((l>>>40)&0xff);\r
- bytes[byteIndex++] = (byte)((l>>>48)&0xff);\r
- bytes[byteIndex++] = (byte)((l>>>56)&0xff);\r
- } else {\r
- int has = BUFFER-byteIndex;\r
- if(has == 0) writeReset(BUFFER);\r
- bytes[byteIndex++] = (byte)(l&0xff);\r
- if(has == 1) writeReset(BUFFER);\r
- bytes[byteIndex++] = (byte)((l>>>8)&0xff);\r
- if(has == 2) writeReset(BUFFER);\r
- bytes[byteIndex++] = (byte)((l>>>16)&0xff);\r
- if(has == 3) writeReset(BUFFER);\r
- bytes[byteIndex++] = (byte)((l>>>24)&0xff);\r
- if(has == 4) writeReset(BUFFER);\r
- bytes[byteIndex++] = (byte)((l>>>32)&0xff);\r
- if(has == 5) writeReset(BUFFER);\r
- bytes[byteIndex++] = (byte)((l>>>40)&0xff);\r
- if(has == 6) writeReset(BUFFER);\r
- bytes[byteIndex++] = (byte)((l>>>48)&0xff);\r
- if(has == 7) writeReset(BUFFER);\r
- bytes[byteIndex++] = (byte)((l>>>56)&0xff);\r
- if(has == 8) writeReset(BUFFER);\r
- }\r
- }\r
- \r
- public void write(byte[] data) {\r
- \r
- int offset = 0;\r
- int left = data.length;\r
- int has = BUFFER-byteIndex;\r
- \r
- if(has > left) {\r
- \r
- System.arraycopy(data, 0, bytes, byteIndex, left);\r
- byteIndex += left;\r
- \r
- } else if(has == left) {\r
-\r
- System.arraycopy(data, 0, bytes, byteIndex, left);\r
- writeReset(BUFFER);\r
- \r
- } else {\r
-\r
- System.arraycopy(data, 0, bytes, byteIndex, has);\r
- writeReset(BUFFER);\r
- left -= has;\r
- offset += has;\r
- \r
- while(left > 0) {\r
-\r
- int length = Math.min(left, BUFFER);\r
- System.arraycopy(data, offset, bytes, 0, length);\r
- offset += length;\r
- left -= length;\r
- \r
- if(length < BUFFER) byteIndex = length;\r
- else writeReset(BUFFER);\r
- \r
- }\r
- \r
- }\r
- \r
- } \r
- \r
- public void commit() {\r
- try {\r
- if(byteIndex > 0) writeReset(byteIndex);\r
- //channel.force(false);\r
- out.close();\r
- } catch (IOException e) {\r
- Logger.defaultLogError(e);\r
- }\r
- }\r
- \r
- private void writeReset(int size) {\r
- \r
- byteIndex = 0;\r
- bb.position(0);\r
- bb.limit(size);\r
- try {\r
- \r
- for(int got=0;got < size;) {\r
- got += channel.write(bb);\r
- if(got == -1) {\r
- new Exception().printStackTrace();\r
- return;\r
- }\r
- }\r
- \r
- } catch (IOException e) {\r
- e.printStackTrace();\r
- }\r
- \r
- }\r
- \r
-}\r
+package org.simantics.db.common;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+
+import org.simantics.db.common.utils.Logger;
+
+final public class ByteFileWriter {
+
+ public static int BUFFER = 65536;
+
+ private FileChannel channel;
+ private FileOutputStream out;
+
+ byte[] bytes = new byte[BUFFER];
+ ByteBuffer bb = ByteBuffer.wrap(bytes);
+ int byteIndex = 0;
+
+ public ByteFileWriter(File file) throws FileNotFoundException {
+ out = new FileOutputStream(file);
+ channel = out.getChannel();
+ }
+
+ public void write(short s) {
+// System.err.println("write " + s);
+ if(byteIndex < (BUFFER-2)) {
+ bytes[byteIndex++] = (byte)(s&0xff);
+ bytes[byteIndex++] = (byte)((s>>>8)&0xff);
+ } else {
+ int has = BUFFER-byteIndex;
+ if(has == 0) writeReset(BUFFER);
+ bytes[byteIndex++] = (byte)(s&0xff);
+ if(has == 1) writeReset(BUFFER);
+ bytes[byteIndex++] = (byte)((s>>>8)&0xff);
+ if(has == 2) writeReset(BUFFER);
+ }
+ }
+
+ public void write(int i) {
+// System.err.println("write " + i);
+ if(byteIndex < (BUFFER-4)) {
+ bytes[byteIndex++] = (byte)(i&0xff);
+ bytes[byteIndex++] = (byte)((i>>>8)&0xff);
+ bytes[byteIndex++] = (byte)((i>>>16)&0xff);
+ bytes[byteIndex++] = (byte)((i>>>24)&0xff);
+ } else {
+ int has = BUFFER-byteIndex;
+ if(has == 0) writeReset(BUFFER);
+ bytes[byteIndex++] = (byte)(i&0xff);
+ if(has == 1) writeReset(BUFFER);
+ bytes[byteIndex++] = (byte)((i>>>8)&0xff);
+ if(has == 2) writeReset(BUFFER);
+ bytes[byteIndex++] = (byte)((i>>>16)&0xff);
+ if(has == 3) writeReset(BUFFER);
+ bytes[byteIndex++] = (byte)((i>>>24)&0xff);
+ if(has == 4) writeReset(BUFFER);
+ }
+ }
+
+ public void write(long l) {
+// System.err.println("write " + l);
+ if(byteIndex < (BUFFER-8)) {
+ bytes[byteIndex++] = (byte)(l&0xff);
+ bytes[byteIndex++] = (byte)((l>>>8)&0xff);
+ bytes[byteIndex++] = (byte)((l>>>16)&0xff);
+ bytes[byteIndex++] = (byte)((l>>>24)&0xff);
+ bytes[byteIndex++] = (byte)((l>>>32)&0xff);
+ bytes[byteIndex++] = (byte)((l>>>40)&0xff);
+ bytes[byteIndex++] = (byte)((l>>>48)&0xff);
+ bytes[byteIndex++] = (byte)((l>>>56)&0xff);
+ } else {
+ int has = BUFFER-byteIndex;
+ if(has == 0) writeReset(BUFFER);
+ bytes[byteIndex++] = (byte)(l&0xff);
+ if(has == 1) writeReset(BUFFER);
+ bytes[byteIndex++] = (byte)((l>>>8)&0xff);
+ if(has == 2) writeReset(BUFFER);
+ bytes[byteIndex++] = (byte)((l>>>16)&0xff);
+ if(has == 3) writeReset(BUFFER);
+ bytes[byteIndex++] = (byte)((l>>>24)&0xff);
+ if(has == 4) writeReset(BUFFER);
+ bytes[byteIndex++] = (byte)((l>>>32)&0xff);
+ if(has == 5) writeReset(BUFFER);
+ bytes[byteIndex++] = (byte)((l>>>40)&0xff);
+ if(has == 6) writeReset(BUFFER);
+ bytes[byteIndex++] = (byte)((l>>>48)&0xff);
+ if(has == 7) writeReset(BUFFER);
+ bytes[byteIndex++] = (byte)((l>>>56)&0xff);
+ if(has == 8) writeReset(BUFFER);
+ }
+ }
+
+ public void write(byte[] data) {
+
+ int offset = 0;
+ int left = data.length;
+ int has = BUFFER-byteIndex;
+
+ if(has > left) {
+
+ System.arraycopy(data, 0, bytes, byteIndex, left);
+ byteIndex += left;
+
+ } else if(has == left) {
+
+ System.arraycopy(data, 0, bytes, byteIndex, left);
+ writeReset(BUFFER);
+
+ } else {
+
+ System.arraycopy(data, 0, bytes, byteIndex, has);
+ writeReset(BUFFER);
+ left -= has;
+ offset += has;
+
+ while(left > 0) {
+
+ int length = Math.min(left, BUFFER);
+ System.arraycopy(data, offset, bytes, 0, length);
+ offset += length;
+ left -= length;
+
+ if(length < BUFFER) byteIndex = length;
+ else writeReset(BUFFER);
+
+ }
+
+ }
+
+ }
+
+ public void commit() {
+ try {
+ if(byteIndex > 0) writeReset(byteIndex);
+ //channel.force(false);
+ out.close();
+ } catch (IOException e) {
+ Logger.defaultLogError(e);
+ }
+ }
+
+ private void writeReset(int size) {
+
+ byteIndex = 0;
+ bb.position(0);
+ bb.limit(size);
+ try {
+
+ for(int got=0;got < size;) {
+ got += channel.write(bb);
+ if(got == -1) {
+ new Exception().printStackTrace();
+ return;
+ }
+ }
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+}