2012-07-03 1 views
1

을 닫은 후 파일을 삭제할 수 없습니다, 나는 AudioInputStream를 만들 : 나는 참조 된 파일을 삭제하려고하면, 내가 말하는 FileSystemException 오류가 발생, 그러나도 내 코드의 한 지점에서 그래서 AudioInputStream를

try{ 
    File f = new File(main.getWavFileName(0, tab)); 
    AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(f); 
    audioInputStream.close(); 
    audioInputStream = null; 
    f = null; 
}catch(Exception e) {e.printStackTrace();} 

을 그 파일 다른 프로세스에서 사용 중입니다. 위의 코드를 주석 처리 할 때 더 이상 오류가 발생하지 않고 파일을 삭제할 수 있습니다. AudioInputStream에 파일의 참조를 강제하지 않게 할 수있는 방법이 있습니까?

편집 : 삭제를 호출하는 코드 - 그러나 위 코드가 삭제를 호출하기 전에 실행되었음을 확인했습니다 (코드가 이전과 이후에 system.out.print를 사용하여 현재 실행 - 모르는 더 나은 방법을)

File f[] = new File(rootPath + File.separator + directoryNames.get(t)).listFiles(); 
for(File f2 : f) 
{ 
    try { 
     Files.delete(Paths.get(f2.getAbsolutePath())); 
    } catch (IOException e) { 
    e.printStackTrace();  
    } 
} 

편집 : 그냥 참고로, 난 당신은 아는 최소한의 try 문 안에 있던 코드를 감소하고, 난 여전히 오류가 발생, I 아무 이유없이 스트림을 만들려고하지 않습니다.

편집 : Windows 7을 실행 중이지만 코드를 주석 처리 할 때 파일을 삭제하는 동안 오류가 발생하지 않습니다. 내가 얻을 수는 예외입니다 : 내가 참조 된 파일을 삭제하려고하면

java.nio.file.FileSystemException: C:\Users\Fred\Desktop\test patient\June 24th, 2011\s1.wav: The process cannot access the file because it is being used by another process. 

at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86) 
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97) 
at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102) 
at sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:268) 
at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103) 
at java.nio.file.Files.delete(Files.java:1071) 
at main.closeTab(main.java:349) 
at MainButtonActionListener.actionPerformed(main.java:436) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289) 
at java.awt.Component.processMouseEvent(Component.java:6504) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
at java.awt.Component.processEvent(Component.java:6269) 
at java.awt.Container.processEvent(Container.java:2229) 
at java.awt.Component.dispatchEventImpl(Component.java:4860) 
at java.awt.Container.dispatchEventImpl(Container.java:2287) 
at java.awt.Component.dispatchEvent(Component.java:4686) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
at java.awt.Container.dispatchEventImpl(Container.java:2273) 
at java.awt.Window.dispatchEventImpl(Window.java:2713) 
at java.awt.Component.dispatchEvent(Component.java:4686) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707) 
at java.awt.EventQueue.access$000(EventQueue.java:101) 
at java.awt.EventQueue$3.run(EventQueue.java:666) 
at java.awt.EventQueue$3.run(EventQueue.java:664) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
at java.awt.EventQueue$4.run(EventQueue.java:680) 
at java.awt.EventQueue$4.run(EventQueue.java:678) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) 
+0

Windows 7을 사용하고 있습니까? 이 파일은 어디에 있습니까? UAC 관련 문제가 발생할 수 있습니다. 또한 질문에 대한 예외 사항을 게시 할 수 있습니까? –

+1

이 코드를 실행하고 close 메서드가 호출 된 후에 파일을 삭제할 수 있지만 깨끗한 스트림 처리를위한 @ GETah의 대답을 참조하십시오. 또한 실제로 삭제를 호출하는 코드를 게시 할 수 있습니까? 어쩌면 너는 우리가 볼 수없는 경주를 벌일지도 모른다. –

+0

이 게시물을 통해 http://windowsxp.mvps.org/processlock.htm 파일을 잠그는 프로세스를 찾으십시오. 정확한 스택 추적과 예외가 도움이 될 것입니다.또한 try 블록 대신 finally 블록에서 스트림을 닫을 수도 있습니다. – Egalitarian

