gpt4 book ai didi

java - 如何实现可以倒带的 OutputStream?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:11:15 26 4
gpt4 key购买 nike

将一些处理后的内容写出到输出流后,我需要重新访问流的开头并写出一些内容元数据。我正在写入的数据非常大,多达 4Gb,并且可能会直接写入文件或内存缓冲区,具体取决于各种环境因素。

如何实现一个 OutputStream,让我在完成内容写入后写出标题?

最佳答案

这是一个随机访问文件输出流。

请注意,如果将它用于大量流式输出,您可以暂时将其包装在 BufferedOutputStream 中以避免大量小写入(在丢弃包装器或直接使用底层流之前一定要确保刷新它)。

import java.io.*;

/**
* A positionable file output stream.
* <p>
* Threading Design : [x] Single Threaded [ ] Threadsafe [ ] Immutable [ ] Isolated
*/

public class RandomFileOutputStream
extends OutputStream
{

// *****************************************************************************
// INSTANCE PROPERTIES
// *****************************************************************************

protected RandomAccessFile randomFile; // the random file to write to
protected boolean sync; // whether to synchronize every write

// *****************************************************************************
// INSTANCE CONSTRUCTION/INITIALIZATON/FINALIZATION, OPEN/CLOSE
// *****************************************************************************

public RandomFileOutputStream(String fnm) throws IOException {
this(fnm,false);
}

public RandomFileOutputStream(String fnm, boolean syn) throws IOException {
this(new File(fnm),syn);
}

public RandomFileOutputStream(File fil) throws IOException {
this(fil,false);
}

public RandomFileOutputStream(File fil, boolean syn) throws IOException {
super();

File par; // parent file

fil=fil.getAbsoluteFile();
if((par=fil.getParentFile())!=null) { IoUtil.createDir(par); }
randomFile=new RandomAccessFile(fil,"rw");
sync=syn;
}

// *****************************************************************************
// INSTANCE METHODS - OUTPUT STREAM IMPLEMENTATION
// *****************************************************************************

public void write(int val) throws IOException {
randomFile.write(val);
if(sync) { randomFile.getFD().sync(); }
}

public void write(byte[] val) throws IOException {
randomFile.write(val);
if(sync) { randomFile.getFD().sync(); }
}

public void write(byte[] val, int off, int len) throws IOException {
randomFile.write(val,off,len);
if(sync) { randomFile.getFD().sync(); }
}

public void flush() throws IOException {
if(sync) { randomFile.getFD().sync(); }
}

public void close() throws IOException {
randomFile.close();
}

// *****************************************************************************
// INSTANCE METHODS - RANDOM ACCESS EXTENSIONS
// *****************************************************************************

public long getFilePointer() throws IOException {
return randomFile.getFilePointer();
}

public void setFilePointer(long pos) throws IOException {
randomFile.seek(pos);
}

public long getFileSize() throws IOException {
return randomFile.length();
}

public void setFileSize(long len) throws IOException {
randomFile.setLength(len);
}

public FileDescriptor getFD() throws IOException {
return randomFile.getFD();
}

} // END PUBLIC CLASS

关于java - 如何实现可以倒带的 OutputStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/825732/

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