File APIs for Java Developers
Manipulate DOC, XLS, PPT, PDF and many others from your application.
http://aspose.com/file-tools
The moose likes Java in General and the fly likes conversion from inputstream to fileinputstream Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of Soft Skills this week in the Jobs Discussion forum!
JavaRanch » Java Forums » Java » Java in General
Bookmark "conversion from inputstream to fileinputstream" Watch "conversion from inputstream to fileinputstream" New topic
Author

conversion from inputstream to fileinputstream

prasad Venkat
Ranch Hand

Joined: Oct 17, 2006
Posts: 32
final String classLocation = clsname.replace('.', '/') + ".class";
cs = new DataInputStream( ClassLoader.getSystemResource(classLocation).openStream());


"ClassLoader.getSystemResource(classLocation).openStream()" this is returning inputstream but i want that to be FileInputstream , and i tried to type cast with fileinputstream but it returning null value.

is there any solution with out type casting..


Thanks in Advance..
Ajay Singh
Ranch Hand

Joined: Dec 13, 2006
Posts: 182
> but it returning null value
the resource is *not* there on the classpath.
prasad Venkat
Ranch Hand

Joined: Oct 17, 2006
Posts: 32
I am trying to read from jar file

System.out.println(ClassLoader.getSystemResource(classLocation).getPath());

this statement prints

file:/C:/Program%20Files/Java/j2re1.4.2_06/lib/rt.jar!/java/util/Date.class

and if i dont type caste its working fine , null is coming only if i type caste .
Ajay Singh
Ranch Hand

Joined: Dec 13, 2006
Posts: 182
> and if i dont type caste its working fine , null is coming only if i type caste
are you sure? It *must* be throwing ClassCastException
prasad Venkat
Ranch Hand

Joined: Oct 17, 2006
Posts: 32
> yes it is throwing "ClassCastException" . how to make it
Ajay Singh
Ranch Hand

Joined: Dec 13, 2006
Posts: 182
As i said earlier the getResourceAsStream function returns InputStream as the url might point to different location, could be an
entry in the jar file (thats what happening in your case) - in this case there is no file, So it returns a ByteArrayInputStream
Ilja Preuss
author
Sheriff

Joined: Jul 11, 2001
Posts: 14112
With other words, as the stream is not (directly) reading from a file, it cannot possibly be a FileInputStream.

But why would you want to have one, anyway? What are you trying to accomplish?


The soul is dyed the color of its thoughts. Think only on those things that are in line with your principles and can bear the light of day. The content of your character is your choice. Day by day, what you do is who you become. Your integrity is your destiny - it is the light that guides your way. - Heraclitus
prasad Venkat
Ranch Hand

Joined: Oct 17, 2006
Posts: 32
I am trying to read class file from jar , if it is FileInputStream i could read even read tags like Deprecated , when coming to InputStream i am able to read only class but not tags , but my purpose is to read even tags
Ajay Singh
Ranch Hand

Joined: Dec 13, 2006
Posts: 182
for that java has something called "Reflection"
Ilja Preuss
author
Sheriff

Joined: Jul 11, 2001
Posts: 14112
Originally posted by prasad Venkat:
if it is FileInputStream i could read even read tags like Deprecated


How do you do that??? After all, the stream content is the same...
prasad Venkat
Ranch Hand

Joined: Oct 17, 2006
Posts: 32
Reflection cant provide info about "deprecated"..

"How do you do that??? After all, the stream content is the same..."


when i extracted a class file to a location , and tried to read that through fileinputstream i could read tag like deprecated .

when i tried to read from jar directly through inputstream it is not reading that deprecated tag info
prasad Venkat
Ranch Hand

Joined: Oct 17, 2006
Posts: 32
do my problem have solution
Stan James
(instanceof Sidekick)
Ranch Hand

Joined: Jan 29, 2003
Posts: 8791
I'm not following you yet. Could you show the working code with FileInputStream?


A good question is never answered. It is not a bolt to be tightened into place but a seed to be planted and to bear more seed toward the hope of greening the landscape of the idea. John Ciardi
Ajay Singh
Ranch Hand

Joined: Dec 13, 2006
Posts: 182
this works for me (uses reflection)

prasad Venkat
Ranch Hand

