2014-07-16 2 views
1

다른 프로그램을 사용하여 bin 파일을 xml로 변환 한 다음 파일을 읽으려고합니다. 다음 코드로 : 나는 FileNotFoundException이 얻을다른 프로세스에서 파일을 사용하고 있지만 canRead()가 true를 반환합니다.

File file = new File(currentPath + "/ammunition.bin"); 
File file2 = fileTools.convert(file); 
ArrayList<String> asd = fileTools.readFile(file2); 

는 "파일은 다른 프로세스에서 사용하고 있습니다." 이게 이상한 이유는 file.canRead()는 예외가 발생하더라도 true를 반환한다는 것입니다. 다음 코드의 나머지 부분입니다 :하는 대신

public ArrayList<String> readFile(File file) { 

    ArrayList<String> result = new ArrayList<>(); 
    Scanner reader; 
    try { 
     reader = new Scanner(file, "UTF-8"); 
    } catch (FileNotFoundException ex) { 
     boolean b = file.canRead(); 
     StringWriter errors = new StringWriter(); 
     ex.printStackTrace(new PrintWriter(errors)); 
     JOptionPane.showMessageDialog(null, errors.toString()); 
     alertError("readFile\n" + b + " " + ex.getMessage()); 
     return null; 
    } 
    while (reader.hasNext()) { 
     result.add(reader.nextLine()); 
    } 
    reader.close(); 
    return result; 
} 

public File changeFileExtension(File f, String ext) { 
    String name = f.getAbsolutePath(); 
    int i = name.lastIndexOf("."); 
    name = name.substring(0, i) + "." + ext; 
    f = new File(name); 
    return f; 
} 


public File convert(File file) { 

    File binConverter = new File(this.currentPath + "\\GibbedsTools\\Gibbed.Avalanche.BinConvert.exe"); 

    if (!binConverter.exists()) { 
     alertError("convert\nGibbedsTools is missing, it should be in\n" + this.currentPath + "\\GibbedsTools\\Gibbed.Avalanche.BinConvert.exe"); 
     return null; 
    } 

    if (!file.exists()) { 
     alertError("convert\nFile does not exist\n" + file.getAbsolutePath()); 
    } 

    String name = file.getName(); 
    String extension = name.substring(name.lastIndexOf(".") + 1, name.length()); 

    Runtime rt = Runtime.getRuntime(); 

    try { 
     rt.exec("cmd.exe /c " + "\"\"" + this.currentPath + "\\GibbedsTools\\Gibbed.Avalanche.BinConvert.exe\" \"" + file.getAbsolutePath() + "\"\""); 
    } catch (IOException ex) { 
     alertError("binToXml\n" + ex.getMessage()); 
     return null; 
    } 

    File file2 = changeFileExtension(file, extension.equals("xml") ? "bin" : "xml"); 

    int timepassed = 0; 

    while (!file2.exists() || !file2.canWrite() || timepassed <= 50) { 
     try { 
      Thread.sleep(50); 
     } catch (InterruptedException ex) { 
      alertError("binToXml\n" + ex.getMessage()); 
      return null; 
     } 
     timepassed += 50; 
     if (timepassed > 3000) { 
      if (!file2.exists()) { 
       alertError("convert\nError, binconverter probably crashed (No xml file created after 3 seconds from passing file to binconverter)\n" 
         + "xml file should be in:\n" 
         + file2.getAbsolutePath() + "  Found: " + file2.exists()); 
       return null; 
      } 
     } 
     if (timepassed > 6000 && !file2.canWrite()) { 
      alertError("convert\nCan't write to the xml file after 6 seconds from passing the file to binconverter." 
        + file2.getAbsolutePath() + "  Can write: " + file2.canWrite()); 
      return null; 
     } 
    } 

    return file2; 
} 
+0

정확히 어떤 시점에서 예외가 있습니까? – nafas

+0

"reader = new Scanner (파일,"UTF-8 ")에서" – FINDarkside

+0

시도해보십시오 : 매개 변수로 파일을 보내는 대신 ur 메서드에서 파일을 만들고 동일한 문제가 있는지 확인하십시오. 동일한 문제가 발생하지 않으면 메서드를 호출하기 전에 잘못된 작업을 수행하고 있습니다 – nafas

답변

1

가 :

Runtime rt = Runtime.getRuntime(); 
. 
. 
. 

대신이 시도 : 그것을 사용하여 끝날 때까지

Process p = Runtime.getRuntime().exec("cmd.exe /c " + "\"\"" + this.currentPath + "\\GibbedsTools\\Gibbed.Avalanche.BinConvert.exe\" \"" + file.getAbsolutePath() + "\"\""); 

다음 기다릴 수

p.waitFor(); 

한 번 외부 프로그램이 끝나면 파일이 해제됩니다. 더 나은 솔루션은 물론

p.destroy(); 

이 그것을 사용하지 않도록하려고 사용하여 당신은 또한 과정을 파괴 할 수 Processbuilder

사용하는 것입니다. 프로그램이 다루어야 할 고통이 없다면 말이다.

관련 문제