IO流RandomAccessFile类用例

本文介绍如何使用Java的RandomAccessFile类将整数序列写入文件,并按相反顺序读出这些数据。通过实例演示了整数序列的存储与逆序读取过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
* 此类的实例支持对随机访问文件的读取和写入
* 编写一个Java应用程序,利用RandomAccessFile类,
* 把几个int型整数(1,2,3,4,5,6,7,8,9,10)写入到一个名字为tom.dat文件中,
* 然后按相反顺序读出这些数据并显示在屏幕上。(注意,一个int型数据占4个字节)
* @author Administrator
*/
public class RandomAccessFileTest {

public static void main(String[] args){
int[] num = new int[]{1,2,3,4,5,6,7,8,9,10};
try {
//创建从中读取和向其中写入(可选)的随机访问文件流
RandomAccessFile raf = new RandomAccessFile(new File("tom.dat"), "rw");
for(int i = 0;i < num.length;i++){
// 将数组写入文件
raf.writeInt(num[i]);
}
long len = raf.getFilePointer();
System.out.println("len--> " + len);
while(len > 0){
len -= 4;
// 定位到文件中要读取的数字前4个字节
raf.seek(len);
// 从该文件的当前文件指针开始读取 4 个字节
System.out.print(" " + raf.readInt());
}
}catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}

现有5java,请将这些java转化为对应功能的c++ 1.package careray.structure.header; import java.util.LinkedHashMap; import careray.structure.Constants; import careray.utils.Tools; public class SeqFileHeader extends Header { private static final String TYPE_CODE_SEQ = "SEQ"; public static final int FILE_HEADER_LENGTH = 1024; private short[] data; private static LinkedHashMap<String, Integer> IMAGE_PROPERTIES = new LinkedHashMap<String, Integer>(); static { IMAGE_PROPERTIES.put("typeCode", 8); IMAGE_PROPERTIES.put("fileHeaderSize", 4); IMAGE_PROPERTIES.put("fileSize", 4); IMAGE_PROPERTIES.put("imgWidth", 4); IMAGE_PROPERTIES.put("imgHeight", 4); IMAGE_PROPERTIES.put("bitDepth", 4); IMAGE_PROPERTIES.put("storageType", 4); IMAGE_PROPERTIES.put("endianType", 4); IMAGE_PROPERTIES.put("compressType", 4); IMAGE_PROPERTIES.put("startTime", 24); IMAGE_PROPERTIES.put("endTime", 24); IMAGE_PROPERTIES.put("frameNum", 4); IMAGE_PROPERTIES.put("frameRate", 4); IMAGE_PROPERTIES.put("frameHeaderSize", 4); } private String typeCode = TYPE_CODE_SEQ; private int fileHeaderSize = FILE_HEADER_LENGTH; private int fileSize; private int imgWidth; private int imgHeight; private int bitDepth = 16; private int storageType = 16; private int endianType = Constants.ENDIAN_INTEL; private int compressType = 0; private String startTime; private String endTime; private int frameNum; private float frameRate; private int frameHeaderSize = FrameHeader.FRAME_HEADER_LENGTH; private static LinkedHashMap<String, Integer> DETECTOR_PROPERTIES = new LinkedHashMap<String, Integer>(); static { DETECTOR_PROPERTIES.put("machineID", 16); DETECTOR_PROPERTIES.put("hwVersion", 32); DETECTOR_PROPERTIES.put("fmVersion", 32); DETECTOR_PROPERTIES.put("modeID", 4); DETECTOR_PROPERTIES.put("triggerMode", 4); DETECTOR_PROPERTIES.put("exposeWin", 4); } public String toString() { StringBuilder sb = new StringBuilder(); sb.append("typeCode: ").append(typeCode).append(Constants.NEW_LINE).append("fileHeaderSize: ") .append(fileHeaderSize).append(Constants.NEW_LINE).append("fileSize: ").append(fileSize) .append(Constants.NEW_LINE).append("imgWidth: ").append(imgWidth).append(Constants.NEW_LINE) .append("imgHeight: ").append(imgHeight).append(Constants.NEW_LINE).append("bitDepth: ") .append(bitDepth).append(Constants.NEW_LINE).append("storageType: ").append(storageType) .append(Constants.NEW_LINE).append("startTime: ").append(startTime).append(Constants.NEW_LINE) .append("endTime: ").append(endTime).append(Constants.NEW_LINE).append("frameNum: ").append(frameNum) .append(Constants.NEW_LINE).append("frameRate: ").append(frameRate).append(Constants.NEW_LINE) .append("frameHeaderSize: ").append(frameHeaderSize).append(Constants.NEW_LINE); return sb.toString(); } private String machineID; private String hwVersion; private String fmVersion; private int modeID; private int triggerMode; private int exposeWin; private static LinkedHashMap<String, Integer> API_PROPERTIES = new LinkedHashMap<String, Integer>(); static { API_PROPERTIES.put("swVersion", 8); API_PROPERTIES.put("GWS_IP", 16); API_PROPERTIES.put("offsetCorrected", 4); API_PROPERTIES.put("gainCorrected", 4); API_PROPERTIES.put("defectCorrected", 4); API_PROPERTIES.put("denoised", 4); API_PROPERTIES.put("DGC", 4); API_PROPERTIES.put("resized", 4); API_PROPERTIES.put("LUT", 4); API_PROPERTIES.put("description", 128); } private String swVersion = "SDK5.1.0"; private String GWS_IP = "127.0.0.1"; private int offsetCorrected = 0; private int gainCorrected = 0; private int defectCorrected = 0; private int denoised = 0; private int DGC = 0; private int resized = 0; private int LUT = 0; private String description; private short[] generateHeaderData() { short[] headerData = new short[FILE_HEADER_LENGTH]; int offset = 0; int elementSize = IMAGE_PROPERTIES.get("typeCode") / Constants.BYTES_PER_SHORT; System.arraycopy(getShortData(Tools.getFixLengthStr(typeCode, IMAGE_PROPERTIES.get("typeCode")).getBytes()), 0, headerData, offset, elementSize); offset += elementSize; elementSize = IMAGE_PROPERTIES.get("fileHeaderSize") / Constants.BYTES_PER_SHORT; System.arraycopy(getShortData(fileHeaderSize), 0, headerData, offset, elementSize); offset += elementSize; elementSize = IMAGE_PROPERTIES.get("fileSize") / Constants.BYTES_PER_SHORT; System.arraycopy(getShortData(fileSize), 0, headerData, offset, elementSize); offset += elementSize; elementSize = IMAGE_PROPERTIES.get("imgWidth") / Constants.BYTES_PER_SHORT; System.arraycopy(getShortData(imgWidth), 0, headerData, offset, elementSize); offset += elementSize; elementSize = IMAGE_PROPERTIES.get("imgHeight") / Constants.BYTES_PER_SHORT; System.arraycopy(getShortData(imgHeight), 0, headerData, offset, elementSize); offset += elementSize; elementSize = IMAGE_PROPERTIES.get("bitDepth") / Constants.BYTES_PER_SHORT; System.arraycopy(getShortData(bitDepth), 0, headerData, offset, elementSize); offset += elementSize; elementSize = IMAGE_PROPERTIES.get("storageType") / Constants.BYTES_PER_SHORT; System.arraycopy(getShortData(storageType), 0, headerData, offset, elementSize); offset += elementSize; elementSize = IMAGE_PROPERTIES.get("endianType") / Constants.BYTES_PER_SHORT; System.arraycopy(getShortData(endianType), 0, headerData, offset, elementSize); offset += elementSize; elementSize = IMAGE_PROPERTIES.get("compressType") / Constants.BYTES_PER_SHORT; System.arraycopy(getShortData(compressType), 0, headerData, offset, elementSize); offset += elementSize; elementSize = IMAGE_PROPERTIES.get("startTime") / Constants.BYTES_PER_SHORT; System.arraycopy(getShortData(Tools.getFixLengthStr(startTime, IMAGE_PROPERTIES.get("startTime")).getBytes()), 0, headerData, offset, elementSize); offset += elementSize; elementSize = IMAGE_PROPERTIES.get("endTime") / Constants.BYTES_PER_SHORT; System.arraycopy(getShortData(Tools.getFixLengthStr(endTime, IMAGE_PROPERTIES.get("endTime")).getBytes()), 0, headerData, offset, elementSize); offset += elementSize; elementSize = IMAGE_PROPERTIES.get("frameNum") / Constants.BYTES_PER_SHORT; System.arraycopy(getShortData(frameNum), 0, headerData, offset, elementSize); offset += elementSize; elementSize = IMAGE_PROPERTIES.get("frameRate") / Constants.BYTES_PER_SHORT; System.arraycopy(getShortData(frameRate), 0, headerData, offset, elementSize); offset += elementSize; elementSize = IMAGE_PROPERTIES.get("frameHeaderSize") / Constants.BYTES_PER_SHORT; System.arraycopy(getShortData(frameHeaderSize), 0, headerData, offset, elementSize); return headerData; } public short[] getData() { if (data == null) { data = generateHeaderData(); } return data; } public void parse() { if (data == null) return; int offset = 0; typeCode = getString(data, offset, IMAGE_PROPERTIES.get("typeCode")).trim(); offset += IMAGE_PROPERTIES.get("typeCode") / Constants.BYTES_PER_SHORT; fileHeaderSize = getU32ByLE(data, offset); offset += IMAGE_PROPERTIES.get("fileHeaderSize") / Constants.BYTES_PER_SHORT; fileSize = getU32ByLE(data, offset); offset += IMAGE_PROPERTIES.get("fileSize") / Constants.BYTES_PER_SHORT; imgWidth = getU32ByLE(data, offset); offset += IMAGE_PROPERTIES.get("imgWidth") / Constants.BYTES_PER_SHORT; imgHeight = getU32ByLE(data, offset); offset += IMAGE_PROPERTIES.get("imgHeight") / Constants.BYTES_PER_SHORT; bitDepth = getU32ByLE(data, offset); offset += IMAGE_PROPERTIES.get("bitDepth") / Constants.BYTES_PER_SHORT; storageType = getU32ByLE(data, offset); offset += IMAGE_PROPERTIES.get("storageType") / Constants.BYTES_PER_SHORT; endianType = getU32ByLE(data, offset); offset += IMAGE_PROPERTIES.get("endianType") / Constants.BYTES_PER_SHORT; compressType = getU32ByLE(data, offset); offset += IMAGE_PROPERTIES.get("compressType") / Constants.BYTES_PER_SHORT; startTime = getString(data, offset, IMAGE_PROPERTIES.get("startTime")).trim(); offset += IMAGE_PROPERTIES.get("startTime") / Constants.BYTES_PER_SHORT; endTime = getString(data, offset, IMAGE_PROPERTIES.get("endTime")).trim(); offset += IMAGE_PROPERTIES.get("endTime") / Constants.BYTES_PER_SHORT; frameNum = getU32ByLE(data, offset); offset += IMAGE_PROPERTIES.get("frameNum") / Constants.BYTES_PER_SHORT; frameRate = getFloatByLE(data, offset); offset += IMAGE_PROPERTIES.get("frameRate") / Constants.BYTES_PER_SHORT; frameHeaderSize = getU32ByLE(data, offset); } public void setData(short[] data) { this.data = data; } public String getTypeCode() { return typeCode; } public void setTypeCode(String typeCode) { this.typeCode = typeCode; } public int getFileHeaderSize() { return fileHeaderSize; } public void setFileHeaderSize(int fileHeaderSize) { this.fileHeaderSize = fileHeaderSize; } public int getFileSize() { return fileSize; } public void setFileSize(int fileSize) { this.fileSize = fileSize; } public int getImgWidth() { return imgWidth; } public void setImgWidth(int imgWidth) { this.imgWidth = imgWidth; } public int getImgHeight() { return imgHeight; } public void setImgHeight(int imgHeight) { this.imgHeight = imgHeight; } public int getBitDepth() { return bitDepth; } public void setBitDepth(int bitDeepth) { this.bitDepth = bitDeepth; } public int getStorageType() { return storageType; } public void setStorageType(int storageType) { this.storageType = storageType; } public int getEndianType() { return endianType; } public void setEndianType(int endianType) { this.endianType = endianType; } public int getCompressType() { return compressType; } public void setCompressType(int compressType) { this.compressType = compressType; } public String getStartTime() { return startTime; } public void setStartTime(String startTime) { this.startTime = startTime; } public String getEndTime() { return endTime; } public void setEndTime(String endTime) { this.endTime = endTime; } public int getFrameNum() { return frameNum; } public void setFrameNum(int frameNum) { this.frameNum = frameNum; } public float getFrameRate() { return frameRate; } public void setFrameRate(float frameRate) { this.frameRate = frameRate; } public int getFrameHeaderSize() { return frameHeaderSize; } public void setFrameHeaderSize(int frameHeaderSize) { this.frameHeaderSize = frameHeaderSize; } public String getMachineID() { return machineID; } public void setMachineID(String machineID) { this.machineID = machineID; } public String getHwVersion() { return hwVersion; } public void setHwVersion(String hwVersion) { this.hwVersion = hwVersion; } public String getFmVersion() { return fmVersion; } public void setFmVersion(String fmVersion) { this.fmVersion = fmVersion; } public int getModeID() { return modeID; } public void setModeID(int modeID) { this.modeID = modeID; } public int getTriggerMode() { return triggerMode; } public void setTriggerMode(int triggerMode) { this.triggerMode = triggerMode; } public int getExposeWin() { return exposeWin; } public void setExposeWin(int exposeWin) { this.exposeWin = exposeWin; } public String getSwVersion() { return swVersion; } public void setSwVersion(String swVersion) { this.swVersion = swVersion; } public String getGWS_IP() { return GWS_IP; } public void setGWS_IP(String gWS_IP) { GWS_IP = gWS_IP; } public int getOffsetCorrected() { return offsetCorrected; } public void setOffsetCorrected(int offsetCorrected) { this.offsetCorrected = offsetCorrected; } public int getGainCorrected() { return gainCorrected; } public void setGainCorrected(int gainCorrected) { this.gainCorrected = gainCorrected; } public int getDefectCorrected() { return defectCorrected; } public void setDefectCorrected(int defectCorrected) { this.defectCorrected = defectCorrected; } public int getDenoised() { return denoised; } public void setDenoised(int denoised) { this.denoised = denoised; } public int getDGC() { return DGC; } public void setDGC(int dGC) { DGC = dGC; } public int getResized() { return resized; } public void setResized(int resized) { this.resized = resized; } public int getLUT() { return LUT; } public void setLUT(int lUT) { LUT = lUT; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } } 2.package careray.structure.header; import java.util.LinkedHashMap; import careray.structure.Constants; public class FrameHeader extends Header { public static int FRAME_HEADER_LENGTH = 256; public static final int HEADER_RESERVED_LENGTH = 6; public static final int DETECTOR_RESERVED_LENGTH = 126; public static final int SERVER_RESERVED_LENGTH = 75; /** * Map th save the names and sizes of the properties in header */ private static LinkedHashMap<String, Integer> PROPERTIES = new LinkedHashMap<String, Integer>(); static { PROPERTIES.put("length", 2); PROPERTIES.put("frameID", 4); PROPERTIES.put("relativeAcqTime", 4); PROPERTIES.put("absAcqTime", 8); PROPERTIES.put("blockLen", 4); PROPERTIES.put("avgTemp", 4); PROPERTIES.put("maxTemp", 4); PROPERTIES.put("vcmp", 4); PROPERTIES.put("vbias", 4); PROPERTIES.put("gain", 1); PROPERTIES.put("modeID", 1); PROPERTIES.put("detectorIndex", 1); PROPERTIES.put("qualityType", 1); PROPERTIES.put("offsetFlag", 1); PROPERTIES.put("gainFlag", 1); PROPERTIES.put("defectFlag", 1); PROPERTIES.put("crc", 4); } private short[] data = new short[FRAME_HEADER_LENGTH / Constants.BYTES_PER_SHORT]; private static int length = 256; private boolean spotFilm; private int frameID; private long absAcqTime; private int relativeAcqTime; private int blockLen; private float avgTemp; private float maxTemp; private float vcmp; private float vbias; private int gain; private int modeID; private int detectorIndex; private int qualityType; private int offsetFlag; private int gainFlag; private int defectFlag; private int crc; public void parse(short[] data) { System.arraycopy(data, 0, this.data, 0, data.length); parse(); } public void parse() { int offset = 0; length = data[offset]; spotFilm = 1 == (data[PROPERTIES.get("length") / Constants.BYTES_PER_SHORT] & 0xff); offset += (HEADER_RESERVED_LENGTH + PROPERTIES.get("length")) / Constants.BYTES_PER_SHORT; frameID = getU32ByLE(data, offset); offset += PROPERTIES.get("frameID") / Constants.BYTES_PER_SHORT; relativeAcqTime = getU32ByLE(data, offset) & 0xffffff; offset += PROPERTIES.get("relativeAcqTime") / Constants.BYTES_PER_SHORT; absAcqTime = getLong(data, offset) & 0xffffffff; offset += PROPERTIES.get("absAcqTime") / Constants.BYTES_PER_SHORT; blockLen = getU32ByLE(data, offset); offset += PROPERTIES.get("blockLen") / Constants.BYTES_PER_SHORT; avgTemp = getFloatByLE(data, offset); offset += PROPERTIES.get("avgTemp") / Constants.BYTES_PER_SHORT; maxTemp = getFloatByLE(data, offset); offset += PROPERTIES.get("maxTemp") / Constants.BYTES_PER_SHORT; vcmp = getFloatByLE(data, offset); offset += PROPERTIES.get("vcmp") / Constants.BYTES_PER_SHORT; vbias = getFloatByLE(data, offset); offset += PROPERTIES.get("vbias") / Constants.BYTES_PER_SHORT; short temp = data[offset]; gain = temp & 0x00ff; modeID = (temp >> 8) & 0x00ff; offset += 1; offset += DETECTOR_RESERVED_LENGTH / Constants.BYTES_PER_SHORT; temp = data[offset]; detectorIndex = temp & 0x00ff; qualityType = (temp >> 8) & 0x00ff; offset += 1; temp = data[offset]; offsetFlag = temp & 0x00ff; gainFlag = (temp >> 8) & 0x00ff; offset += 1; temp = data[offset]; defectFlag = temp & 0x00ff; offset += (SERVER_RESERVED_LENGTH - 1) / Constants.BYTES_PER_SHORT; crc = getU32ByLE(data, offset); } public String toString() { StringBuilder sb = new StringBuilder(); sb.append("length: ").append(length).append(Constants.NEW_LINE).append("spotFilm: ").append(spotFilm) .append(Constants.NEW_LINE).append("frameID: ").append(frameID).append(Constants.NEW_LINE) .append("absAcqTime: ").append(absAcqTime).append(Constants.NEW_LINE).append("relativeAcqTime: ") .append(relativeAcqTime).append(Constants.NEW_LINE).append("blockLen: ").append(blockLen) .append(Constants.NEW_LINE).append("avgTemp: ").append(avgTemp).append(Constants.NEW_LINE) .append("maxTemp: ").append(maxTemp).append(Constants.NEW_LINE).append("vcmp: ").append(vcmp) .append(Constants.NEW_LINE).append("vbias: ").append(vbias).append(Constants.NEW_LINE).append("gain: ") .append(gain).append(Constants.NEW_LINE).append("modeID: ").append(modeID).append(Constants.NEW_LINE) .append("detectorIndex: ").append(detectorIndex).append(Constants.NEW_LINE).append("qualityType: ") .append(qualityType).append(Constants.NEW_LINE).append("offsetFlag: ").append(offsetFlag) .append(Constants.NEW_LINE).append("gainFlag: ").append(gainFlag).append(Constants.NEW_LINE) .append("defectFlag: ").append(defectFlag).append(Constants.NEW_LINE).append("crc: ").append(crc) .append(Constants.NEW_LINE); return sb.toString(); } public short[] getData() { return data; } public void setData(short[] data) { this.data = data; } public int getFrameID() { return frameID; } public void setFrameID(int frameID) { this.frameID = frameID; } public int getGain() { return gain; } public void setGain(int gain) { this.gain = gain; } public int getModeID() { return modeID; } public void setModeID(int modeID) { this.modeID = modeID; } public static LinkedHashMap<String, Integer> getPROPERTIES() { return PROPERTIES; } public static void setPROPERTIES(LinkedHashMap<String, Integer> pROPERTIES) { PROPERTIES = pROPERTIES; } public long getAbsAcqTime() { return absAcqTime; } public void setAbsAcqTime(long absAcqTime) { this.absAcqTime = absAcqTime; } public int getRelativeAcqTime() { return relativeAcqTime; } public void setRelativeAcqTime(int relativeAcqTime) { this.relativeAcqTime = relativeAcqTime; } public int getBlockLen() { return blockLen; } public void setBlockLen(int blockLen) { this.blockLen = blockLen; } public float getAvgTemp() { return avgTemp; } public void setAvgTemp(float avgTemp) { this.avgTemp = avgTemp; } public float getMaxTemp() { return maxTemp; } public void setMaxTemp(float maxTemp) { this.maxTemp = maxTemp; } public float getVcmp() { return vcmp; } public void setVcmp(float vcmp) { this.vcmp = vcmp; } public float getVbias() { return vbias; } public void setVbias(float vbias) { this.vbias = vbias; } public int getDetectorIndex() { return detectorIndex; } public void setDetectorIndex(int detectorIndex) { this.detectorIndex = detectorIndex; } public int getQualityType() { return qualityType; } public void setQualityType(int qualityType) { this.qualityType = qualityType; } public int getOffsetFlag() { return offsetFlag; } public void setOffsetFlag(int offsetFlag) { this.offsetFlag = offsetFlag; } public int getGainFlag() { return gainFlag; } public void setGainFlag(int gainFlag) { this.gainFlag = gainFlag; } public int getDefectFlag() { return defectFlag; } public void setDefectFlag(int defectFlag) { this.defectFlag = defectFlag; } public int getCrc() { return crc; } public void setCrc(int crc) { this.crc = crc; } public static int getFrameHeaderLength() { return FRAME_HEADER_LENGTH; } public static int getHeaderReservedLength() { return HEADER_RESERVED_LENGTH; } public static int getDetectorReservedLength() { return DETECTOR_RESERVED_LENGTH; } public static int getServerReservedLength() { return SERVER_RESERVED_LENGTH; } public boolean isSpotFilm() { return spotFilm; } public static int getLength() { return length; } public static void setLength(int length) { FrameHeader.length = length; } } 3.package careray; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import javax.swing.DefaultBoundedRangeModel; import javax.swing.JScrollBar; import org.apache.log4j.Logger; import careray.fluoro.FixedSizeCircularArray; import careray.fluoro.FluoroGUI; import careray.fluoro.FrameInfo; import careray.structure.Constants; import careray.structure.header.FrameHeader; import careray.structure.header.SeqFileHeader; import careray.utils.RawImgUtils; import ij.ImagePlus; import ij.ImageStack; import ij.io.OpenDialog; import ij.io.RandomAccessStream; public class SeqReader { private static final boolean INTEL_BYTE_ORDER = true; private String directory; private String name; private InputStream in; /** * log recorder */ private static Logger logger = Logger.getLogger(SeqReader.class); public SeqReader(String directory, String name) { this.directory = directory; this.name = name; } public SeqReader() { } public ImagePlus read() { if (name == null || directory == null) { OpenDialog od = new OpenDialog("Open Raw...", ""); directory = od.getDirectory(); name = od.getFileName(); if (name == null || directory == null) return null; } try { // get the inputStream to read the file in = new RandomAccessStream(new RandomAccessFile(new File(directory, name), "r")); SeqFileHeader header = readFileHeader(); ImagePlus imp = readFrames(header); in.close(); return imp; } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } private SeqFileHeader readFileHeader() throws IOException { short[] headerData = RawImgUtils.read16bitData(in, SeqFileHeader.FILE_HEADER_LENGTH, INTEL_BYTE_ORDER); SeqFileHeader header = new SeqFileHeader(); header.setData(headerData); header.parse(); logger.info("Seq file header: " + header.toString()); return header; } private ImagePlus readFrames(SeqFileHeader header) throws IOException { int width = header.getImgWidth(); int height = header.getImgHeight(); int frameNum = header.getFrameNum(); int byteCount = width * height * Constants.BYTES_PER_SHORT; ImageStack stack = new ImageStack(width, height, StartWrap.isCareImage() ? frameNum : 1); ImagePlus imp = null; FixedSizeCircularArray frameBuffer = new FixedSizeCircularArray(frameNum, width, height); FrameHeader frameHeader; FrameInfo frame; int firstFrameID = 0; for (int i = 0; i < frameNum; i++) { frame = frameBuffer.nextToInit(); frameHeader = frame.getHeader(); RawImgUtils.read16bitData(in, header.getFrameHeaderSize(), INTEL_BYTE_ORDER, frameHeader.getData()); frameHeader.parse(); frame.setFrameID(frameHeader.getFrameID() == 0 ? i + 1 : frameHeader.getFrameID()); RawImgUtils.read16bitData(in, byteCount, INTEL_BYTE_ORDER, frame.getFrameData()); stack.setPixels(frame.getFrameData(), StartWrap.isCareImage() ? i + 1 : 1); if (0 == i) { firstFrameID = frameHeader.getFrameID(); imp = new ImagePlus(name, stack, frameNum, true); } } imp.setFrameBuffer(frameBuffer); imp.show(); if (StartWrap.isFluoroApp()) { JScrollBar scrollBar = FluoroGUI.getInstance().getJScrollBar1(); DefaultBoundedRangeModel model = new DefaultBoundedRangeModel(firstFrameID, 1, firstFrameID, firstFrameID + frameNum); scrollBar.setModel(model); } return imp; } } 4.package careray.fluoro; import careray.structure.header.FrameHeader; public class FrameInfo { private short[] frameData; private FrameHeader header; private int frameID; public FrameInfo(int frameID, FrameHeader header, short[] frameData) { this.frameID = frameID; this.header = header; this.frameData = frameData; } public FrameInfo(int imgWidth, int imgHeight) { this.header = new FrameHeader(); this.frameData = new short[imgWidth * imgHeight]; } public short[] getFrameData() { return frameData; } public void setFrameData(short[] frameData) { this.frameData = frameData; } public FrameHeader getHeader() { return header; } public void setHeader(FrameHeader header) { this.header = header; } public int getFrameID() { return frameID; } public void setFrameID(int frameID) { this.frameID = frameID; } } 5.package careray; import java.io.BufferedOutputStream; import java.io.DataOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import javax.swing.JDialog; import org.apache.log4j.Logger; import careray.fluoro.FrameInfo; import careray.structure.Constants; import careray.structure.header.FrameHeader; import careray.structure.header.SeqFileHeader; import careray.utils.RawImgUtils; import ij.ImagePlus; import ij.io.FileInfo; import ij.io.ImageWriter; public class SeqWriter { /** * log recorder */ private static Logger logger = Logger.getLogger(SeqWriter.class); private FileInfo fi; private long startTime, endTime; public SeqWriter(ImagePlus imp) { fi = imp.getFileInfo(); fi.intelByteOrder = true; if (imp.getFrameBuffer() != null) { ArrayList<FrameInfo> list = imp.getFrameBuffer().asArrayList(); int minFrameID = 1; int maxFrameID = fi.nImages; if (imp.isHasFrameHeader() && list.get(0).getFrameID() != 0) { minFrameID = list.get(0).getFrameID(); maxFrameID = list.get(list.size() - 1).getFrameID(); } DynamicImgSaveDialog dialog = new DynamicImgSaveDialog(1, maxFrameID - minFrameID + 1, imp.getTitle(), Constants.POSTFIX_SEQ); dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); dialog.setLocationRelativeTo(null); dialog.setVisible(true); fi.directory = dialog.getPath(); if (dialog.getPath() == null) return; if (!fi.directory.endsWith(Constants.POSTFIX_SEQ)) fi.directory += Constants.POSTFIX_SEQ; int startFrameID = dialog.getStartFrameID() + minFrameID - 1; int endFrameID = dialog.getEndFrameID() + minFrameID - 1; fi.nImages = endFrameID - startFrameID + 1; Object[] data = new Object[fi.nImages]; int frameID; int i = 0; FrameInfo frameInfo; for (Iterator<FrameInfo> iter = list.iterator(); iter.hasNext();) { frameInfo = iter.next(); frameID = frameInfo.getFrameID(); if (frameID == 0) frameID = i + 1; if (frameID >= startFrameID && frameID <= endFrameID) { data[i++] = new short[][] {(short[])frameInfo.getHeader().getData(), (short[])frameInfo.getFrameData()}; } } // calculate the absolute time of the first frame if (imp.getAcqStartTime() > 0) { startTime = list.get(0).getHeader().getAbsAcqTime(); endTime = list.get(list.size() - 1).getHeader().getAbsAcqTime(); } fi.pixels = data; } } public void write() { if (fi.directory == null) return; try { // create an outputStream DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(fi.directory))); // 1. write header into file writeHeader(out); // write data of every frame into file writeData(out); out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private void writeData(DataOutputStream out) throws IOException { new ImageWriter(fi).writeSeq(out); } private void writeHeader(DataOutputStream out) throws IOException { SeqFileHeader fileHeader = new SeqFileHeader(); fileHeader.setImgWidth(fi.width); fileHeader.setImgHeight(fi.height); fileHeader.setFrameNum(fi.nImages); fileHeader.setFrameRate(12.5f); if (startTime > 0 && endTime > 0) { SimpleDateFormat dFormat = new SimpleDateFormat(Constants.TIME_FORMAT_WITH_MS); fileHeader.setStartTime(dFormat.format(new Date(startTime))); fileHeader.setEndTime(dFormat.format(new Date(endTime))); } int fileSize = SeqFileHeader.FILE_HEADER_LENGTH + (FrameHeader.FRAME_HEADER_LENGTH + fi.width * fi.height * Constants.BYTES_PER_SHORT) * fi.nImages; fileHeader.setFileSize(fileSize); RawImgUtils.write16BitData(out, fileHeader.getData(), SeqFileHeader.FILE_HEADER_LENGTH, true); } }
07-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值