Adrian
Adrian

Reputation: 1025

Catch 404 error from BufferedInputStream

I have a function for html page download. Here is the code:

public class pageDownload {
    public static void down(final String filename, final String urlString)
            throws MalformedURLException, IOException {
        BufferedInputStream in = null;
        FileOutputStream fout = null;
        try {
            in = new BufferedInputStream(new URL(urlString).openStream());
            fout = new FileOutputStream(new File(filename));
            final byte data[] = new byte[1024];
            int count;
            while ((count = in.read(data, 0, 1024)) != -1) {
                fout.write(data, 0, count);
            }
        } catch (IOException e) {
            System.err.println("Caught IOException: " + e.getMessage());
        } catch (IndexOutOfBoundsException e) {
            System.err.println("IndexOutOfBoundsException: " + e.getMessage());
        }
        in.close();
        fout.close();
    }
}

Works ok, problem appears when i try to download a page that not exist. I can't figure out how to handle 404 error in this case. Has anyone some idea?

Upvotes: 0

Views: 229

Answers (2)

Mr_and_Mrs_D
Mr_and_Mrs_D

Reputation: 34036

Your problem is you get a NullPointerException when you try to close the streams. You should anyway close them in a finally clause or use try with resources:

public static void down(final String filename, final String urlString)
        throws IOException {
    try (BufferedInputStream in = new BufferedInputStream(new URL(urlString)
            .openStream());
         FileOutputStream fout = new FileOutputStream(new File(filename))) {
        final byte data[] = new byte[1024];
        int count;
        while ((count = in.read(data, 0, 1024)) != -1) {
            fout.write(data, 0, count);
        }
    } catch (IOException e) {
        System.err.println("Caught IOException: " + e.getMessage());
    } catch (IndexOutOfBoundsException e) {
        System.err.println("IndexOutOfBoundsException: " + e.getMessage());
    }
}

Upvotes: 0

Michael Barfs
Michael Barfs

Reputation: 416

Do you mean something like this? I added a finally to save close the Streams

public class pageDownload {
    public static void down(final String filename, final String urlString)
    throws MalformedURLException, IOException {

        BufferedInputStream in = null;
        FileOutputStream fout = null;
        try {
            in = new BufferedInputStream(new URL(urlString).openStream());
            fout = new FileOutputStream(new File(filename));

            final byte data[] = new byte[1024];
            int count;
            while ((count = in.read(data, 0, 1024)) != -1) {
                fout.write(data, 0, count);
            }
        } catch(FileNotFoundException ex)
        {
            System.err.println("Caught 404: " + e.getMessage());
        }
        catch(IOException ex)
        {
            System.err.println("Caught IOException: " + e.getMessage());
        }
        catch(IndexOutOfBoundsException e)
        {
            System.err.println("IndexOutOfBoundsException: " + e.getMessage());
        }
        finally{
            if(in != null)
                try { in.close(); } catch ( IOException e ) { }
            if(fout != null)
                try { fout.close(); } catch ( IOException e ) { }
        }
    } 
}

Upvotes: 1

Related Questions