private static void dump(String filename) throws IOException { System.out.printf("Dump %s%n", filename); RandomAccessFile raf = new RandomAccessFile(filename, "r"); NetcdfFile ncfile = new MyNetcdfFile(); // its a netcdf-3 file raf.order(RandomAccessFile.BIG_ENDIAN); N3header headerParser = new N3header(); headerParser.read(raf, ncfile, new Formatter(System.out)); raf.close(); }
@Override public void close() throws java.io.IOException { if (raf != null) { long size = header.calcFileSize(); raf.setMinLength( size); raf.close(); } raf = null; }
private long findAtt(long start_pos, String want) throws IOException { raf.seek(start_pos + 4); int natts = raf.readInt(); for (int i = 0; i < natts; i++) { String name = readString(); if (name.equals(want)) return raf.getFilePointer(); int type = raf.readInt(); if (type == 2) { readString(); } else { int nelems = raf.readInt(); DataType dtype = getDataType(type); int[] shape = {nelems}; Array arr = Array.factory(dtype, shape); IndexIterator ii = arr.getIndexIterator(); int nbytes = 0; for (int j = 0; j < nelems; j++) nbytes += readAttributeValue(dtype, ii); skip(nbytes); } } throw new IllegalArgumentException("no such attribute " + want); }
@Override public Object sendIospMessage(Object message) { if (null == header) return null; if (message == NetcdfFile.IOSP_MESSAGE_ADD_RECORD_STRUCTURE) return header.makeRecordStructure(); else if (message == NetcdfFile.IOSP_MESSAGE_REMOVE_RECORD_STRUCTURE) return header.removeRecordStructure(); return super.sendIospMessage(message); }
private int sizeAtts(List<Attribute> atts) { int size = 8; // magic, natts for (Attribute att : atts) { size += sizeString(att.getShortName()); size += 4; // type int type = getType(att.getDataType()); if (type == 2) { size += sizeStringValues(att); } else { size += 4; // nelems int nelems = att.getLength(); int nbytes = 0; for (int j = 0; j < nelems; j++) nbytes += sizeAttributeValue(att.getNumericValue(j)); size += nbytes; size += padding(nbytes); } } return size; }
private void writeAtts(List<Attribute> atts, Formatter fout) throws IOException { int n = atts.size(); if (n == 0) { raf.writeInt(0); raf.writeInt(0); } else { raf.writeInt(MAGIC_ATT); raf.writeInt(n); } for (int i = 0; i < n; i++) { if (fout != null) fout.format("***att %d pos= %d\n", i, raf.getFilePointer()); Attribute att = atts.get(i); writeString(att.getShortName()); int type = getType(att.getDataType()); raf.writeInt(type); if (type == 2) { writeStringValues(att); } else { int nelems = att.getLength(); raf.writeInt(nelems); int nbytes = 0; for (int j = 0; j < nelems; j++) nbytes += writeAttributeValue(att.getNumericValue(j)); pad(nbytes, (byte) 0); if (fout != null) fout.format(" end write val pos= %d\n", raf.getFilePointer()); } if (fout != null) fout.format(" %s\n", att); } }
writeString(var.getShortName()); raf.writeInt(dims.size()); for (Dimension dim : dims) { int dimIndex = findDimensionIndex(ncfile, dim); raf.writeInt(dimIndex); vsize += padding(vsize); writeAtts(var.getAttributes(), fout); int type = getType(dtype); raf.writeInt(type);
void updateAttribute(ucar.nc2.Variable v2, Attribute att) throws IOException { long pos; if (v2 == null) pos = findAtt(globalAttsPos, att.getShortName()); else { N3header.Vinfo vinfo = (N3header.Vinfo) v2.getSPobject(); pos = findAtt(vinfo.attsPos, att.getShortName()); DataType have = getDataType(type); DataType want = att.getDataType(); if (want == DataType.STRING) want = DataType.CHAR; String s = att.getStringValue(); int org = raf.readInt(); int size = org + padding(org); // ok to use the padding int max = Math.min(size, s.length()); // cant make any longer than size if (max > org) { // adjust if its using the padding, but not if its shorter int max = Math.min(nelems, att.getLength()); // cant make any longer for (int j = 0; j < max; j++) writeAttributeValue(att.getNumericValue(j));
String name = readString(); int len = raf.readInt(); Dimension dim; readAtts(ncfile.getRootGroup(), fout); String name = readString(); Variable var = new Variable(ncfile, ncfile.getRootGroup(), null, name); readAtts(var, fout); DataType dataType = getDataType(type); var.setDataType(dataType); long calcVsize = (velems + padding(velems)) * dataType.getSize(); if (vsize != calcVsize) fout.format(" *** readVsize %d != calcVsize %d%n", vsize, calcVsize); vsize = (velems + padding(velems)) * dataType.getSize();
@Override public boolean isValidFile(ucar.unidata.io.RandomAccessFile raf) throws IOException { return N3header.isValidFile(raf); }
public void create(String filename, ucar.nc2.NetcdfFile ncfile, int extra, long preallocateSize, boolean largeFile) throws IOException { this.ncfile = ncfile; this.readonly = false; // finish any structures ncfile.finish(); raf = new ucar.unidata.io.RandomAccessFile(filename, "rw"); raf.order(RandomAccessFile.BIG_ENDIAN); if (preallocateSize > 0) { java.io.RandomAccessFile myRaf = raf.getRandomAccessFile(); myRaf.setLength(preallocateSize); } header = new N3header(); header.create(raf, ncfile, extra, largeFile, null); //recsize = header.recsize; // record size //recStart = header.recStart; // record variables start here //fileUsed = headerParser.getMinLength(); // track what is actually used _create(raf); if (fill) fillNonRecordVariables(); //else // raf.setMinLength(recStart); // make sure file length is long enough, even if not written to. }
protected void setNumrecs(int n) throws IOException, InvalidRangeException { if (n <= header.numrecs) return; int startRec = header.numrecs; if (debugSize) System.out.println("extend records to = " + n); //fileUsed = recStart + recsize * n; header.setNumrecs(n); //this.numrecs = n; // need to let unlimited dimension know of new shape for (Dimension dim : ncfile.getDimensions()) { if (dim.isUnlimited()) dim.setLength(n); } // need to let all unlimited variables know of new shape for (Variable v : ncfile.getVariables()) { if (v.isUnlimited()) { v.resetShape(); v.setCachedData(null, false); } } // extend file, handle filling if (fill) fillRecordVariables(startRec, n); else raf.setMinLength( header.calcFileSize()); }
private Vinfo writeVar(DataOutputStream stream, Variable var, int offset) throws IOException { int hsize = 0; hsize += writeString(stream, N3iosp.makeValidNetcdfObjectName( var.getShortName())); // dimensions int vsize = var.getDataType().getSize(); List<Dimension> dims = var.getDimensions(); if (null != stream) stream.writeInt(dims.size()); hsize += 4; for (Dimension dim : dims) { int dimIndex = findDimensionIndex(dim); if (null != stream) stream.writeInt(dimIndex); hsize += 4; if (!dim.isUnlimited()) vsize *= dim.getLength(); } int pad = (usePadding) ? N3header.padding(vsize) : 0; vsize += pad; // variable attributes hsize += writeAtts(stream, var.getAttributes()); // data type, variable size, beginning file position int type = N3header.getType(var.getDataType()); if (null != stream) { stream.writeInt(type); stream.writeInt(vsize); stream.writeInt(offset); } hsize += 12; //if (debug) out.println(" name= "+name+" type="+type+" vsize="+vsize+" begin= "+begin+" isRecord="+isRecord+"\n"); return new Vinfo(var, hsize, vsize, offset, pad, var.isUnlimited()); }
private void writeString(String s) throws IOException { // if (s.length() == 0) // System.out.println("HEY"); byte[] b = s.getBytes(CDM.utf8Charset); // all strings are encoded in UTF-8 Unicode. raf.writeInt(b.length); raf.write(b); pad(b.length, (byte) 0); }
int type = N3header.getType(att.getDataType()); if (null != stream) stream.writeInt(type); hsize += 4;
private int sizeAtts(List<Attribute> atts) { int size = 8; // magic, natts for (Attribute att : atts) { size += sizeString(att.getShortName()); size += 4; // type int type = getType(att.getDataType()); if (type == 2) { size += sizeStringValues(att); } else { size += 4; // nelems int nelems = att.getLength(); int nbytes = 0; for (int j = 0; j < nelems; j++) nbytes += sizeAttributeValue(att.getNumericValue(j)); size += nbytes; size += padding(nbytes); } } return size; }
private void writeAtts(List<Attribute> atts, Formatter fout) throws IOException { int n = atts.size(); if (n == 0) { raf.writeInt(0); raf.writeInt(0); } else { raf.writeInt(MAGIC_ATT); raf.writeInt(n); } for (int i = 0; i < n; i++) { if (fout != null) fout.format("***att %d pos= %d%n", i, raf.getFilePointer()); Attribute att = atts.get(i); writeString(att.getShortName()); int type = getType(att.getDataType()); raf.writeInt(type); if (type == 2) { writeStringValues(att); } else { int nelems = att.getLength(); raf.writeInt(nelems); int nbytes = 0; for (int j = 0; j < nelems; j++) nbytes += writeAttributeValue(att.getNumericValue(j)); pad(nbytes, (byte) 0); if (fout != null) fout.format(" end write val pos= %d%n", raf.getFilePointer()); } if (fout != null) fout.format(" %s%n", att); } }
writeString(var.getShortName()); raf.writeInt(dims.size()); for (Dimension dim : dims) { int dimIndex = findDimensionIndex(ncfile, dim); raf.writeInt(dimIndex); vsize += padding(vsize); writeAtts(var.getAttributes(), fout); int type = getType(dtype); raf.writeInt(type);
void updateAttribute(ucar.nc2.Variable v2, Attribute att) throws IOException { long pos; if (v2 == null) pos = findAtt(globalAttsPos, att.getShortName()); else { N3header.Vinfo vinfo = (N3header.Vinfo) v2.getSPobject(); pos = findAtt(vinfo.attsPos, att.getShortName()); DataType have = getDataType(type); DataType want = att.getDataType(); if (want == DataType.STRING) want = DataType.CHAR; String s = att.getStringValue(); int org = raf.readInt(); int size = org + padding(org); // ok to use the padding int max = Math.min(size, s.length()); // cant make any longer than size if (max > org) { // adjust if its using the padding, but not if its shorter int max = Math.min(nelems, att.getLength()); // cant make any longer for (int j = 0; j < max; j++) writeAttributeValue(att.getNumericValue(j));
String name = readString(); int len = raf.readInt(); Dimension dim; readAtts(ncfile.getRootGroup().getAttributes(), fout); String name = readString(); Variable var = new Variable(ncfile, ncfile.getRootGroup(), null, name); readAtts(var.getAttributes(), fout); DataType dataType = getDataType(type); var.setDataType(dataType); long calcVsize = (velems + padding(velems)) * dataType.getSize(); if (vsize != calcVsize) fout.format(" *** readVsize %d != calcVsize %d\n", vsize, calcVsize); vsize = (velems + padding(velems)) * dataType.getSize();