2010-05-04 2 views
1

내 응용 프로그램에서 구문 분석되고 작성된 XML 파일이 있습니다.Java 응용 프로그램 번들에서 읽기/쓰기 XML 파일

읽기 :

private String xmlFile = "file.xml"; 

을 한 후 나는 문서 구축 : 내 IDE (이클립스) 내에서 단순히 이런 식으로 해결

doc = sax.build(xmlFile); 

작성은 다음과 같이 수행됩니다

writer = new FileWriter("file.xml"); 

지금까지는 훌륭하게 실행되었지만 애플리케이션을 번들 한 후에는 파일에 더 이상 액세스 할 수 없습니다. 애플리케이션 번들 내에서 액세스 가능하게하려면 정확히 무엇이 필요합니까? 나는 클래스 패스 나 내가 필요로하는 것에 익숙하지 않다. 그래서 나에게 쉽게 가라.

대단히 감사합니다!

+0

아래 답변을 싫어한다는 것을 알기 때문에 파일이 jar/jars/war에 패키지로 제공되는지 여부를 알고 싶습니다. 어떤 경우에는 클래스 로더에서 리소스를 검색하는 것과 관련된 아래 답변이 작동해야합니다. 응용 프로그램과 함께 번들되지 않은 경우 클래스로드 메커니즘을 통해 조회하면 도움이되지 않습니다. – Yaneeve

+0

AFAIK 있습니다. Eclipse를 사용하여 프로젝트를 OS X 응용 프로그램 번들로 내보내고 xml 파일이있는 res 폴더를 번들에 추가합니다. 이제 번들을 살펴보면 JAR 파일이 표시됩니다. 추출한 파일에는 res 폴더가 들어 있습니다. 그렇습니다. 파일은 확실히 JAR 파일 내에 패키지되어 있습니다. 편집 : 나는 대답을 싫어하는 것이 아니라, 반대로 나는 모든 코멘트에 대해 감사하고있다. 그러나 그들은 단지 내 경우에는 효과가없는 것 같다. – Peter

+0

파일 이름뿐만 아니라 항아리 내의 경로. 파일 이름이 file.xml이고 res 폴더에 있고 res 폴더가 jar 파일의 최상위 폴더 인 경우 "res/file.xml"에 액세스해야합니다. – Yaneeve

답변

0

입력 파일의 절대 또는 상대 경로 여야합니다 ....

+0

파일 시스템에서 응용 프로그램의 위치가 제한되므로 절대 경로를 사용하지 않겠습니다. 상대 경로를 시도했지만 작동하지 않습니다. – Peter

1

파일을 속성으로 사용하십시오. 당신이 원하는대로 할 수 있습니다. 액세스하려면

Class.getResourceAsStream() 

또는 이와 동등한 방법을 사용하십시오. 몇 가지 힌트를 위해이 링크를 체크 아웃 : http://www.javaworld.com/javaworld/javaqa/2003-08/01-qa-0808-property.html?page=2

편집 :
나는 내가 생각했던 나의 제안은 좋은 아니라고 말할 죄송합니다. 나는 당신이 한 번하고 싶었던 것처럼 내가 뭔가를했다고 느꼈지만 그 응용 프로그램을 보았습니다. 그리고 그 모든 파일들을 읽었습니다. 나는 또한 googleing의 비트를했고, 조금 오래된하지만 난 그게 본질의 이해 할수 일의 부분에서 부족 진행 상황을 검토하고이 포럼 항목을 발견은 여전히 ​​유효 : http://lists.apple.com/archives/Java-dev/2003/Feb/msg00876.html

기본적으로, 당신이 뭔가를 작성하려는 경우, 하나 필요 사용자가 실행하기 전에 항아리를 추출하거나 (내 제안) 항아리가있는 디렉토리와 동일한 디렉토리에 디렉토리를 작성하고 해당 디렉토리에 파일을 작성하십시오. 정말로 필요하다면, 그 파일과 원본 병의 모든 파일을 가지고 다른 병을 만들 수도 있습니다. 물론 원래의 병은 두 개의 보관소를 가지고 있습니다.

