简体   繁体   English

使用 FileOutputStream 写入后无法删除文件

[英]Cannot delete file after writing using FileOutputStream

I have RESTful Web Service where it has a function to upload file.我有 RESTful Web 服务,它具有上传文件的功能。 It is working well but my problem is when I try deleting the uploaded file manually in Windows it says the file is already used.它运行良好,但我的问题是当我尝试在 Windows 中手动删除上传的文件时,它说该文件已被使用。

To delete those files I need to stop the Glassfish server.要删除这些文件,我需要停止 Glassfish 服务器。 My concern is the memory usage maybe this unmanage code will cause some issue when user keep uploading many and large files.我担心的是内存使用情况,当用户不断上传许多大文件时,这个未管理的代码可能会导致一些问题。 I already close the InputStream and FileOutputStream variables.我已经关闭了InputStreamFileOutputStream变量。 Please see below code I do not know what I am missing.请看下面的代码我不知道我错过了什么。

@POST
@Path("upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public String upload(@FormDataParam("file") InputStream uploadedInputStream, 
        @FormDataParam("file") FormDataContentDisposition fileDetail, @Context HttpServletRequest request) {
    String json = "";
    FileOutputStream out = null;
    try {
        File dir = new File(new File(".").getCanonicalPath() + File.separatorChar + "incidentreport" + File.separatorChar + "uploaded" + File.separatorChar + deviceId);
        dir.mkdirs();
        String location = dir.getAbsolutePath() + File.separatorChar + fileDetail.getFileName();
        out = new FileOutputStream(new File(location));
        int read = 0;
        byte[] bytes = new byte[1024];
        out = new FileOutputStream(new File(location));
        while ((read = uploadedInputStream.read(bytes)) != -1) {
            out.write(bytes, 0, read);
        }

        com.incidentreport.model.File file = new com.incidentreport.model.File(fileDetail.getFileName(), false);
        //FLAG FILE AS UPLOADED
        Response response = file.uploaded(deviceId, device.getId(), Util.toSqlTimestamp(dateUtc, "yyyy-MM-dd HH:mm:ss"));
        //DELETE UPLADED FILE IF FLAGGING NOT SUCCEED
        if(response.getStatus() != Response.SUCCESS) new File(location).delete();
        json = new Gson().toJson(response);
    } catch (Exception ex) {
        Logger.getLogger(FileResource.class.getName()).log(Level.SEVERE, null, ex);
        json = new Gson().toJson(new Response(Response.ERROR, ex.getMessage()));
    } finally {
        try {
            uploadedInputStream.close();
            uploadedInputStream = null;
            out.flush();
            out.close();
            out = null;
        } catch (IOException ex) {
            Logger.getLogger(FileResource.class.getName()).log(Level.SEVERE, null, ex);
            json = new Gson().toJson(new Response(Response.WARNING, ex.getMessage()));
        }
    }
    return json;
}

You have initialized your FileOutputStream out twice: as soon as the second assignment takes place, the first created stream remains in the memory as non-referenced object until garbage collection takes place.您已经将FileOutputStream out初始化FileOutputStream out两次:一旦第二次赋值发生,第一个创建的流就会作为非引用对象保留在内存中,直到发生垃圾回收。 Since the server is not stopped and probably memory load is not too high and garbage collector doesn't collect the garbage that's why you cannot delete it from Windows.由于服务器没有停止并且可能内存负载不是太高并且垃圾收集器不会收集垃圾,这就是您无法从 Windows 中删除它的原因。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM