私はこのようなものを持っています:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import javax.xml.stream.*;
import javax.xml.stream.events.*;
public class MyClass implements javax.xml.stream.StreamFilter
{
private Map myMap= new HashMap();
public Map getMap()
{
return this.myMap;
}
public void addElement(String text)
{
this.myMap.put(text, "value");
}
public void doSomething(String strValue)
{
try
{
XMLInputFactory xmlif = null;
xmlif = XMLInputFactory.newInstance();
FileInputStream fis = new FileInputStream("myFile.xml");
XMLStreamReader xmlr = xmlif.createFilteredReader(xmlif.createXMLStreamReader(fis),new MyClass());
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
OutputStream fileStream = new FileOutputStream("myFileOutput");
XMLStreamWriter xmlWriter = outputFactory.createXMLStreamWriter(fileStream);
addElement(strValue);
System.out.println(getMap().size()+"Before");
while (xmlr.hasNext())
{
write(xmlr, xmlWriter);
xmlr.next();
}
System.out.println(getMap().size()+"After");
}
catch(Exception e)
{
e.printStackTrace();
}
}
public boolean accept(XMLStreamReader reader)
{
System.out.println(getMap().size()+"inside");
if ( getMap().containsKey("Something") )
{
System.out.println("The value is there");
}
return true;
}
private void write(XMLStreamReader xmlr, XMLStreamWriter writer) throws XMLStreamException
{
switch (xmlr.getEventType()) {
case XMLEvent.START_ELEMENT:
String localName = xmlr.getLocalName();
writer.writeStartElement(localName);
break;
}
}
}
tagMapを静的として作成すると機能しますが、このクラスをスレッドに配置するため、すべてのマップが同じマップを指し、比較が役に立たなくなります。具体的には、関数 accept 内で、マップの値が 0 であることを確認しました。
関数 accept はインターフェイス SteamFilter の一部であるため、イベントが発生すると自動的に呼び出されます。マップをパブリックに変更し、コンストラクターで値を設定しようとしましたが、同じです。
クラスを作成するクラスで呼び出される方法は次のとおりです。
Runnable runClass = new Runnable(){
public void run(){
try
{
MyClass myC = new MyClass();
myC.doSomething("value");
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
Thread myTask = new Thread(runClass);
myTask.start();
関数 accept 内のマップの値を確認する方法を知っていますか?