我有这样的事情:
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接口的一部分,因此在事件发生时会自动调用它。我已经尝试将地图更改为public,甚至用构造函数设置值,但它是相同的。
在创建类的类中调用它的方式是:
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中检查地图的值吗?
答案 0 :(得分:1)
您使用新的MyClass实例(尚未调用doSomething
的实例)实现您的FilterReader。如果您使用当前正在处理的相同实例启动它,它应该可以工作。
变化:
xmlif.createFilteredReader(xmlif.createXMLStreamReader(fis),new MyClass())
到
xmlif.createFilteredReader(xmlif.createXMLStreamReader(fis),this)
答案 1 :(得分:0)
我假设每个线程都引用了MyMap的实例(可能是相同的实例)。
他们应该能够在引用上调用getMap()。