Question: I have a problem with Java application, particular in loading a image from a location in my computer.

Following [this post](http://www.dreamincode.net/forums/topic/162999-java-image-manipulation-part-3-math-and-swingworker/) I used a `BufferedImage` and a `InputFileStream` to load an image on my computer. First, I put the image (`pic2.jpg`) into the source code and that is working. However, if I put the image to another place (let's say `C:\\ImageTest\pic2.jpg`), Java IDE show me an `IllegalArgumentException` 

```
return ImageIO.read(in);

```

here is the code:

```
public class MiddlePanel extends JPanel {
    private BufferedImage img;

    public MiddlePanel(int width) {    
        //img = getImage("pic2.jpg");       
        img = getImage("C:\\ImageTest\\pic2.jpg");

        this.setPreferredSize(new Dimension(800,460));

    }

    public void paintComponent(Graphics g) {
        // ...
    }

    private BufferedImage getImage(String filename) {
        // This time, you can use an InputStream to load
        try {
            // Grab the InputStream for the image.                    
            InputStream in = getClass().getResourceAsStream(filename);

            // Then read it.
            return ImageIO.read(in);
        } catch (IOException e) {
            System.out.println("The image was not loaded.");
            //System.exit(1);
        }

        return null;
    }
}

```

Answer: 
`getResource` & `getResourceAsStream` do not work with file paths, but paths relative the code base. If the code base is `C:` then a relative path that would locate the resource is `/ImageTest/pic2.jpg`.

> 
> ..difference between load file by `FileInputStream` and `getResourceAsStream`?
> 
> 
> 

One major difference is that the `getResource..` will work with a resource inside a Jar, which is no longer a `File`. Therefore `FileInputStream` *cannot* be used to access such a resource.
```
//This code snippet read an image from location on the computer and writes it to a different location on the disk
try {
    byte[] imageInByte;

    BufferedImage imageOnDisk = ImageIO.read(new File("C:\\ImageTest\\pic2.jpg"));

    //Create a ByteArrayOutputStrea object to write image to
    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    //Write the image to the OutputStream
    ImageIO.write(imageOnDisk, "jpg", baos);

    baos.flush();

    //Initialise the byte array object with the image that was written to the OutputStream
    imageInByte = baos.toByteArray();
    baos.close();

    // convert byte array back to BufferedImage
    InputStream in = new ByteArrayInputStream(imageInByte);
    BufferedImage bImageFromConvert = ImageIO.read(in);

    //write the image to a new location with a different file name(optionally)
    ImageIO.write(bImageFromConvert, "jpg", new File(
            "c:\\index.jpg"));
} catch (IOException e) {
    e.printStackTrace();
}

```