gpt4 book ai didi

java - 使用 Java 7 AsynchronousFileChannel 附加到文件

转载 作者:搜寻专家 更新时间:2023-11-01 03:06:24 26 4
gpt4 key购买 nike

我正在尝试使用 AsynchronousFileChannel JAVA 7 API 以异步方式写入文件,但是我找不到一种简单的方法来附加到文件。

API 描述指出 AsynchronousFileChannel 不维护文件位置,您必须指定文件位置。这意味着您必须维护一个全局文件位置值。此外,这个全局状态应该是原子的,这样你才能正确地递增。

是否有使用 AsynchronousFileChannel 进行更新的更好方法?

另外,有人可以解释一下 API 中 Attachment 对象的用法吗?

public abstract <A> void write(ByteBuffer  src,
long position,
A attachment,
CompletionHandler<Integer ,? super A> handler)

javadoc 说:attachment - 要附加到 I/O 操作的对象;可以为空

这个附件对象有什么用?

谢谢!

最佳答案

What is the use of this attachment object?

附件是一个可以传递给完成处理程序的对象;将其视为提供背景的机会。您可以将它用于几乎所有您能想到的事情,从日志记录到同步,或者只是简单地忽略它。

I am trying the AsynchronousFileChannel JAVA 7 API to write a file in an async manner, however I could not find an easy way to append to the file.

异步通常有点棘手,附加到文件本质上是一个串行过程。也就是说,您可以并行执行此操作,但您必须对将下一个缓冲区内容附加到何处做一些簿记。我想它可能看起来像这样(使用 channel 本身作为“附件”):

class WriteOp implements CompletionHandler<Integer, AsynchronousFileChannel> {
private final ByteBuffer buf;
private long position;

WriteOp(ByteBuffer buf, long position) {
this.buf = buf;
this.position = position;
}

public void completed(Integer result, AsynchronousFileChannel channel) {
if ( buf.hasRemaining() ) { // incomplete write
position += result;
channel.write( buf, position, channel, this );
}
}

public void failed(Throwable ex, AsynchronousFileChannel channel) {
// ?
}
}

class AsyncAppender {
private final AsynchronousFileChannel channel;
/** Where new append operations are told to start writing. */
private final AtomicLong projectedSize;

AsyncAppender(AsynchronousFileChannel channel) throws IOException {
this.channel = channel;
this.projectedSize = new AtomicLong(channel.size());
}

public void append(ByteBuffer buf) {
final int buflen = buf.remaining();
long size;
do {
size = projectedSize.get();
while ( !projectedSize.compareAndSet(size, size + buflen) );

channel.write( buf, position, channel, new WriteOp(buf, size) );
}
}

关于java - 使用 Java 7 AsynchronousFileChannel 附加到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20791178/

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