1

私はサーブレットで作業しており、次のコードがあります:

public void doPost(blah blah){

   response.setContentType("text/html");

    String datasent = request.getParameter("dataSent");
    System.out.println(datasent);

    try{

        FileWriter writer = new FileWriter("C:/xyz.txt");
        writer.write("hello");


        System.out.println("I wrote");
    }catch(Exception ex){
        ex.printStackTrace();
    }

    response.getWriter().write("I am from server");

}

しかし、アクセスが拒否されたというエラーがスローされるたびに..そのファイルにロックがなく、名前がC:/xyz.txtのファイルがない場合でも

私は何をすべきか?;(

   java.io.FileNotFoundException: C:\xyz.txt (Access is denied)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:212)
at java.io.FileOutputStream.<init>(FileOutputStream.java:104)
at java.io.FileWriter.<init>(FileWriter.java:63)
at test.TestServlet.doPost(TestServlet.java:49)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:558)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:237)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:281)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
4

4 に答える 4

5

FileWriter を閉じてみてください:

writer.close();

何が起こるか想像してみてください。Tomcat の 1 つのスレッドがファイルを作成して終了しますが、そのハンドルを閉じないため、ファイル システム ビューからファイル ロックが解放されません。別のスレッドが書き込みのためにそれを開こうとしますが、OS はファイルへの書き込みアクセスを許可できません。これは、既に保留中のファイルがあるためです。

これはリソース リークと呼ばれます。ガベージ コレクターは、プログラマーが手動で割り当てたリソースを解放しません (ここでは IO ハンドル)。

于 2013-04-07T19:56:25.610 に答える
0

このサイトを見てみてください(いくつかスクロールダウンしてください)

于 2012-10-20T22:54:55.140 に答える
-1

このプロセス中は、ファイルを開かないでください。以下のようにしてください。

FileWriter writer = new FileWriter("C:/xyz.txt", true);
BufferedWriter out = new BufferedWriter(writer);
out.write("your text");
out.close();
于 2012-10-19T16:49:27.577 に答える
-1

例外は、それが FileNotFound Exception であることを示しています。最初に新しいファイルを作成してみてください。次のコードで試してください。

File file = File file("c:/xyz.txt");
if(!file.exists()){  // this will return boolean {true} if file exists.
   file.createNewFile(); // create new empty file.
}
FileWriter writer = new FileWriter("C:/xyz.txt", true);
BufferedWriter out = new BufferedWriter(writer);
out.write("your text");
out.close();

問題ありません..さまざまなリーダーとライターを使用してそれを理解しようとします。

    String currentExecutablePath = System.getProperty("user.dir");
    String rootPath = currentExecutablePath + "xyz.txt";
    File file = new File(rootPath);
    ServletOutputStream op = res.getOutputStream(); 
    if(file.exists()){
        int length = 0;
        res.setContentType("application/octet-stream");
        res.setContentLength((int) file.length());

        byte[] bbuf = new byte[1000];
        DataInputStream in = new DataInputStream(new FileInputStream(file));            
        while ((in != null) && ((length = in.read(bbuf)) != -1)) {
            op.write(bbuf, 0, length);
        }
    }
于 2012-10-19T17:13:34.140 に答える