如何从 servlet-filter 写入文件并在 Eclipse 中读取它?

Posted

技术标签:

【中文标题】如何从 servlet-filter 写入文件并在 Eclipse 中读取它?【英文标题】:How do I write to a file from a servlet-filter and read it in Eclipse? 【发布时间】:2011-12-09 14:05:58 【问题描述】:

我想从我的过滤器写入一个文件,然后能够在 Eclipse 中读取它以确保我已正确写入。

这段代码编译并运行良好,但我不知道我可以去哪里读取文件,或者我是否写过任何东西。

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
    HttpServletRequest req = (HttpServletRequest) request;

    System.out.println("filter invoked");

    InputStream in = null;
    OutputStream out = null;
    String inPath = context.getRealPath("/WEB-INF/template.txt");
    String outPath = context.getRealPath("/WEB-INF/output.txt");
    in = new FileInputStream(inPath);
    out = new FileOutputStream(outPath);

    OutputStreamWriter outstream = new OutputStreamWriter(out);
    outstream.write("hello");


    // pass the request along the filter chain
    chain.doFilter(request, response);

文件 template.txt 和 output.txt 位于 WEB-INF 目录中。我已经验证从文件中读取工作正常,但我无法验证对它们的写入。每次我写入 output.txt 时,文件仍然没有变化。

关于在 Web 应用程序环境中写入文件,我有什么不明白的地方?

【问题讨论】:

【参考方案1】:

您必须关闭您的流(这也会刷新它)(在finally 块中执行此操作)。顺便说一句,您可以使用 commons-io FileUtils 或 guava Files 这将使文件的处理更容易

但是,一般的做法是不要在 webapp 目录中写入文件,因为下次重新部署时会丢失它们。选择/配置一个外部位置来存储它们。

【讨论】:

我在 finally 块中关闭了文件。我刷新了我的项目的目录树。我打开 /WEB-INF/output.txt 还是空白。 你试过 fileutils / guava 选项了吗? 其实我放弃了。无论如何,输出文件只是临时的,所以我只是使用了 StringBuilder。我不知道为什么我以前没有想到这一点。【参考方案2】:

也不要忘记将它包装到 try finally 块中。

OutputStreamWriter outstream = new OutputStreamWriter(out);
try 
    outstream.write("hello");
 finally 
    outstream.close();

【讨论】:

【参考方案3】:

您可以使用类似下面的方法并尝试使用资源来处理流

@Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
            throws IOException, ServletException 
        // TODO Auto-generated method stub
        HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;

        HttpServletResponse response = (HttpServletResponse) servletResponse;
        System.out.println(httpRequest.getRequestURI());
        System.out.println(httpRequest.getRequestURI().toLowerCase().endsWith("/v2/api-docs"));
        ByteArrayPrinter pw = new ByteArrayPrinter();
        // here i create a response wrapper
        HttpServletResponse wrappedResp = new HttpServletResponseWrapper(response) 
            @Override
            public PrintWriter getWriter() 
                return pw.getWriter();
            

            @Override
            public ServletOutputStream getOutputStream() 
                return pw.getStream();
            

        ;
        System.out.println("before chaingin");
        // i get the response data from the stream
        chain.doFilter(httpRequest, wrappedResp);
        byte[] bytes = pw.toByteArray();
        String respBody = new String(bytes);
        System.out.println("in if" + respBody);
        if (httpRequest.getParameter("group") != null) 



            byte[] newByte = pw.toByteArray();
            String newString = new String(newByte);
            System.out.println("new string:" + newString);
            // i make a modification in the stream
            String s = newString.replaceAll("basePath", "Vijayy");
            System.out.println("printing s" + s);

            // here i try to write to a file with the modification
            try (FileOutputStream fos = new FileOutputStream(
                    new File(System.getProperty("user.dir") + "/static/openAPI.json"))) 
                System.out.println("comin in if");
                fos.write(s.getBytes());


                FileCopyUtils.copy(
                        new FileInputStream(new File(System.getProperty("user.dir") + "/static/openAPI.json")),
                        response.getOutputStream());

             catch (FileNotFoundException ex) 
                ex.printStackTrace();
            
            // FileCopyUtils.copy(, out);

            // IOUtils.copy(new ByteArrayInputStream(newString.getBytes()), response.getOutputStream());

         else 
            chain.doFilter(httpRequest, wrappedResp);
            response.setHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE);
            response.setContentLength(respBody.length());
            response.getOutputStream().write(respBody.getBytes());
        

         return;
    

ByteArrayprinter 是我为我的用例为 PrintStream 创建的包装器。同样,在您的情况下不需要考虑

【讨论】:

以上是关于如何从 servlet-filter 写入文件并在 Eclipse 中读取它?的主要内容,如果未能解决你的问题,请参考以下文章

如何从流中读取 CSV 文件并在写入时处理每一行?

PHP如何把数据写入JSON文件并在另一PHP文件读取JSON数据?

如何在写入文件时阻止对文件的访问,并在文件写入后恢复执行?

从文件中读取并在一行中写入 cout

我们可以在 servlet-filter 的 url-mapping 中没有条件吗

如何从画布前的变量中写入文本?