下面列出了java.io.DataInputStream#readShort ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/**
* http://stackoverflow.com/questions/1649674/resolve-class-name-from-bytecode
*
* @param bytes
* @return
* @throws Exception
*/
public static String getClassName(byte[] bytes) throws Exception {
DataInputStream dis = new DataInputStream(
new ByteArrayInputStream(bytes));
dis.readLong(); // skip header and class version
int cpcnt = (dis.readShort() & 0xffff) - 1;
int[] classes = new int[cpcnt];
String[] strings = new String[cpcnt];
for (int i = 0; i < cpcnt; i++) {
int t = dis.read();
if (t == 7)
classes[i] = dis.readShort() & 0xffff;
else if (t == 1)
strings[i] = dis.readUTF();
else if (t == 5 || t == 6) {
dis.readLong();
i++;
} else if (t == 8)
dis.readShort();
else
dis.readInt();
}
dis.readShort(); // skip access flags
return strings[classes[(dis.readShort() & 0xffff) - 1] - 1].replace('/',
'.');
}
private AttributeList readAttributeList(DataInputStream in, String[] names)
throws IOException {
AttributeList result = null;
for (int num = in.readByte(); num > 0; --num) {
short nameId = in.readShort();
int type = in.readByte();
int modifier = in.readByte();
short valueId = in.readShort();
String value = (valueId == -1) ? null : names[valueId];
Vector<String> values = null;
short numValues = in.readShort();
if (numValues > 0) {
values = new Vector<String>(numValues);
for (int i = 0; i < numValues; i++) {
values.addElement(names[in.readShort()]);
}
}
result = new AttributeList(names[nameId], type, modifier, value,
values, result);
// We reverse the order of the linked list by doing this, but
// that order isn't important.
}
return result;
}
public static ReplicaMetadataRequest readFrom(DataInputStream stream, ClusterMap clusterMap,
FindTokenHelper findTokenHelper) throws IOException {
Short versionId = stream.readShort();
validateVersion(versionId);
int correlationId = stream.readInt();
String clientId = Utils.readIntString(stream);
int replicaMetadataRequestInfoListCount = stream.readInt();
ArrayList<ReplicaMetadataRequestInfo> replicaMetadataRequestInfoList =
new ArrayList<ReplicaMetadataRequestInfo>(replicaMetadataRequestInfoListCount);
for (int i = 0; i < replicaMetadataRequestInfoListCount; i++) {
ReplicaMetadataRequestInfo replicaMetadataRequestInfo =
ReplicaMetadataRequestInfo.readFrom(stream, clusterMap, findTokenHelper, versionId);
replicaMetadataRequestInfoList.add(replicaMetadataRequestInfo);
}
long maxTotalSizeOfEntries = stream.readLong();
// ignore version for now
return new ReplicaMetadataRequest(correlationId, clientId, replicaMetadataRequestInfoList, maxTotalSizeOfEntries,
versionId);
}
/**
* array 1010 nnnn [int] objref* // nnnn is count, unless '1111', then int count follows
*/
private void parseShortArray(DataInputStream in, int count) throws IOException
{
BPLArray arr = new BPLArray();
arr.objectTable = objectTable;
arr.objref = new int[count];
for (int i = 0; i < count; i++)
{
arr.objref[i] = in.readShort() & 0xffff;
if (arr.objref[i] == -1)
{
throw new IOException("parseShortArray: illegal EOF in objref*"); //$NON-NLS-1$
}
}
objectTable.add(arr);
}
void loadAutoCropping(final DataInputStream in, final boolean docPage, final boolean leftPage)
throws IOException {
final int index = in.readShort();
final SparseArrayEx<PageInfo> target = getPages(docPage, leftPage);
PageInfo pageInfo = target.get(index, null);
if (pageInfo == null) {
pageInfo = new PageInfo(index);
target.append(index, pageInfo);
}
pageInfo.autoCropping = new RectF(in.readFloat(), in.readFloat(), in.readFloat(), in.readFloat());
}
public void initAttribute(DataInputStream infoStream, ConstantPool constantPool) throws Exception {
this.constantPool = constantPool;
annotationInfoIndex = infoStream.readShort();
numberOfAnnotationAttributes = infoStream.readShort();
if (numberOfAnnotationAttributes == 0) {
return;
}
annotationAttributes = new AnnotationAttribute[numberOfAnnotationAttributes];
for (int i = 0; i < annotationAttributes.length; i++) {
AnnotationAttribute annotationAttribute = new AnnotationAttribute();
annotationAttribute.initAttribute(infoStream, constantPool);
annotationAttributes[i] = annotationAttribute;
}
}
private String[] readNameArray(DataInputStream in, String[] names)
throws IOException {
int num = in.readShort();
if (num == 0) {
return null;
}
String[] result = new String[num];
for (int i = 0; i < num; i++) {
result[i] = names[in.readShort()];
}
return result;
}
public static UndeleteRequest readFrom(DataInputStream stream, ClusterMap map) throws IOException {
Short version = stream.readShort();
if (version != UNDELETE_REQUEST_VERSION_1) {
throw new IllegalStateException("Unknown undelete request version " + version);
}
int correlationId = stream.readInt();
String clientId = Utils.readIntString(stream);
BlobId id = new BlobId(stream, map);
long operationTimeMs = stream.readLong();
return new UndeleteRequest(correlationId, clientId, id, operationTimeMs);
}
@Override
public void read(DataInputStream in) throws IOException
{
change = HistoryIO.create(in.readByte());
change.read(in);
colour = in.readInt();
points = new short[in.readInt()];
for(int i = 0; i < points.length; i++)
points[i] = in.readShort();
}
public static AttributeInfo read(DataInputStream dataInputStream, ConstantPool constantPool) throws Exception {
short attrNameIndex = dataInputStream.readShort();
String name = ((ConstantUtf8Info) constantPool.getConstantInfos()[attrNameIndex]).getBytesValue();
Class<? extends AttributeInfo> attributeTypeClz = AttributeTypeEnum.getAttributeType(name);
AttributeInfo attributeInfo = attributeTypeClz.getDeclaredConstructor(short.class).newInstance(attrNameIndex);
attributeInfo.constantPool = constantPool;
attributeInfo.initAttributeInfo(dataInputStream, constantPool);
return attributeInfo;
}
public UndoGraphEditState(final DataInputStream in) throws Exception {
operationCount = in.readInt();
operationStack = new short[operationCount];
for (int i = 0; i < operationCount; i++) {
operationStack[i] = in.readShort();
}
byteCount = in.readInt();
byteStack = new byte[byteCount];
for (int i = 0; i < byteCount; i++) {
byteStack[i] = in.readByte();
}
shortCount = in.readInt();
shortStack = new short[shortCount];
for (int i = 0; i < shortCount; i++) {
shortStack[i] = in.readShort();
}
intCount = in.readInt();
intStack = new int[intCount];
for (int i = 0; i < intCount; i++) {
intStack[i] = in.readInt();
}
longCount = in.readInt();
longStack = new long[longCount];
for (int i = 0; i < longCount; i++) {
longStack[i] = in.readLong();
}
final Map<Integer, Class<?>> classMap = new HashMap<>();
classMap.put(0, null);
objectCount = in.readInt();
byte[] buffer = new byte[1024];
for (int i = 0; i < objectCount; i++) {
final int objectClassIndex = in.readInt();
final Class<?> objectClass;
if (classMap.containsKey(objectClassIndex)) {
objectClass = classMap.get(objectClassIndex);
} else {
final int classLength = in.readInt();
if (classLength > buffer.length) {
buffer = Arrays.copyOf(buffer, classLength);
}
in.read(buffer, 0, classLength);
final String objectName = new String(buffer, 0, classLength, UTF8);
objectClass = Class.forName(objectName);
}
classMap.put(objectClassIndex, objectClass);
objectMap.put(objectClass, objectClassIndex);
}
objectStack = new Object[objectCount];
Arrays.setAll(objectStack, index -> classMap.get(index));
}
/**
* Customizes a class file by replacing constant pools.
*
* @param image
* The image of the template class.
* @param replacements
* A list of pair of strings that specify the substitution
* {@code String[]{search_0, replace_0, search_1, replace_1, ..., search_n, replace_n }}
*
* The search strings found in the constant pool will be replaced by the corresponding
* replacement string.
*/
public static byte[] tailor( InputStream image, String templateClassName, String newClassName, String... replacements ) {
DataInputStream in = new DataInputStream(image);
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
DataOutputStream out = new DataOutputStream(baos);
// skip until the constant pool count
long l = in.readLong();
out.writeLong(l);
// read the constant pool size
short count = in.readShort();
out.writeShort(count);
// replace constant pools
for( int i=0; i<count; i++ ) {
byte tag = in.readByte();
out.writeByte(tag);
switch(tag) {
case 0:
// this isn't described in the spec,
// but class files often seem to have this '0' tag.
// we can apparently just ignore it, but not sure
// what this really means.
break;
case 1: // CONSTANT_UTF8
{
String value = in.readUTF();
if(value.equals(templateClassName))
value = newClassName;
else {
for( int j=0; j<replacements.length; j+=2 )
if(value.equals(replacements[j])) {
value = replacements[j+1];
break;
}
}
out.writeUTF(value);
}
break;
case 3: // CONSTANT_Integer
case 4: // CONSTANT_Float
out.writeInt(in.readInt());
break;
case 5: // CONSTANT_Long
case 6: // CONSTANT_Double
i++; // doubles and longs take two entries
out.writeLong(in.readLong());
break;
case 7: // CONSTANT_Class
case 8: // CONSTANT_String
out.writeShort(in.readShort());
break;
case 9: // CONSTANT_Fieldref
case 10: // CONSTANT_Methodref
case 11: // CONSTANT_InterfaceMethodref
case 12: // CONSTANT_NameAndType
out.writeInt(in.readInt());
break;
default:
throw new IllegalArgumentException("Unknown constant type "+tag);
}
}
// then copy the rest
byte[] buf = new byte[512];
int len;
while((len=in.read(buf))>0)
out.write(buf,0,len);
in.close();
out.close();
// by now we got the properly tailored class file image
return baos.toByteArray();
} catch( IOException e ) {
// never happen
logger.log(Level.WARNING,"failed to tailor",e);
return null;
}
}
/**
* Loads the rules from a DateInputStream, often in a jar file.
*
* @param dis the DateInputStream to load, not null
* @throws Exception if an error occurs
*/
private void load(DataInputStream dis) throws Exception {
if (dis.readByte() != 1) {
throw new StreamCorruptedException("File format not recognised");
}
// group
String groupId = dis.readUTF();
if ("TZDB".equals(groupId) == false) {
throw new StreamCorruptedException("File format not recognised");
}
// versions
int versionCount = dis.readShort();
for (int i = 0; i < versionCount; i++) {
versionId = dis.readUTF();
}
// regions
int regionCount = dis.readShort();
String[] regionArray = new String[regionCount];
for (int i = 0; i < regionCount; i++) {
regionArray[i] = dis.readUTF();
}
regionIds = Arrays.asList(regionArray);
// rules
int ruleCount = dis.readShort();
Object[] ruleArray = new Object[ruleCount];
for (int i = 0; i < ruleCount; i++) {
byte[] bytes = new byte[dis.readShort()];
dis.readFully(bytes);
ruleArray[i] = bytes;
}
// link version-region-rules
for (int i = 0; i < versionCount; i++) {
int versionRegionCount = dis.readShort();
regionToRules.clear();
for (int j = 0; j < versionRegionCount; j++) {
String region = regionArray[dis.readShort()];
Object rule = ruleArray[dis.readShort() & 0xffff];
regionToRules.put(region, rule);
}
}
}
/**
* Shuffle the pointers to point to the proper spots in the trace, then load the
* traces into their arrays.
*/
private void setTraces() {
int pointers[] = new int[4]; //alphabetical, 0=A, 1=C, 2=G, 3=T
int datas[] = new int[4];
char order[] = new char[4];
datas[0] = DATA9;
datas[1] = DATA10;
datas[2] = DATA11;
datas[3] = DATA12;
for (int i = 0; i <= 3; i++) {
order[i] = (char) traceData[FWO + i];
}
for (int i = 0; i <= 3; i++) {
switch (order[i]) {
case 'A':
case 'a':
pointers[0] = datas[i];
break;
case 'C':
case 'c':
pointers[1] = datas[i];
break;
case 'G':
case 'g':
pointers[2] = datas[i];
break;
case 'T':
case 't':
pointers[3] = datas[i];
break;
default:
throw new IllegalArgumentException("Trace contains illegal values.");
}
}
A = new int[traceLength];
C = new int[traceLength];
G = new int[traceLength];
T = new int[traceLength];
for (int i = 0; i <= 3; i++) {
byte[] qq = new byte[traceLength * 2];
getSubArray(qq, pointers[i]);
DataInputStream dis = new DataInputStream(new ByteArrayInputStream(qq));
for (int x = 0; x <= traceLength - 1; x++) {
try {
if (i == 0) A[x] = (int) dis.readShort();
if (i == 1) C[x] = (int) dis.readShort();
if (i == 2) G[x] = (int) dis.readShort();
if (i == 3) T[x] = (int) dis.readShort();
} catch (IOException e)//This shouldn't happen. If it does something must be seriously wrong.
{
throw new IllegalStateException("Unexpected IOException encountered while manipulating internal streams.");
}
}
}
return;
}
/**
* Customizes a class file by replacing constant pools.
*
* @param image
* The image of the template class.
* @param replacements
* A list of pair of strings that specify the substitution
* {@code String[]{search_0, replace_0, search_1, replace_1, ..., search_n, replace_n }}
*
* The search strings found in the constant pool will be replaced by the corresponding
* replacement string.
*/
public static byte[] tailor( InputStream image, String templateClassName, String newClassName, String... replacements ) {
DataInputStream in = new DataInputStream(image);
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
DataOutputStream out = new DataOutputStream(baos);
// skip until the constant pool count
long l = in.readLong();
out.writeLong(l);
// read the constant pool size
short count = in.readShort();
out.writeShort(count);
// replace constant pools
for( int i=0; i<count; i++ ) {
byte tag = in.readByte();
out.writeByte(tag);
switch(tag) {
case 0:
// this isn't described in the spec,
// but class files often seem to have this '0' tag.
// we can apparently just ignore it, but not sure
// what this really means.
break;
case 1: // CONSTANT_UTF8
{
String value = in.readUTF();
if(value.equals(templateClassName))
value = newClassName;
else {
for( int j=0; j<replacements.length; j+=2 )
if(value.equals(replacements[j])) {
value = replacements[j+1];
break;
}
}
out.writeUTF(value);
}
break;
case 3: // CONSTANT_Integer
case 4: // CONSTANT_Float
out.writeInt(in.readInt());
break;
case 5: // CONSTANT_Long
case 6: // CONSTANT_Double
i++; // doubles and longs take two entries
out.writeLong(in.readLong());
break;
case 7: // CONSTANT_Class
case 8: // CONSTANT_String
out.writeShort(in.readShort());
break;
case 9: // CONSTANT_Fieldref
case 10: // CONSTANT_Methodref
case 11: // CONSTANT_InterfaceMethodref
case 12: // CONSTANT_NameAndType
out.writeInt(in.readInt());
break;
default:
throw new IllegalArgumentException("Unknown constant type "+tag);
}
}
// then copy the rest
byte[] buf = new byte[512];
int len;
while((len=in.read(buf))>0)
out.write(buf,0,len);
in.close();
out.close();
// by now we got the properly tailored class file image
return baos.toByteArray();
} catch( IOException e ) {
// never happen
logger.log(Level.WARNING,"failed to tailor",e);
return null;
}
}
@Override
public IClassifier read(IStorageManager storageManager, String modelName) {
if (storageManager == null)
throw new NullPointerException("The storage manager is 'null'");
if (!storageManager.isOpen())
throw new IllegalStateException("The storage manager is not open");
if (modelName == null || modelName.isEmpty())
throw new IllegalArgumentException(
"The model name is 'null' or empty");
try {
SvmDDagSingleLabelClassifier c = new SvmDDagSingleLabelClassifier();
DataInputStream is = new DataInputStream(new BufferedInputStream(
storageManager.getInputStreamForResource(modelName
+ "_index_keys")));
try {
int numClassifiers = is.readInt();
for (int i = 0; i < numClassifiers; i++) {
short catPositive = is.readShort();
short catNegative = is.readShort();
String wtStr = is.readUTF();
WeightingType wt = WeightingType.valueOf(wtStr);
String key = LocalClassifier.buildKey(catPositive,
catNegative);
SvmDataManager svmDataManager = new SvmDataManager();
IClassifier localClassifier = svmDataManager.read(
storageManager, modelName + "_" + key + "_svm");
IContentDB contentDB = TroveReadWriteHelper.readContent(
storageManager, modelName + "_" + key
+ "_contentDB", TroveContentDBType.Full);
LocalClassifier lc = new LocalClassifier();
lc.catIDNegative = catNegative;
lc.catIDPositive = catPositive;
lc.localClassifier = localClassifier;
lc.weightingType = wt;
lc.localContentDB = contentDB;
c.getLocalClassifiers().put(key, lc);
}
return c;
} finally {
is.close();
}
} catch (Exception e) {
throw new RuntimeException(
"Reading SvmDDagSingleLabelClassifier model", e);
}
}
public MockId(DataInputStream stream) throws IOException {
id = Utils.readShortString(stream);
accountId = stream.readShort();
containerId = stream.readShort();
}
public static Table readTable(DataInputStream in) throws IOException {
Table table = new Table();
int _f = in.readInt(), _r = in.readInt();
table.fields = new String[_f];
table.types = new byte[_f];
//table.records=new HashMap(_r);
int i, ii;
Object fn;
Object[] recval;
table.keyType = in.readByte();
table.keyName = readIStr(in);
for (ii = 0; ii < _f; ii++) {
table.types[ii] = in.readByte();
table.fields[ii] = readIStr(in);
}
byte rtype;
a:
for (ii = 0; ii < _r; ii++) {
fn = readTypeAndObj(in);
recval = new Object[_f];
for (i = 0; i < _f; i++) {
rtype = (byte) in.read();
switch (rtype) {
case TYPE_VOID:
recval[i] = null;
break;
case TYPE_BYTE:
recval[i] = (byte) in.read();
break;
case TYPE_BOOL:
recval[i] = in.read() != 0;
break;
case TYPE_WCHAR32:
recval[i] = in.readInt();
break;
case TYPE_INT:
recval[i] = in.readInt();
break;
case TYPE_SHORT:
recval[i] = in.readShort();
break;
case TYPE_LONG:
recval[i] = in.readLong();
break;
case TYPE_FLOAT:
recval[i] = in.readFloat();
break;
case TYPE_DOUBLE:
recval[i] = in.readDouble();
break;
case TYPE_IUTF8:
recval[i] = readIStr(in);
break;
case TYPE_IRAW:
recval[i] = readIRaw(in);
break;
case TYPE_TABLE:
recval[i] = readTable(in);
break;
case TYPE_EOF:
break a;
default:
throw new IOException("Unexpected type:" + table.types[i] + ",record_name:\"" + fn + "\"");
}
}
table.records.put(fn, recval);
}
return table;
}
/**
* rlshort
* Protected helper method to read 16 bits value. Swap high with low byte.
* @param DataInputStream
* @return the swapped value.
* @exception IOException
*/
final short rlshort(DataInputStream dis) throws IOException {
short s=0;
short high, low;
s = dis.readShort();
high = (short)(( s & 0xFF ) << 8) ;
low = (short)(( s & 0xFF00 ) >>> 8);
s = (short)( high | low );
return s;
}
/**
* rlshort
* Protected helper method to read 16 bits value. Swap high with low byte.
* @return the swapped value.
* @exception IOException
*/
final short rlshort(DataInputStream dis) throws IOException {
short s=0;
short high, low;
s = dis.readShort();
high = (short)(( s & 0xFF ) << 8) ;
low = (short)(( s & 0xFF00 ) >>> 8);
s = (short)( high | low );
return s;
}