How do I read and output a text file from a Servlet?


Try the following:

import javax.servlet.*;
import javax.servlet.http.*;

public class MessageServlet extends HttpServlet {

    public void doGet(HttpServletRequest req, HttpServletResponse res)
        throws IOException, ServletException
        // output an HTML page

        // load a configuration parameter (you must set this yourself)
        String root = getInitParameter("root");

        // print some html
        ServletOutputStream out = res.getOutputStream();
        out. println("<html>");
        out.println("<head><title>Message of the Day</title></head>");
        out.println("<body><h1>Today's Message:</h1>");

        // print the file
        InputStream in = null;
        try {
            in = new BufferedInputStream
                (new FileInputStream(root + "/message.txt") );
            int ch;
            while ((ch = !=-1) {
        finally {
            if (in != null) in.close();  // very important

        // finish up
[Note: I have now successfully compiled and run the above example. You asked for a working source, you got it :-)]

You may want to do more than just copy the file; look in the package for classes that help you process a file, like StreamTokenizer.

Pay attention to the use of an InitParameter to provide a root on the file system. That way your servlet can be used on other servers without hardcoding a file path.

Also, note the use of a finally block to close the file. This way, even if the reading throws an exception, the file will be closed. This is important on a server, since file descriptors are limited, and you don’t want any leaks, since the server will be up for a very long time (hopefully!).

Whenever you access local resources, you have to consider security holes. For instance, if you make a file name based on a FORM parameter, you should validate it, to make sure if a hacker sends in, e.g., “/etc/passwd” as his user name, he won’t actually get the system password file.