gpt4 book ai didi

Java:用于读取和写入行的异步 I/O channel

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:31:44 27 4
gpt4 key购买 nike

我有一个应用程序使用 BufferedReaderPrintStream 同步读取和写入文本行,其中包含 InputStreamOutputStream java.net.Socket 对象的 。因此,我可以只使用方法 BufferedReader.readLine()PrintStream.println() 并让 Java 库将输入分成多行并为我格式化输出。

现在我想把这个同步IO换成异步IO。所以我一直在研究允许异步读写字节的AsynchronousSocketChannel。现在,我想要包装类,以便我可以使用字符串异步读取/写入行。

我在 Java 库中找不到这样的包装类。在我编写自己的实现之前,我想问一下是否有任何其他库允许包装 AsynchronousSocketChannel 并提供异步文本 IO。

最佳答案

你可以这样做

public void nioAsyncParse(AsynchronousSocketChannel channel, final int bufferSize) throws IOException, ParseException, InterruptedException {
ByteBuffer byteBuffer = ByteBuffer.allocate(bufferSize);
BufferConsumer consumer = new BufferConsumer(byteBuffer, bufferSize);
channel.read(consumer.buffer(), 0l, channel, consumer);
}


class BufferConsumer implements CompletionHandler<Integer, AsynchronousSocketChannel> {

private ByteBuffer bytes;
private StringBuffer chars;
private int limit;
private long position;
private DateFormat frmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

public BufferConsumer(ByteBuffer byteBuffer, int bufferSize) {
bytes = byteBuffer;
chars = new StringBuffer(bufferSize);
frmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
limit = bufferSize;
position = 0l;
}

public ByteBuffer buffer() {
return bytes;
}

@Override
public synchronized void completed(Integer result, AsynchronousSocketChannel channel) {

if (result!=-1) {
bytes.flip();
final int len = bytes.limit();
int i = 0;
try {
for (i = 0; i < len; i++) {
byte by = bytes.get();
if (by=='\n') {
// ***
// The code used to process the line goes here
// ***
chars.setLength(0);
}
else {
chars.append((char) by);
}
}
}
catch (Exception x) {
System.out.println("Caught exception " + x.getClass().getName() + " " + x.getMessage() + " i=" + String.valueOf(i) + ", limit=" + String.valueOf(len) + ", position="+String.valueOf(position));
}

if (len==limit) {
bytes.clear();
position += len;
channel.read(bytes, position, channel, this);
}
else {
try {
channel.close();
}
catch (IOException e) { }
bytes.clear();
buffers.add(bytes);
}
}
else {
try {
channel.close();
}
catch (IOException e) { }
bytes.clear();
buffers.add(bytes);
}
}

@Override
public void failed(Throwable e, AsynchronousSocketChannel channel) {
}
};

关于Java:用于读取和写入行的异步 I/O channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37545236/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com