|
|
What is your question?
Software rusts. Simon Stephenson, ca 1994.
|
|
|
|
|
Are you suggesting we use this, advertising its existence or complaining that it sucks?
Panic, Chaos, Destruction. My work here is done.
Drink. Get drunk. Fall over - P O'H
OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre
I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer
Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
|
|
|
|
|
Hi
I am writing a program that extracts .class files from a .jar, adds some other .class files, and then recompresses it. I am at the stage of unzipping the code, but i get this error message(I am using a .jar file from the java game "Minecraft")
java.io.FileNotFoundException: META-INF/MOJANG_C.SF (No such file or directory)
Why? And ow do i prevent it?
Here is my zip code
<br />
public static final int BUFFER = 2048;<br />
public static void unzip(String fName) throws Exception<br />
{<br />
<br />
BufferedOutputStream dest = null;<br />
FileInputStream fis = new <br />
FileInputStream(fName);<br />
JarInputStream zis = new <br />
JarInputStream(new BufferedInputStream(fis));<br />
ZipEntry entry;<br />
while((entry = zis.getNextEntry()) != null) {<br />
int count;<br />
byte data[] = new byte[BUFFER];<br />
FileOutputStream fos = new FileOutputStream(entry.getName(), true);<br />
dest = new <br />
BufferedOutputStream(fos, BUFFER);<br />
while ((count = zis.read(data, 0, BUFFER)) <br />
!= -1) {<br />
dest.write(data, 0, count);<br />
}<br />
dest.flush();<br />
dest.close();<br />
}<br />
zis.close();<br />
}<br />
<br />
modified on Tuesday, June 14, 2011 9:14 AM
|
|
|
|
|
Remove the blind throw, void unzip(String fName) throws Exception is such a bad idea and add targeted try/catch blocks.
From that look at the exception and see exactly where it is being thrown and why. My best guess is that the file does not exist due to either a typing error or a missing qualified path.
Panic, Chaos, Destruction. My work here is done.
Drink. Get drunk. Fall over - P O'H
OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre
I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer
Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
|
|
|
|
|
Is it for debugging reasons?
I know where it stops
|
|
|
|
|
This is not for debugging reasons, it's for 'giving you a chance of not being flayed alive by anyone who knows how to write good code' reasons.
You should NEVER use a blind catch. Ever. End of story.
In the general case of I/O, you should catch each exception because if anything happens, you should close all open streams before exiting the method.
In the specific case of your code, if you know where the bug us WHY NOT TELL US?
Panic, Chaos, Destruction. My work here is done.
Drink. Get drunk. Fall over - P O'H
OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre
I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer
Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
|
|
|
|
|
FileOutputStream fos = new FileOutputStream(entry.getName(), true);
|
|
|
|
|
That's better. If you read the docs[^]:
JavaDoc wrote: throws FileNotFoundException - if the file exists but is a directory rather than a regular file, does not exist but cannot be created, or cannot be opened for any other reason
So the file's not there or not writeable.
Panic, Chaos, Destruction. My work here is done.
Drink. Get drunk. Fall over - P O'H
OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre
I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer
Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
|
|
|
|
|
Not there? But the file is in the jar, so how can it not be there?
|
|
|
|
|
The output file is not there.
Panic, Chaos, Destruction. My work here is done.
Drink. Get drunk. Fall over - P O'H
OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre
I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer
Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
|
|
|
|
|
Do you know how i fix that?
|
|
|
|
|
Before opening the output stream check if it exists, if not then don't use append = true
Panic, Chaos, Destruction. My work here is done.
Drink. Get drunk. Fall over - P O'H
OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre
I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer
Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
|
|
|
|
|
Still gives me the same error. Here is the new code:
BufferedOutputStream dest = null;<br />
FileInputStream fis = new <br />
FileInputStream(fName);<br />
JarInputStream zis = new <br />
JarInputStream(new BufferedInputStream(fis));<br />
ZipEntry entry;<br />
while((entry = zis.getNextEntry()) != null) {<br />
int count;<br />
byte data[] = new byte[BUFFER];<br />
File theFile = new File(Util.getWorkingDirectory().getAbsoluteFile() + "/bin/temp/" + entry.getName());<br />
FileOutputStream fos = null;<br />
if(theFile.exists())<br />
{<br />
fos = new FileOutputStream(Util.getWorkingDirectory().getAbsoluteFile() + "/bin/temp/" + entry.getName(), true);<br />
}<br />
else<br />
{<br />
fos = new FileOutputStream(Util.getWorkingDirectory().getAbsoluteFile() + "/bin/temp/" + entry.getName());<br />
}<br />
<br />
dest = new <br />
BufferedOutputStream(fos, BUFFER);<br />
while ((count = zis.read(data, 0, BUFFER)) <br />
!= -1) {<br />
dest.write(data, 0, count);<br />
}<br />
dest.flush();<br />
dest.close();<br />
}<br />
zis.close();
|
|
|
|
|
Can you please use <pre> tags for multiline code; there is an edit button for your message.
Panic, Chaos, Destruction. My work here is done.
Drink. Get drunk. Fall over - P O'H
OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre
I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer
Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
|
|
|
|
|
The lines:
if(theFile.exists())
{
fos = new FileOutputStream(Util.getWorkingDirectory().getAbsoluteFile() + "/bin/temp/" + entry.getName(), true);
}
else
{
fos = new FileOutputStream(Util.getWorkingDirectory().getAbsoluteFile() + "/bin/temp/" + entry.getName());
}
Can be written:
fos = new FileOutputStream(
Util.getWorkingDirectory().getAbsoluteFile() + "/bin/temp/" + entry.getName(),
theFile.exists());
That's readable.
Now, check if the file exists, if it doesn't [which I suspect], is the directory name valid? Is the file name valid? Do you have access to write to the location? This is called debugging and the programmer is expected to do this. The more information you can provide, the easier it is for us to help. Right now, I can offer little more than general tips; even if they are bloody good ones.
Panic, Chaos, Destruction. My work here is done.
Drink. Get drunk. Fall over - P O'H
OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre
I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer
Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
|
|
|
|
|
I added a specific folder to add the contents to. Now i get a FileNotFoundException (No suck File or directory):
java.io.FileNotFoundException: /home/petterroea/.minecraft/bin/temp/META-INF/MOJANG_C.SF (No such file or directory)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:209)
at java.io.FileOutputStream.<init>(FileOutputStream.java:131)
...
The line that is not working, is
fos = new FileOutputStream(
Util.getWorkingDirectory().getAbsoluteFile() + "/bin/temp/" + entry.getName(),
theFile.exists());
The folder /home/petterroea/.minecraft/bin/temp/ exists, but there is no content in it
|
|
|
|
|
The exception is even telling you what's wrong:
Member 7991625 wrote: java.io.FileNotFoundException: /home/petterroea/.minecraft/bin/temp/META-INF/MOJANG_C.SF (No such file or directory)
File /home/petterroea/.minecraft/bin/temp/META-INF/MOJANG_C.SF is the problem, you need to create the folder /home/petterroea/.minecraft/bin/temp/META-INF before you can add anything to it...
Panic, Chaos, Destruction. My work here is done.
Drink. Get drunk. Fall over - P O'H
OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre
I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer
Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
|
|
|
|
|
How do i do that dynamically with multiple folders? I am thinking of something like removing /home/petterroea/.minecraft/bin/temp/
And splitting the rest by /
Then loop through the parent's contents to see if the folder exists...
|
|
|
|
|
You should be able to use theFile.mkdirs() .
Panic, Chaos, Destruction. My work here is done.
Drink. Get drunk. Fall over - P O'H
OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre
I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer
Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
|
|
|
|
|
I got the (Is a directory) error. How do i remove the file's name and only use the paths?
|
|
|
|
|
Try theFile.getAbsoluteFile().mkdirs()
Panic, Chaos, Destruction. My work here is done.
Drink. Get drunk. Fall over - P O'H
OK, I will win to day or my name isn't Ethel Crudacre! - DD Ethel Crudacre
I cannot live by bread alone. Bacon and ketchup are needed as well. - Trollslayer
Have a bit more patience with newbies. Of course some of them act dumb - they're often *students*, for heaven's sake - Terry Pratchett
|
|
|
|
|
I have compiled a java file but it does not have debug level information as LineNumberTable and LocalVariableTable , because of which my log file is not getting generated.
I want to know how can we have the debug information in the class file?
Any help !!
|
|
|
|
|
You need to tell your compiler to generate the debug information. Exactly how to do this depends on what development environment you are using. Here's how to do it in Eclipse (and it's probably pretty similar in other IDEs):
Project > Properties > Java Compiler > Classfile Generation
There are a number of checkboxes, including three you want. Check them and rebuild. Easy.
If you're using a standalone compiler, it will have command line switches. Run it with -? to see what they are.
Cheers,
Peter
Software rusts. Simon Stephenson, ca 1994.
|
|
|
|
|
Thanks for your reply Peter.
But the problem is not at IDE Level, I am tring to run a ANT script which is running on jdk 1.6 and generates a JAR file, when I see the class file it does not contain the debug level information(I am not running the ANT file from IDE , I have a Dmake file which calls the ANT script).
As per my understanding when the compiler compiles a java file, it puts the debug information in the class file, but they are missing in the class file.
Can it be because of some JVM or compiler setting??
|
|
|
|