귀하의 희망을 불러 일으키는 것에 대해 사과드립니다.

+0

그래, 나에게 이걸로 남겨둔다 : this.getClass(). getResourceAsStream ("file.xml") 하지만 이것으로 무엇을해야합니까? 특히 쓰기 방법에 관해서? – Peter

+0

그건 좋은 소식이고 나는 이것을 완전히 알지 못했습니다! 대단히 감사합니다! 사실 XML 파일을 JAR 파일에 넣을 필요가 없습니다. JAR 파일과 동일한 폴더에 있어야 파일을 읽고 쓸 수 있습니다. – Peter

1

는 myXmlDir라는 이름의 패키지 (디렉토리 실제로)이 패키지에서이 패키지는 항아리 안에 당신 클래스와 함께 패키지 및 클래스 로더에 의해 액세스 할 수 있는지

주의를 당신의 file.xml 파일을 넣어 것을 상상해보십시오.

+0

먼저 대답 해 주셔서 감사합니다. 이것은 내 IDE에서 작동하지만 응용 프로그램 번들을 만들 자마자 파일에 더 이상 액세스 할 수 없으므로 응용 프로그램이 충돌합니다. – Peter

2

파일을 읽으려면 당신이로의 BufferedReader를 만들 수 있습니다 당신은 또한, 대신에 대해서 openStream()의의 대해서 getFile() 함수를 활성화 할 수 있습니다

return SomeClass.class.getClassLoader().getResource("myXmlDir/file.xml").openStream(); 

:

입력 스트림을 반환 코드를 참조하십시오 다음 :

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(
    getClass().getResourceAsStream("file.xml"))); 

당신은 이전 파일을 쓸 수 있지만이 기록 어디의 트랙을 유지할 수 있습니다 - 필요한 경우 다음 거기에서 파일을 다시 읽을 수 있습니다.

+0

전체적인 문제는 내가 액세스하려고 시도하는 파일을 내 애플리케이션 번들에서 사용할 수 없다는 것입니다. 사용하는 클래스 로딩 기술은 무엇이든간에 아래의 ekeren의 게시물에 대한 내 의견을 참조하십시오. 나는이 일을하기 위해 정확히 무엇을해야하는지 알 수 없다. 내가 말했듯이, 나는이 주제에 대해 절대적으로 새로운 것이다. : – Peter

1

나는 대답 할 수 없다. 나의 대답은 LES2의 대답을 말하는 것이다. 속임수는 클래스 로더를 사용하려는 경우 file.xml이 클래스 경로에 있어야한다는 것입니다.

일반적으로 JAR 파일에있는 경우 클래스 경로에 포함됩니다. 거기 있는지 확인하려면 7zip 또는 다른 zip 프로그램으로 항아리를여십시오. 파일이 jar 파일 안에 없으면 jar 파일과 함께 제공하고 app을 시작할 때 classpath에 수동으로 추가해야합니다.

file.xml과 jar가 같은 디렉토리에 있다고 가정합니다.

java -cp .:myjar.jar com.example.Main 

도와주세요. 당신이 항아리에서 파일을 패키징 때, 압축 등 :

+0

안녕하세요! 파일이 JAR 파일에 패키지되어 있기 때문에 왜 이것이 작동하지 않는지 이해할 수 없습니다. 첫 번째 게시물의 댓글보기 – Peter

2

나는 비슷한 문제로 실행했습니다, 그리고 당신이에 익숙하기 때문에, 나는이 시작하자이

피터, jar 파일로 압축 된 파일을 읽을 수 없으므로 원래 코드 에서처럼 액세스하면 작동하지 않습니다. 대신, Java가 스트림을 제공하도록 Java에 요청해야합니다 (많은 다른 사람들이 유용하게 지적한 것처럼). Java가 제공하는 방법을 알고 있습니다.

