2013-12-09 2 views
1

Я хочу вернуть файл (читать или загрузить) из метода, а затем удалить этот файл.Как вернуть и удалить файл?

public File method() { 
    File f = loadFile(); 
    f.delete(); 
    return f; 
} 

Но когда я удалить файл, я удалить его с диска, а затем существует только дескриптор несуществующего файла на оператора возврата. Итак, что является самым эффективным способом для этого.

+7

Что вы имеете в виду по "возврату файла"? Знаете ли вы, что «Файл» на самом деле просто оболочка вокруг имени файла, которая может даже не существовать? Возможно, вы действительно хотите вернуть * содержимое * файла, как массив байтов, список строк или что-то подобное? –

+0

И в системах Unix вы можете открыть файл и вернуть открытый дескриптор некоторого разнообразия, но Windows не позволит вам удалить открытый файл. – chrylis

ответ

2

Вы не можете держать ручку файла удаляемого файла, а вы можете сохранить данные в байте массив временно удалите файл, а затем возвращает массив байтов

public byte[] method() { 
    File f =loadFile(); 
       FileInputStream fis = new FileInputStream(f); 
       byte[] data = new byte[fis.available()]; 
       fis.read(data); 
       f.delete(); 
    return data; 
} 

// Edit Подход 2

   FileInputStream input = new FileInputStream(f); 
       ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
       byte[] buf = new byte[1024]; 
       int bytesRead = input.read(buf); 
       while (bytesRead != -1) { 
        baos.write(buf, 0, bytesRead); 
        bytesRead = input.read(buf); 
       } 
       baos.flush(); 
       byte[] bytes = baos.toByteArray(); 

можно построить файл данных из массива байтов

Однако, мое предложение заключается в использовании IOUtils.toByteArray (вход InputStream) от Jakarta commons, почему вы хотите повторно писать, когда уже в тарелке

+0

Рассмотрите возможность чтения в цикле. –

0

Предполагая, что вы хотите вернуть файл в браузере, это то, как я это сделал:

File pdf = new File("file.pdf"); 
if (pdf.exists()) { 
    try { 
    InputStream inputStream = new FileInputStream(pdf); 
    httpServletResponse.setContentType("application/pdf"); 
    httpServletResponse.addHeader("content-disposition", "inline;filename=file.pdf"); 
    copy(inputStream, httpServletResponse.getOutputStream()); 
    inputStream.close(); 
    pdf.delete(); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
} 

private static int copy(InputStream input, OutputStream output) throws IOException { 
    byte[] buffer = new byte[512]; 
    int count = 0; 
    int n = 0; 
    while (-1 != (n = input.read(buffer))) { 
     output.write(buffer, 0, n); 
     count += n; 
    } 
    return count; 
}