2014-02-10 3 views
0

Я хотел бы создать глобальный объект FileInputStream и использовать его в течение длительного времени для моего приложения.Как создать объект Global FileInputStream, который будет доступен для доступа из другого класса внутри моего проекта?

У меня есть класс последующего, которые создают свое FileInputStream объективистское и возвращают результат моего запроса через файл XML:

package Engine; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.util.ArrayList; 
import com.ximpleware.AutoPilot; 
import com.ximpleware.VTDException; 
import com.ximpleware.VTDGen; 
import com.ximpleware.VTDNav; 

public class BACENGQueryXMLbyVTD { 
    public String query; 
    public String path; 
    public BACENGQueryXMLbyVTD(String query, String path) { 
    this.query = query; 
    this.path = path; 
} 
public ArrayList query() throws IOException, VTDException { 
    System.out.println(path); 
    File f = new File(path); 
    //System.out.println(f); 
    FileInputStream fis = new FileInputStream(f); 
    //System.out.println(fis); 
    byte[] xmlContent = new byte[(int) f.length()]; 
    fis.read(xmlContent); 
    VTDGen vg = new VTDGen(); 
    vg.setDoc(xmlContent); 
    vg.parse(false); 
    VTDNav vn = vg.getNav(); 
    AutoPilot ap = new AutoPilot(vn); 
    int node = 0; 
    ap.selectXPath(query); 
    int i; 
    ArrayList<String> interfaces = new ArrayList<String>(); 
    while ((i = ap.evalXPath()) != -1) { 
     vn.push(); 
     interfaces.add(vn.toString(i + 1)); 
    } 
    ap.resetXPath(); 
    return interfaces; 
} 
} 

Этот класс вызываются из моего основного класса, который имеет петлю.

for (int c = 0; c < nodeNames.size(); c++) { 
String Queries2 = "/import_data/group/node[@name='" +nodeNames.get(c) + "']/interface/@network_value"; 
BACENGQueryXMLbyVTD getNodesInterfaces = new BACENGQueryXMLbyVTD(Queries2, TransitPath); 
listOfNodeInterfaces = getNodesInterfaces.query(); 
} 

Он работает отлично, однако, чтобы уменьшить потребление ресурсов IO на моем сервере HD. Я хотел бы создать уникальный объект FileInputStream и использовать его для каждого запроса, который должен быть выполнен.

Может ли кто-нибудь указать способ сделать это?

+0

Кэш? Изменен ли ваш файл? Если нет, кеш - путь. –

ответ

1

Separate your concerns - BACENGQueryXMLbyVTD загружает данные и выполняет запрос.

Сначала загрузите файл в byte[] за пределы своей петли, а затем передайте его BACENGQueryXMLbyVTD. Вы также можете передать query в качестве аргумента методу query.

Вы получите BACENGQueryXMLbyVTD, который выглядит так (с отказом от ответственности, что я не знаком с VTD-XML, поэтому создание объектов из этого API может работать не так):

public class BACENGQueryXMLbyVTD 
{ 
    private byte[] doc; 


    public BACENGQueryXMLbyVTD(byte[] doc) 
    { 
    this.doc = doc; 
    } 

    public List<String> query(String query) throws IOException, VTDException 
    { 
    VTDGen generator = new VTDGen(); 
    generator.setDoc(doc); 
    generator.parse(false); 

    VTDNav navigator = generator.getNav(); 

    AutoPilot autoPilot = new AutoPilot(navigator); 
    autoPilot.selectXPath(query); 

    List<String> nodeInterfaces = new ArrayList<String>(); 

    int i; 
    while ((i = autoPilot.evalXPath()) != -1) 
    { 
     navigator.push(); 
     nodeInterfaces.add(navigator.toString(i + 1)); 
    } 

    return nodeInterfaces; 
    } 
} 

что вы можете назвать как:

byte[] xmlContent = ... //load the xml from anywhere you like, not just a file as previously. 

BACENGQueryXMLbyVTD getNodesInterfaces = new BACENGQueryXMLbyVTD(xmlContent); 

for (String nodeName : nodeNames) 
{ 
    String query = "/import_data/group/node[@name='" + nodeName + "']/interface/@network_value"; 
    nodeInterfaces = getNodesInterfaces.query(query); 
    ... 
} 

вы также можете переключиться на стандартных Java API, XPATH - они намного чище и лучше документированы, чем VTD-XML.

+0

кажется, что он работает отлично, однако он работает только для первого узла цикла. Когда второй узел цикла обращается к методу запроса, что-то инициализируется инициализацией [VTDNav navigator = generator.getNav();]. Я попробовал google ошибку "at com.ximpleware.UniByteBuffer. (UniByteBuffer.java:32)", но я ничего не мог найти. Вы знаете, почему это происходит? спасибо заранее – Sallyerik

+0

Наконец, я сделал это, включая вызов новых объектов 'BACENGQueryXMLbyVTD' внутри цикла. Затем для каждого узла создается новый объект, который есть в файле. Еще раз спасибо – Sallyerik

+0

Я бы предположил, что 'generator' должен быть создан в методе' query'. Когда вы можете создать 'BACENGQueryXMLbyVTD' вне цикла - просто выглядит немного чище в коде imho. Я изменил код примера соответственно –

 Смежные вопросы

  • Нет связанных вопросов^_^