90 lines
2.2 KiB
Java
90 lines
2.2 KiB
Java
package org.kne.io;
|
|
|
|
import java.io.EOFException;
|
|
import java.io.IOException;
|
|
import java.nio.BufferOverflowException;
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.channels.ReadableByteChannel;
|
|
import java.nio.channels.SocketChannel;
|
|
import java.nio.channels.WritableByteChannel;
|
|
|
|
|
|
public class KNEChannels {
|
|
public static class ByteBufferWritableByteChannel implements WritableByteChannel{
|
|
private ByteBuffer bbf;
|
|
|
|
public ByteBuffer getBbf() {
|
|
return bbf;
|
|
}
|
|
public ByteBufferWritableByteChannel(ByteBuffer bbf) {
|
|
this.bbf=bbf;
|
|
}
|
|
@Override
|
|
public boolean isOpen() {
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public void close() throws IOException {
|
|
|
|
}
|
|
|
|
@Override
|
|
public int write(ByteBuffer src) throws IOException {
|
|
int opos=src.position();
|
|
//System.out.println(bbf+" "+src);
|
|
//FastLib .bufferPut(bbf,src);
|
|
try {
|
|
bbf.put(src);
|
|
}catch(BufferOverflowException e) {
|
|
throw new IOException(src.toString()+" "+bbf.toString(), e);
|
|
}
|
|
return src.position()-opos;
|
|
}
|
|
}
|
|
public static WritableByteChannel newWritableChannel(ByteBuffer bbf) {
|
|
return new ByteBufferWritableByteChannel(bbf);
|
|
}
|
|
public static class ByteBufferReadableByteChannel implements ReadableByteChannel {
|
|
private ByteBuffer bbf;
|
|
|
|
public ByteBuffer getBbf() {
|
|
return bbf;
|
|
}
|
|
public ByteBufferReadableByteChannel(ByteBuffer bbf) {
|
|
this.bbf=bbf;
|
|
}
|
|
@Override
|
|
public boolean isOpen() {
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public void close() throws IOException {
|
|
}
|
|
|
|
@Override
|
|
public int read(ByteBuffer dst) throws IOException {
|
|
if(!bbf.hasRemaining()) {
|
|
return -1;
|
|
}
|
|
int lmtl=Math.min(bbf.remaining() ,dst.remaining());
|
|
int olm=bbf.limit();
|
|
bbf.limit(bbf.position()+lmtl);
|
|
dst.put(bbf);
|
|
bbf.limit(olm);
|
|
return lmtl;
|
|
}
|
|
}
|
|
public static ReadableByteChannel newReadableChannel(ByteBuffer bbf) {
|
|
return new ByteBufferReadableByteChannel(bbf);
|
|
}
|
|
public static void readFully(ReadableByteChannel connectSocket, ByteBuffer szeRead) throws EOFException, IOException {
|
|
while (szeRead.hasRemaining()) {
|
|
if (connectSocket.read(szeRead) == -1) {
|
|
throw new EOFException();
|
|
}
|
|
}
|
|
}
|
|
}
|