Joined: Oct 17, 2006
Posts: 32
I AM WORKING ON JAVA 1.4 WHERE ANNOTATION WILL NOT SUPPORT WHICH SUPPORTS FROM JAVA 5


This code able read even info about Deprecated Tag which is kept like shown below in a class file.
/**
* @deprecated
*
*/

cs = new DataInputStream(new FileInputStream(fileName)); // filename give the complete path of class file(Date.class extracted manually and kept in current folder and tested)// passing FileInputStream obj to DataInputstream constructor


cs.readInt(); // holds info about magic number
cs.readUnsignedShort();// holds info about minor version
cs.readUnsignedShort();// holds info about major version
.....
....
....
After reading Date.class o/p is

UTF: Date
2. Class: 1
3. UTF: java/lang/Object
4. Class: 3
5. UTF: java/io/Serializable
6. Class: 5
7. UTF: java/lang/Cloneable
8. Class: 7
9. UTF: java/lang/Comparable
10. Class: 9
11. UTF: fastTime
12. UTF: J
13. UTF: defaultCenturyStart
14. UTF: I
15. UTF: serialVersionUID
16. UTF: ConstantValue
19. UTF: simpleFormatter
20. UTF: Ljava/lang/ref/SoftReference;
21. UTF: gmtFormatter
22. UTF: wtb
23. UTF: [Ljava/lang/String;
24. UTF: ttb
25. UTF: [I
26. UTF: getDate
27. UTF: ()I
28. UTF: Deprecated <------------- which shows here
29. UTF: Code
30. UTF: java/lang/Error
31. Class: 30

------------------------------

This code not able to read info about Deprecated Tag when reading with inputstream from jar file directly with out extracting like previous one.
same progarm and logic but o/p is diffrent

String classLocation = clsname.replace('.', '/') + ".class"; // class location holds package info eg : java.util.Date converted to java/util/Date

cs = new DataInputStream(ClassLoader.getSystemResource(classLocation).openStream()); // passing InputStream obj to DataInputstream constructor

cs.readInt(); // holds info about magic number
cs.readUnsignedShort();// holds info about minor version
cs.readUnsignedShort();// holds info about major version
.........
.........
.......

After reading Date.class (Deprecated not shown here) o/p is
1. Integer: -2147483648
2. Integer: 60000
3. String: 42
4. String: 44
5. String: 48
6. String: 49
7. String: 50
8. String: 53
9. String: 58
10. String: 60
11. String: 61
12. String: 63
13. String: 65
14. String: 67
15. String: 69
16. String: 86
17. String: 89
18. String: 110
19. String: 111
20. String: 114
21. String: 115
22. String: 116
23. String: 117
24. String: 118
25. String: 119
26. String: 120
27. String: 122
28. String: 123
29. String: 124
30. String: 128
31. String: 129
32. String: 144
33. String: 145
34. String: 150
35. String: 151
36. String: 152
37. String: 154
38. UTF: <clinit>
39. UTF: <init>
40. UTF: Code
41. UTF: ConstantValue
42. UTF: EEE MMM dd HH:mm:ss zzz yyyy
43. UTF: Exceptions
44. UTF: GMT
45. UTF: US
46. UTF: UTC
47. UTF: after
48. UTF: am
49. UTF: april
50. UTF: august
51. UTF: before
52. UTF: cal
53. UTF: cdt
54. UTF: charAt
55. UTF: clear
56. UTF: clone
57. UTF: compareTo
58. UTF: cst
59. UTF: currentTimeMillis
60. UTF: d MMM yyyy HH:mm:ss 'GMT'
61. UTF: december
62. UTF: defaultCenturyStart
63. UTF: edt
64. UTF: equals
65. UTF: est
66. UTF: fastTime
67. UTF: february
68. UTF: format
69. UTF: friday
70. UTF: get
71. UTF: getDate
72. UTF: getDateTimeInstance
73. UTF: getDay
74. UTF: getDefault
75. UTF: getField
76. UTF: getHours
77. UTF: getMinutes
78. UTF: getMonth

[ January 18, 2007: Message edited by: prasad Venkat ]

[ January 18, 2007: Message edited by: prasad Venkat ]
[ January 18, 2007: Message edited by: prasad Venkat ]
Ajay Singh
Ranch Hand

Joined: Dec 13, 2006
Posts: 182
it should not matter whether you are using FileInputStream or any other InputStream for DataInputStream constructor
prasad Venkat
Ranch Hand

Joined: Oct 17, 2006
Posts: 32
Then i dont understand what made the o/p different..
Ajay Singh
Ranch Hand

Joined: Dec 13, 2006
Posts: 182
post the code that is reading the class file
prasad Venkat
Ranch Hand

Joined: Oct 17, 2006
Posts: 32
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.net.URL;
import java.text.Annotation;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;




class ClassReader {


public ClassReader(String crpath, String string) {

fileName = crpath; // stores info of file name
clsname=string;
}

public ClassReader(String string) {

clsname=string;
fileName="empty";
}

/**
* This method identifies version and other info like methods and feilds of class
* @return Map
*/

public Map versionInfo() {


boolean flag=false;
String urlString=null;
System.out.println("Ur Using JAVA "
+ System.getProperty("java.version"));

try {
if(fileName.equals("empty")){
flag = true;
}
if(!flag ){
cs = new DataInputStream(new FileInputStream(fileName));
}
}catch(IOException e){
flag=true;
}
try{
if(flag){


final String classLocation = clsname.replace('.', '/') + ".class";
cs = new DataInputStream(ClassLoader.getSystemResource(classLocation).openStream());

}
cs.readInt(); // holds info about magic number of class file format
cs.readUnsignedShort();// holds info about minor version of class file format
cs.readUnsignedShort();// holds info about major version of class file format

// Read constant pool
int constantCount = cs.readUnsignedShort();
UTStrings = new String[constantCount];
for (int i = 1; i < constantCount; i++) {
if(i==305){
System.out.println("sddfs");
}
if(readsConstantPool(i)){
++i;
}
}

// Read basic class information
cs.readShort(); // Reading access flags
cs.readShort(); // Reading this class
cs.readShort(); // Reading superclass

//This for reading interfaces
int interfaceCount = cs.readShort();
System.out.println("interfaceCount" + interfaceCount);
readInterfaceInfo(interfaceCount);

// Read fields
int fieldCount = cs.readUnsignedShort();
for (int i = 0; i < fieldCount; i++)
readMethodsOrFieldsInfo("Field");

// Read methods
int methodCount = cs.readUnsignedShort();
for (int i = 0; i < methodCount; i++)
readMethodsOrFieldsInfo("Method");

// Read top-level attributes (of entire class)
int attributeCount = cs.readUnsignedShort();

}catch(ClassCastException ce){
System.out.println (ce.getMessage());
}
catch (Exception e) {
System.out.println (e.getMessage());
}


/*for (int m = 1; m < UTStrings.length; m++) {

if (UTStrings[m] == null)
continue;
if ((UTStrings[m] == thisClass) ||
(UTStrings[m] == superClass))
continue;
if (UTStrings[m].type == UTStrings.CLASS) {
String s = UTStrings[i].arg1.strValue;
if (s.charAt(0) == '[')
continue;
s = printClassName(UTStrings[i].arg1.strValue);
if ((packageName != null) && (s.startsWith(packageName)))
continue;
System.out.println(printClassName(s)+";");
}
}*/
return map;
}

/**
* read constant number 'k' in the constant pool
* @param k
* @throws IOException
*/

private boolean readsConstantPool(int k) throws IOException {

byte tag = cs.readByte();
boolean ldflag=false;

if (tag == 1) { // UTF text
String stg = cs.readUTF();
System.out.println(k + ". UTF: " + stg);
UTStrings[k] = stg;
//map.put(stg,"CP");
cpcnt++;

} else if (tag == 2) {// unused tag

} else if (tag == 3) {
int intValue = cs.readInt();
System.out.println(k + ". Integer: " + intValue);

} else if (tag == 4) {// float
cs.readFloat();

} else if (tag == 5) {// long
cs.readLong();
ldflag=true;

} else if (tag == 6) {// double
cs.readDouble();
ldflag=true;

} else if (tag == 7) {// class
int UTFindex1 = cs.readUnsignedShort();
System.out.println(k + ". Class: " + UTFindex1);
//map.put(UTStrings[UTFindex1],"Pack");

} else if (tag == 8) {// String
int UTFindex2 = cs.readUnsignedShort();
System.out.println(k + ". String: " + UTFindex2);

} else if (tag == 9) {// Fieldref
int class1 = cs.readUnsignedShort();
int nameAndType1 = cs.readUnsignedShort();
System.out
.println(k + ". Fieldref: " + class1 + "/" + nameAndType1);

} else if (tag == 10) {// Methodref
int class2 = cs.readUnsignedShort();
int nameAndType2 = cs.readUnsignedShort();
System.out
.println(k + ". Fieldref: " + class2 + "/" + nameAndType2);

} else if (tag == 11) {// Interface Methodref
cs.readUnsignedShort();
cs.readUnsignedShort();

} else if (tag == 12) {// NameAndType
int name = cs.readUnsignedShort();
int type = cs.readUnsignedShort();
System.out.println(k + ". NameAndType: " + name + " " + type);
}
return ldflag;
}


private static void readInterfaceInfo(int count) throws IOException {

System.out.print("count:" + count);

for (int i = 0; i < count; ++i) {
short tag = cs.readShort();
if (tag > 1 && tag < cpcnt-1){
System.out.print(UTStrings[tag]);
}
}
}


/**
* read a field or method
* @param label
* @throws IOException
*/

private void readMethodsOrFieldsInfo(String label) throws IOException {

cs.readUnsignedShort();
int name = cs.readUnsignedShort();
int type =cs.readUnsignedShort();

System.out.println ();
System.out.println (label + " name: " + name +
" [" + UTStrings[name] + "]");
System.out.println ("Type: " + type +
" [" + UTStrings[type] + "]");
int attributeCount = cs.readUnsignedShort();
//if (attributeCount > 1 && attributeCount < cpcnt - 1){
for (int i = 0; i < attributeCount; i++) {

int attributeName = cs.readUnsignedShort();
//if (attributeName > 1 && attributeName < cpcnt - 1){
try{
if (UTStrings[attributeName].equals("Deprecated")) {
map.put(UTStrings[name], "Deprecated");
System.out.println(name + "depreacted");
}
int length = cs.readInt();
readAttributeValue(length);
}catch(Exception e){}
//}
}
//}

}

/**
* read the value of an attribute: a sequence of 'length' bytes
* @param length
* @throws IOException
*/

public void readAttributeValue(int length) throws IOException {
for (int i = 0; i < length; i++) {
int val = cs.readUnsignedByte() + (0x100);

}


}

public void readClassName(String nam) {
fileName = nam;

}

/* private String printClassName(String s) {
StringBuffer x;

if (s.charAt(0) == '[') {
return(typeString(s, ""));
}
x = new StringBuffer();
for (int j = 0; j < s.length(); j++) {
if (s.charAt(j) == '/')
x.append('.');
else
x.append(s.charAt(j));
}
return (x.toString());

}*/

static DataInputStream cs;

static String[] UTStrings = null;

static String fileName = null;

static int cpcnt=0;

private String clsname=null;

Map map = new HashMap();
}
Ajay Singh
Ranch Hand

Joined: Dec 13, 2006
Posts: 182
just curious why the fields are static here
Ajay Singh
Ranch Hand

Joined: Dec 13, 2006
Posts: 182
and for me its printing the deprecated method flag as well

Method name: 61 [<init>]
Type: 51 [(III)V]
61depreacted
prasad Venkat
Ranch Hand

Joined: Oct 17, 2006
Posts: 32
i think you have tried with class written by you , and that in the current folder


try with existing package in some jar e.g : java.util.Date
Ajay Singh
Ranch Hand

Joined: Dec 13, 2006
Posts: 182
no i tried with java.util.Date
prasad Venkat
Ranch Hand

Joined: Oct 17, 2006
Posts: 32
Then why i am not getting , i am using java 1.4.2, on what version you are working
prasad Venkat
Ranch Hand

Joined: Oct 17, 2006
Posts: 32
This is showing all deprecated info on java 1.5 but not java 1.4 , what will be the solution for 1.4
prasad Venkat
Ranch Hand

Joined: Oct 17, 2006
Posts: 32
Is There any Jar Specification diff in java1.4 and Java 5
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: conversion from inputstream to fileinputstream