이제 파일을 실제로 출력하는 것은 고통입니다. 여기에 제가 작성한 코드가 있습니다. 물론 다른 소스에서 찾아 볼 수 있습니다. 필요에 따라 예외를 기입하십시오! =)

 InputStream in = null; 
     in = this.getClass().getResourceAsStream("/main.cc"); 

     File outputFile = createMainOutputFile(); 
     OutputStream out = null; 
     try { 
      out = new FileOutputStream(outputFile); 
     } catch (FileNotFoundException e) { 
      System.out.println(outputFile + " was not found!"); 
      e.printStackTrace(); 
     } 

     // Transfer bytes from in to out 
     byte[] buf = new byte[1024]; 
     int len; 
     try { 
      while ((len = in.read(buf)) > 0) { 
       out.write(buf, 0, len); 
      } 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      in.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      out.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

실제로 파일 조각을 출력해야합니다. 슬픈 사실을 알고 있습니다. 정말 기대했던대로하고 싶습니다. 인생을 훨씬 쉽게 만들어 줄 것입니다. createMainOutputFile() 호출이 혼동 될 수있는 유일한 방법은, 그래서 여기 ... 너무에 대한 코드의

private File createMainOutputFile() { 
    File directoryPath = new File(mainOutputFolder); 
    directoryPath.mkdirs(); 
    File newFile = new File (mainOutputFolder + "main.cc"); 
    try { 
     newFile.createNewFile(); 
    } catch (IOException e) { 
     System.out.println("failed To create new file."); 
     e.printStackTrace(); 
    } 
    return newFile; 
} 

행운을 빕니다!

편집 : XML 파서로 파싱을한다는 것을 알게되었으므로, 적어도 아파치 파서 (apache 파서)를 사용하고 있다면 실제로는 그냥 것 파일과 같은 InputStream를 받아이 일반적인 문제에

DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder docBuilder = null; 
     try { 
      docBuilder = docFactory.newDocumentBuilder(); 
     } catch (ParserConfigurationException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      //Here we supply the inputStream instead of the file... 
      doc = docBuilder.parse(inputStream); 
     } catch (SAXException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     Node xmlRoot = doc.getFirstChild(); 
+0

감사합니다. 그것을 주셔서 감사합니다. 해보 겠어! – Peter

+0

어떤 업데이트가 있습니까? 여전히 문제가 있습니까? –

1

최선의 선택 : 병/전쟁 이외의 위치에 대한 절대 경로를.

다음은 응용 프로그램 자체는 어디 배포 할 수 있지만, 호스트는 "/ 일반/파일/someApplication"

가 더 좋은 빌드하는 동안 또는에서 (지정하는 구성을하는 것입니다 같은 일반적인 파일 영역이 있어야합니다 런타임)을 사용합니다. 예 :dev 빌드는 "/ dev/myprojects/someApplication"을 사용합니다.

좋지 않은 해결책 : 분해 된 war 파일로 배포하십시오. 읽기 및 쓰기는 문제가 아니지만 지금은 배포 종속성을 유발합니다.

+0

절대 주소 지정은 완벽하게 작동하지만 응용 프로그램에 설치 프로그램이 필요합니다. 설치 프로그램은 필요하지 않습니다. OS X 응용 프로그램은 일반적으로 설치 프로그램과 함께 제공되지 않습니다. 응용 프로그램의 drag'n'drop이 선호됩니다. 나는 절대 주소 지정이 효과가 있지만 상대 주소가 아닌 이유를 알 수 없다. 예를 들어 앱을 내보내고 XML 파일 주소를 "/file.xml"로 설정 한 경우 원하는 위치에 번들을 배치 할 수 있지만 상대적으로 주소를 지정할 수없는 이유는 무엇입니까? Absolut – Peter

+0

여기에 생각이 있습니다 (그런데, 그 문제들과 혼자가 아니라, 나는 당신이 말하는 것을 정확히 알고 있습니다.) : "/file.xml"은 아마 항아리의 루트 디렉토리를 가리 킵니다. 포함하는 디렉토리로 이동하기 위해 "../"를 앞에 붙이려고 했습니까? –

관련 문제