如何修复java.io.IOException:Stream关闭

时间:2016-07-16 19:00:40

标签: java weka java-io ioexception

我正在测试这个课程

     /**
     * Class to classify irises based on petal and sepal measurements.
     *
     * @author      James Howard <jh@jameshoward.us>
     */
    package us.jameshoward.iristypes;

import java.io.InputStream;
import java.util.Dictionary;
import java.util.Enumeration;

import weka.classifiers.Classifier;
import weka.core.Attribute;
import weka.core.FastVector;
import weka.core.Instance;
import weka.core.Instances;
import weka.core.SerializationHelper;

public class Iris {
    private Classifier classModel;
    private Instances dataModel;
    private String classModelFile = "/Irises/etc/iris.model";

    /**
     *  Class constructor.
     */
    public Iris() throws Exception {
        InputStream classModelStream;

        //  Create a stream object for the model file embedded
        //  within the JAR file.
        classModelStream = getClass().getResourceAsStream(classModelFile);

        classModel = (Classifier)SerializationHelper.read(classModelStream) ;
    }

    /**
     *  Close the instance by setting both the model file string and
     *  the model object itself to null.  When the garbage collector
     *  runs, this should make clean up simpler.  However, the garbage
     *  collector is not called synchronously since that should be
     *  managed by the larger execution environment.
     */
    public void close() {
        classModel = null;
        classModelFile = null;
    }

    /**
     * Evaluate the model on the data provided by @param measures.
     * This returns a string with the species name.
     *
     * @param measures object with petal and sepal measurements
     * @return string with the species name
     * @throws Exception
     */
    public String classifySpecies(Dictionary<String, String> measures) throws Exception {
        @SuppressWarnings("rawtypes")
        FastVector dataClasses = new FastVector();
        FastVector dataAttribs = new FastVector();
        Attribute species;
        double values[] = new double[measures.size() + 1];
        int i = 0, maxIndex = 0;

        //  Assemble the potential species options.
        dataClasses.addElement("setosa");
        dataClasses.addElement("versicolor");
        dataClasses.addElement("virginica");
        species = new Attribute("species", dataClasses);

        //  Create the object to classify on.
        for (Enumeration<String> keys = measures.keys(); keys.hasMoreElements(); ) {
            String key = keys.nextElement();
            double val = Double.parseDouble(measures.get(key));         
            dataAttribs.addElement(new Attribute(key));
            values[i++] = val;
        }
        dataAttribs.addElement(species);
        dataModel = new Instances("classify", dataAttribs, 0);
        dataModel.setClass(species);
        dataModel.add(new Instance(1, values));
        dataModel.instance(0).setClassMissing();

        //  Find the class with the highest estimated likelihood

        double cl[] = classModel.distributionForInstance(dataModel.instance(0));
        for(i = 0; i < cl.length; i++)
            if(cl[i] > cl[maxIndex])
                maxIndex = i;

        return dataModel.classAttribute().value(maxIndex);
    }

}

开始使用

从另一个类初始化其实例时
Iris irisModel = new Iris();

我收到了以下错误

Exception in thread "main" java.io.IOException: Stream closed
    at java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:159)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
    at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2320)
    at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2333)
    at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2804)
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:802)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
    at weka.core.SerializationHelper.read(SerializationHelper.java:288)
    at us.jameshoward.iristypes.Iris.<init>(Iris.java:33)
    at us.jameshoward.iristypes.IrisDriver.main(IrisDriver.java:11)

我猜这个错误是特定于案例的,通过与其他帖子比较,我仍然无法找出它出错的地方。事实上,这个类是从IBMknowledge网站下载的,我猜想它是防错的。 有谁知道如何解决这个问题? 感谢

0 个答案:

没有答案