답변

4

, 나는 파일이 다른 프로세스가

또 다른 프로세스에 의해 사용 중임을 말하는 FileSystemException 오류 아마 당신 :) 코드가 try 절에 예외가있을 경우 스트림을 닫지 않습니다. 요컨대,이 audioInputStream.close();은 호출 전에 예외가 발생하는 경우에 절대로 호출되지 않습니다. 스트림을 처리 할 때 당신은 항상 다음을 수행해야합니다

Stream stream = null; 
try{ 
    // Instantiate and do something with stream 
}catch(...){ 

}finally{ 
    // Close your streams here 
} 

이것은 당신의 스트림이 try catch 블록이하는대로 폐쇄 보장합니다.

+0

좋은 연습을 위해 +1,하지만이 문제의 해결책이되지 않을 수도 있습니다 –

+0

감사합니다. 특정 지역의 문제를 좁히는 데 도움이 될 것이라고 확신합니다. – GETah

+0

좋은 코딩 방법을 찾아 주셔서 감사합니다. 앞으로 이것을 사용하도록하겠습니다. 그러나, 나는 사용하고있는 코드에서 생성 된 예외를 얻지 못했으며이 형식으로 전환해도 문제가 해결되지 않습니다. 너는 이것 저쪽에 아이디어가 있니? –

0

또한 이벤트 발송 스레드에서 삭제를 수행하는 것처럼 보입니다. 어떤 스레드가 오디오 스트림을 열거 나 닫는가? 그들이 순서대로 진행되고 있는지 확인할 수 있습니까? (printlns를 추가했다는 것을 알고 있습니다 만, 여기서 가능한 스레딩 문제에 관해 궁금합니다.)

여기 파일을 열거 나 닫은 다음 고립 된 코드 블록을 작성했습니다. 그것은 나를 때를 위해 완벽하게 작동, 특히 있기 때문에, 이러한 시도를 부여하고 (아무 문제가 여기에 작동하는) 당신을 위해 작동하지 않는 경우 난 그냥 다시 게시물을하려면이 옵션을 주석에서보고 쉽게 있도록 할

import java.io.File; 
import java.io.IOException; 

import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.UnsupportedAudioFileException; 

public class AudioTest 
{ 

    public static void main(String[] args) throws Exception 
    { 
     File file = new File(args[0]); 
     AudioTest test = new AudioTest(); 
     test.openCloseFile(file); 
     file.delete(); 
    } 

    private void openCloseFile(File file) throws IOException, UnsupportedAudioFileException 
    { 
     AudioInputStream audioInputStream = null; 
     try 
     { 
      audioInputStream = AudioSystem.getAudioInputStream(file); 
     } 
     finally 
     { 
      if (audioInputStream != null) 
      { 
       audioInputStream.close(); 
      } 
     } 
    } 
} 
+0

안녕하세요 제프,이 코드를 실행 해 보았습니다. 불행히도 여전히 오류가 발생합니다. 내 구현에서는, 주요 args에서 파일을 가져 오는 대신, 방금 프로그램에 바로 입력했습니다. Files.delete (Paths.get (file.getPath()));)를 사용하여이 작업을 수행 할 수 있습니까? 삭제할 수없는 파일을 삭제할 때 예외가 발생하면 file.delete()가 예외를 throw하지 않습니다. 코드가있는 파일을 성공적으로 삭제 했습니까? –

+0

Paths.getFile (파일이 Guava 호출이라고 가정)이란 무엇입니까? 네, 파일이 성공적으로 삭제되었습니다. 디버거로 삭제 호출을 단계별로 시도 했습니까? –

+0

JDK7의 새 입력 출력 부분입니다. 아직 디버거를 단계별로 실행하지 않았지만, 그 다음에 시도해 보겠습니다. 디버거에 대한 많은 경험이 없었습니다. 편집 : 미안, JRE7, jdk1.7 내 생각 엔? 버전 명명 방식이 확실하지 않습니다. –

0

참조 편집 및 많은 파일 삭제 :

try 블록에 System.gc를 넣어보십시오!

관련 문제