4

ここ数週間、単純な Java サーバーを作成してきました。

最初に、サーバーを起動した場所に基づいてファイルシステムを表示したいと思いました。たとえば、srcディレクトリでサーバーを起動し、ブラウザを開き、localhost:5555 に移動すると、.xml に含まれるファイルとディレクトリが表示されsrcます。それぞれがリンクされます。そして、私はそれがうまくいきました。

ディレクトリをクリックすると、その内容が表示されます (先ほど述べたように)。ファイルをクリックすると、ファイルが読み取られ、そのファイルがプレーン テキストで表示されます。画像をクリックすると、その画像が提供されます。これはすべてブラウザで行われ、戻るボタンを使用して、以前に表示していたディレクトリ リストまたはファイルに戻ることができます。これも問題なく動作し、外部ライブラリを使用しません。

これは、テキストファイルを読み取るために使用しているコードです(リーダーを使用):

private String readFile() {
    BufferedReader reader;
    String response = "";
    try {
        FileReader fileReader = new FileReader(requestedFile);
        reader = new BufferedReader(fileReader);
        String line;
        while ((line = reader.readLine()) != null) {
            response += line + "\n";
        }
        reader.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return response;
}

これは、画像を提供するために使用しているコードです (リーダーではなく入力ストリーム):

public byte[] getByteArray() throws IOException {
    byte[] byteArray = new byte[(int) requestedFile.length()];
    InputStream inputStream;
    String fileName = String.valueOf(requestedFile);
    inputStream = new BufferedInputStream(new FileInputStream(fileName));
    int bytesRead = 0;
    while (bytesRead < byteArray.length) {
        int bytesRemaining = byteArray.length - bytesRead;
        int read = inputStream.read(byteArray, bytesRead, bytesRemaining);
        if (read > 0) {
            bytesRead += read;
        }
    }
    inputStream.close();
    FilterOutputStream binaryOutputStream = new FilterOutputStream(outputStream);
    byte [] binaryHeaders = headers.getBytes();
    byte [] fullBinaryResponse = new byte[binaryHeaders.length + byteArray.length];
    System.arraycopy(binaryHeaders, 0, fullBinaryResponse, 0, binaryHeaders.length);
    System.arraycopy(byteArray, 0, fullBinaryResponse, binaryHeaders.length, byteArray.length);
    try {
        binaryOutputStream.write(fullBinaryResponse);
        binaryOutputStream.flush();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

私が今試みているのは、PDFを提供することです。ディレクトリの 1 つに PDF があり、それをクリックすると、その PDF が開きます (ブラウザが使用するデフォルトのリーダーで)。

私はこのトピックをグーグルで検索し、1日か2日いくつか試してみましたが、理解できないようです. 現在のコードで PDF をクリックすると、ブラウザが PDF を開いているように見えますが、テキストが表示されないのは奇妙です。これは、PDF リンクをクリックしたときに見慣れている標準のブラウザー内 PDF ビューアーです。でも中身がない。それはほんの数ページの空白です。

誰でもこれを手伝ってもらえますか?外部ライブラリを使用するつもりはありません。JavaでPDFファイルを開く方法を理解したいだけです。

ありがとう!

4

1 に答える 1

3

テキストとして解析しないでください。文字が変換され、行が終了する可能性があり、望ましくないものが変更される可能性があります。全体をバイト配列としてバッファリングするのではなく、出力ストリームに直接書き込むので、メモリの問題は発生しません。代わりに、次のようにファイルを提供するだけです。

public class FileServer extends javax.servlet.http.HttpServlet
{

public void doGet(HttpServletRequest req, HttpServletResponse resp)
{
    OutputStream out=null;
    try {

        HttpSession session = req.getSession();

        out = resp.getOutputStream();
        resp.setContentType(-- specify content type here --);
        req.setCharacterEncoding("UTF-8");

        String pathInfo = req.getPathInfo();

        String fullPath = -- figure out the path to the file in question --;

        FileInputStream fis = new FileInputStream(fullPath);

        byte[] buf = new byte[2048];

        int amtRead = fis.read(buf);
        while (amtRead > 0) {
            out.write(buf, 0, amtRead);
            amtRead = fis.read(buf);
        }
        fis.close();
        out.flush();
    }
    catch (Exception e) {
        try {
            resp.setContentType("text/html");
            if (out == null) {
                out = resp.getOutputStream();
            }
            Writer w = new OutputStreamWriter(out);
            w.write("<html><body><ul><li>Exception: ");
            w.write(e.toString());
            w.write("</ul></body></html>");
            w.flush();
        }
        catch (Exception eeeee) {
            //nothing we can do here...
        }
    }
}
}
于 2013-01-18T20:33:18.713 に答える