2017-10-16 11 views
0

RandomAcessfile私はその中にデータを書き込む前に空にする必要があります。私はini.setlength(0)を作るときに私のコードは言うエラーキャッチ:?ここ Java:ストリームが閉じられた例外

"stream is closed" java.io.IOException: Stream Closed 
at java.io.RandomAccessFile.setLength(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSiteNoUnwrap.invoke(PojoMetaMethodSite.java:213) 
at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 
at locckGroovy.main(locckGroovy.groovy:82) 

が私のコードで、私は何を変更する必要があります(それは、この機能はすべてのINIチャネルを閉じ、その後、私はしてみてください)(そのini.setlengthをpossbileですまた、チャネルをクローズします)、RAFのためのユニークな

class locckGroovy { 
    private static void setValue(String tag, Element element , String input) { 
     NodeList nodes = element.getElementsByTagName(tag).item(0).getChildNodes(); 
     Node node = (Node) nodes.item(0); 
     node.setTextContent(input); 

    } 
    public static void main(String[] args) { 
     File file = new File("C://Users//user//Desktop//conf1.xml"); 
     String content = ''; 
     BufferedReader s; 
     BufferedWriter w; 
     RandomAccessFile ini; 
     FileLock lock; 
     DocumentBuilder dBuilder = null; 
     Document doc=null; 
     String start, startDate, endDate, runAs, makeVersion, patch; 
     try { 
      ini = new RandomAccessFile(file, "rwd"); 
      lock = ini.getChannel().lock(); 
      String sCurrentLine; 
      s = new BufferedReader(Channels.newReader(ini.getChannel(), "UTF-8")); 


      while ((sCurrentLine = s.readLine()) != null) { 
       content += sCurrentLine; 
      } 

      s.close(); 
      DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
      dBuilder = dbFactory.newDocumentBuilder(); 
      InputStream stream = new ByteArrayInputStream(content.getBytes('UTF-8')); 
      doc = dBuilder.parse(stream); 
      doc.getDocumentElement().normalize(); 

      NodeList nList = doc.getElementsByTagName("localAttributes"); 
      int m = 0; 


      for (int i = 0; i != nList.getLength(); ++i) { 
       Node child = nList.item(i); 
       if (!(child instanceof Element)) 
        continue; 

       if (child.getNodeType() == Node.ELEMENT_NODE) { 
        Element element = (Element) child; 


        setValue("runAs", element, "true"); 
       } 

      } 

      TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
      Transformer transformer = transformerFactory.newTransformer(); 
      DOMSource source = new DOMSource(doc); 
      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      StreamResult result1 = new StreamResult(bos); 
      try { 
       transformer.transform(source, result1); 
      } catch (TransformerException e) { 
       e.printStackTrace(); 
      } 
      byte[] array = bos.toByteArray(); 
      String data = bos.toString(); 
      if (!data.isEmpty()) { 
       ini.setLength(0); 
       w = new BufferedWriter(Channels.newWriter(ini.getChannel(), "UTF-8")); 
       w.write(data); 
       w.close(); 


      } 


     }finally { 
      lock.release(); 
      ini.close(); 
     } 

    } 
} 
+0

どの行が例外をスローしますか? **あなたの質問にstacktraceを含める** – Kayaman

+0

ini.setLength(0); –

+0

書き込み処理が同期化されている可能性はありますか?processRandomAccessFile ini = new RandomAccessFile(file、 "rw");あまりにも多くの時間がかかり、私はそれのストリームbacausを閉じることができないのですか? –

答えて

0

ini.getChannel(の結果)であるが(yourBufferedReader.closeすることにより、間接的にそれを閉じる:?)私の最後にコードで第二に、それを閉じます。

実際には、代わりにpositionを0にリセットし、bufferedreaderを閉じる必要はありません。

すべての使用後にすべてを閉じることができます。

+0

あなたは0に位置をリセットすることによって何を意味する –

+0

yourRa.seek(0) –

+0

これは、ファイルの先頭にストリームを再度指し示すでしょう –

関連する問題