本文共 2940 字,大约阅读时间需要 9 分钟。
import java.io._import java.nio._def writeInts(out:OutputStream, a:Array[Int], buf:ByteBuffer, n: Int) { var nwritten = 0; val ibuff = buf.asIntBuffer val bbuff = buf.array while (nwritten < n) { val todo = if (n-nwritten > ibuff.capacity) ibuff.capacity else (n - nwritten) ibuff.put(a, nwritten, todo) ibuff.position(0) out.write(bbuff,0,todo*4) nwritten += todo }}def writeFloats(out:OutputStream, a:Array[Float], buf:ByteBuffer, n:Int) { var nwritten = 0 val fbuff = buf.asFloatBuffer val bbuff = buf.array while (nwritten < n) { val todo = if (n - nwritten > fbuff.capacity) fbuff.capacity else (n - nwritten) fbuff.put(a, nwritten, todo) fbuff.position(0) out.write(bbuff, 0, todo*4) nwritten += todo }}def writeDoubles(out:OutputStream, a:Array[Double], buf:ByteBuffer, n:Int) { var nwritten = 0 val dbuff = buf.asDoubleBuffer val bbuff = buf.array while (nwritten < n) { val todo = if (n - nwritten > dbuff.capacity) dbuff.capacity else n - nwritten dbuff.put(a, nwritten, todo) dbuff.position(0) out.write(bbuff, 0, 8*todo) nwritten += todo }}//read n ints to a, buf is a buffer//instream --> buffer --> Arraydef readInts(in:InoutStream, a:Array[Int], buf:ByteBuffer, n:Int) { val nread = 0//a has read ints from buff val ibuff = buf.asIntBuffer val bbuff = buf.array var readnow = 0// buf has read n bytes from instream while (nread < n) { val todo = if (n - nread > ibuff.capacity) ibuff.capacity else (n - nread) //for instants, need read 5 ints, 20 bytes, but buff only has 18 bytes, so first time only read 16 bytes readnow += in.read(bbuff, readnow, todo*4 - readnow) //last time 'readnow' bytes hasnt put in array, but remain in the head of buff ibuff.get(a, nread, readnow/4) //put and convert bytes in to ints to array ibuff.position(0) //get will get bytes from position nread += readnow/4 if (readnow %4 ! =0) { System.arraycopy(bbuff, 4*(readnow/4), bbuff, 0, readnow%4) } readnow = readnow%4 }}def writeBin() { val bos = new BufferedOutputStream(new FileOutputStream("tsmat"), 1024) val head = new Array[Int](4) val tbuf = ByteBuffer.allocate(16).order(ByteOrder.LITTLE_ENDIAN) val rows = 4 val cols = 5 val nnz = 8 head(0) = 231 head(1) = rows head(2) = cols head(3) = nnz //nnz writeInts(bos, head, tbuf, 4) val buff = ByteBuffer.allocate(1024).order(ByteOrder.LITTLE_ENDIAN) val colv = Array(0,1,2,4,6,8) val rowv = Array(2,1,1,2,2,3,0,2) val data = Array(0.3826f,0.5757f,0.2343f,0.4599f,0.5948f,0.6836f,0.49744f,0.92241f) writeInts(bos, colv, buff,cols+1) writeInts(bos, rowv, buff, nnz) writeFloats(bos, data, buff, nnz) bos.close}def readBin() { val bis = new BufferedInputStream(new FileInputStream("s45.1"), 1024) val buff = ByteBuffer.allocate(1024).order(ByteOrder.LITTLE_ENDIAN) val bbuff = buff.array val len = bis.read(bbuff,0,1024) println("len = " + len) for (i<-1 to 17) print(buff.getInt + " ") for (i<-1 to (len/4-17)) print(buff.getFloat + " ") bis.close}writeBin
转载地址:http://mueti.baihongyu.com/