2015-01-14 5 views
1

레지스트리에서 데이터를 가져 오려고합니다. 응용 프로그램이 디버그 모드에서 실행 중이므로 루프 변수의 값을 볼 수 있기 때문에 문제가 반복되는 동안 문제가 발생합니다. 변수는 그 마지막 null을 반환 할 때(), 당신은 물론 널 (null)이다 라인을 반환 당신이 reader.readLine에서 읽은 내용과 일치의 내용을 교체하는레지스트리에서 데이터를 읽는 것에 대해 혼란 스럽습니다.

private final String DESKTOP_PATH="\"HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\" 
      + "CurrentVersion\\Explorer\\Shell Folders\" /v Desktop"; 

    private final String REG="REG_SZ"; 

    private final String EXACUTE_STR="reg query "+DESKTOP_PATH; 
     private String getDesktopPath() throws IOException { 
     Process p = null; 
     String line = null; 
     try { 
      p = Runtime.getRuntime().exec(EXACUTE_STR); 
      p.waitFor(); 
      InputStream stream=p.getInputStream(); 


      BufferedReader reader=new BufferedReader(new InputStreamReader(stream)); 


      while((line=reader.readLine())!=null){ 
       line+=reader.readLine(); 

      } 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return line; 

답변

1

널 (null)이 할당됩니다.

대신 루프를 시작하고 추가하기 전에 StringBuilder를 만듭니다.

끝 줄을 제거하려면 추가 내에 .trim()을 사용할 수도 있습니다.

+0

짐 감사합니다. 당신 말이 맞습니다. – user3733078

2

레지스트리 처리 유틸리티를 제공하는 Java 네이티브 액세스 라이브러리 jna 사용을 고려하십시오.

단순히 문제를 해결하는 대신 다른 툴킷을 제안하는 이유는 몇 가지 항목과 관련이 있습니다. 외부 실행 파일을 시작할 때 입력 및 출력을 버퍼 방식으로 처리해야하며 두 개의 출력 스트림 (정상 및 오류)이 있어야합니다. 요약하면 일반적으로 이러한 입력 및 출력 스트림을 모두 사용할 수 있어야하지만 일반적인 개발 환경에없는 경우 일반적으로 실패를 알 수 없습니다. 나중에 생산 환경 (헤드리스, 콘솔리스 등)에서 이러한 문제가 분명해진다.

CLI 호출로 이러한 문제를 해결하려면 일반적으로 독립적 인 스레드로 출력을 캡처하도록 버퍼 수집기를 설정하고 때로는 가짜 버퍼 공급자를 사용해야합니다 (일부 프로그램은 입력이 읽을 수 있는지 확인합니다. 그들은 어떤 입력도 읽지 않는다!). JNA 라이브러리는 JNI를 사용합니다. JNI는 실행 가능한 호출을 감싸는 CMD 셸을 사이드 스테핑하여 문제를 크게 줄입니다.

그러나 코드에서 논리 오류에 대해서만 알고 싶다면 JimW가 설명해주었습니다.

관련 문제