0

私はこのようなものを持っています:



    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 内のマップの値を確認する方法を知っていますか?

4

2 に答える 2

1

FilterReaderをMyClassの新しいインスタンス(doSomethingまだ呼び出されていないインスタンス)でインスタンス化します。代わりに、現在作業中の同じインスタンスで起動すると、機能するはずです。

変化する:

xmlif.createFilteredReader(xmlif.createXMLStreamReader(fis),new MyClass())

xmlif.createFilteredReader(xmlif.createXMLStreamReader(fis),this)
于 2012-04-18T21:36:41.810 に答える
0
  1. すべてのスレッドにMyMapのインスタンス(おそらく同じインスタンス)への参照があると思います。

  2. 参照でgetMap()を呼び出すことができるはずです。

Q:何かが足りないのですか????

于 2012-04-18T21:34:34.243 に答える