5

I have tried using this code for converting a ZIP file to a byte array:

private static byte[] readZipFile(String zipFnm)
// read in fnm, returning it as a single string
{

  FileInputStream fileInputStream=null;

  File file = new File(zipFnm);

  byte[] bFile = new byte[(int) file.length()];

  try{
    //convert file into array of bytes
    fileInputStream = new FileInputStream(zipFnm);
    fileInputStream.read(bFile);
    fileInputStream.close();
  }catch(Exception e){
    e.printStackTrace();
  }
  return bFile;
}  

and this code for converting the byte array to back to ZIP, by calling writeByteToZip(fnm + ".zip");

private static String writeByteToZip(String outFnm)
{
  try {
    FileOutputStream fileOuputStream = new FileOutputStream(outFnm); 
    fileOuputStream.write(bFile);
    fileOuputStream.close();            

  } catch ( IOException iox ){
    iox.printStackTrace();
  }
  return outFnm;
}  // end of writeByteToZip()

What am I doing wrong? I get correct byte length of zip using

byte[] bzip = readZipFile(zipFnm);

int totalLen1 = bzip.length;
System.out.println("Total byte length of zip: " + totalLen1);

All I get is a zero size zip file and run time error in Netbeans as:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at java.io.FileOutputStream.write(FileOutputStream.java:305)
    at steg.Steg.writeByteToZip(Steg.java:402)
    at steg.Steg.save(Steg.java:292)
    at steg.frame1.jButton2ActionPerformed(frame1.java:349)
    at steg.frame1.access$300(frame1.java:24)
    at steg.frame1$4.actionPerformed(frame1.java:172)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6505)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
    at java.awt.Component.processEvent(Component.java:6270)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4861)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2713)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
    at java.awt.EventQueue.access$000(EventQueue.java:101)
    at java.awt.EventQueue$3.run(EventQueue.java:666)
    at java.awt.EventQueue$3.run(EventQueue.java:664)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:680)
    at java.awt.EventQueue$4.run(EventQueue.java:678)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
0

4 Answers 4

1

The problem is probably the variable bFile in writeByteToZip(). Make sure it is not null.

In the future, when you post code which throws an exception, mark the line where the exception happens with a comment (// <-- NullPointerException here)

Sign up to request clarification or add additional context in comments.

Comments

1

The stacktrace you've provided will be caused because bFile is null.

The cause is likely to be the following line in your readZipFile method:

byte[] bFile = new byte[(int) file.length()];

Here you are assigning to a local variable, rather than your class field. Try replacing that line with:

bFile = new byte[file.length()];

Your code also demonstrates poor resource handling. Either use existing library methods to do your reading (e.g. commons-io or Java 7 Files) or write code such as:

FileInputStream fileInputStream = null;
try {
  fileInputStream = new //...
} finally {
  if (fileInputStream != null) {
    fileInputStream.close();
  }
}

If you have Java 7, you can use try-with-resources:

try (FileInputStream fileInputStream = new FileInputStream(zipFnm)) {
  // Use your stream
}

1 Comment

It's not zipFnm that's null - the exception is being thrown on the line where bfile is referenced.
1

I didnt check your code. But i was working with such requirement. SO felt like sharing my code.

To read zip file and convert to byte array:

public byte[] readXMLFile(){
        File file = new File("a.xml");

        byte[] b = new byte[(int) file.length()];
        try {
            FileInputStream fileInputStream = new FileInputStream(file);
            fileInputStream.read(b);
            fileInputStream.close();
        }catch (FileNotFoundException e) {
            System.out.println("File Not Found.");
            e.printStackTrace();
        }catch (IOException e1) {
            System.out.println("Error Reading The File.");
            e1.printStackTrace();
        }
        return b;
    }

To write to zip file from byte array:

public void writeXMLFile(byte[] fileContent){
        try {
            FileOutputStream fos = new FileOutputStream("abc.xml");

            fos.write(fileContent);
            fos.close();
        }catch(FileNotFoundException ex){
            System.out.println("FileNotFoundException : " + ex);
        }catch(IOException ioe)  {
            System.out.println("IOException : " + ioe);
        }
    }

Hope this helps.

1 Comment

Always close your streams in a finally block.
0

As already said the file probably does not exist.

However, I just wanted to mention out the utility in Java 7 you can use. Files class offers:

static byte[] readAllBytes(Path path)
static Path write(Path path, byte[] bytes, OpenOption... options)

Seams like exactly what you need. It does not matter if the file is Zip or not, simply you can get the bytes easily and then use them to write them to some other file. Note that Path in Java 7 is representing the path to the file in question.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.