【问题标题】:FileInputStream.read throws java.io.IOException: Result too largeFileInputStream.read 抛出 java.io.IOException:结果太大
【发布时间】:2012-04-01 19:10:10
【问题描述】:

我有一个临时文件

File myTmpFile = File.createTempFile( prefix, suffix );

表示通过

导出的xml
Preferences.exportSubtree(OutputStream);

现在我想导入这个文件:

Preferences.importPreferences( new FileInputStream( myTmpFile ));

但是 Stream 抛出一个带有 Message("Result too large") 的 IOException。
这是什么意思?我该如何解决这个问题?

java.io.IOException: Result too large
at java.io.FileInputStream.read(Native Method)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager$RewindableInputStream.read(XMLEntityManager.java:2932)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:704)
at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:186)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:772)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:235)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284)
at java.util.prefs.XmlSupport.loadPrefsDoc(XmlSupport.java:233)
at java.util.prefs.XmlSupport.importPreferences(XmlSupport.java:182)
at java.util.prefs.Preferences.importPreferences(Preferences.java:1236)
at MyPreferences.importPrefs(MyPreferences.java:322)    

public static void importPrefs(File file){
    FileInputStream is = null;
    try {
        is = new FileInputStream(file);
        java.util.prefs.Preferences.importPreferences( is );
    } catch( FileNotFoundException e ) {
    } catch( IOException e ) {
        e.printStackTrace();
    } catch( InvalidPreferencesFormatException e ) {
    } finally {
        if (is != null) {
            try {
                is.close();
            } catch( IOException e ) {
            }
        }
    }
}

【问题讨论】:

  • 您能发布完整的堆栈跟踪吗?还有importPreferences() 的代码?我猜问题出在importPreferences() 方法上。
  • 本地方法的 IOException 中没有堆栈跟踪。第2932行的RewindableInputStream通过访问抛出异常。
  • importPreferences() 也是本机方法吗?如果没有发布代码。问题在于InputStreamsimportPreferences() 方法中的使用方式
  • 不,异常来自本机方法,FileInputStream.read()importPreferences() 来自java.util.prefs.Preferences
  • IOException catch 块中写一个打印语句,以确保! Preferences.importPreferences() 的 javadoc 说 Throws: IOException - if reading from the specified input stream results in an IOException.

标签: java xml inputstream ioexception


【解决方案1】:

所以我自己解析。使用org.w3c.dom.ls.DOMImplementationLS
但我需要从java.util.prefs.XmlSupport 复制EntityResolver,java 在java.util.prefs.Preferences 中使用该EntityResolver。它有效。

InputStream parsingStream = new FileInputStream(file)
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

builder.setEntityResolver(new Resolver());
Document doc = builder.parse( parsingStream );

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();    
DOMImplementationLS domImplementationLS = (DOMImplementationLS)doc.getImplementation().getFeature( "LS", "3.0" );
LSOutput lsOutput = domImplementationLS.createLSOutput();
lsOutput.setByteStream( outputStream );
LSSerializer lsSerializer = domImplementationLS.createLSSerializer();
lsSerializer.write( doc, lsOutput );
byte[] byteArray = outputStream.toByteArray();


ByteArrayInputStream importStream = new ByteArrayInputStream( byteArray );
Preferences.importPreferences( importStream );

/**
 * For loading an XML document from specified input stream, which must have the requisite DTD URI.
 * @see java.util.prefs.XmlSupport.Resolver
 */
private static class Resolver implements EntityResolver {
    @Override
    public InputSource resolveEntity(String pid, String sid)
        throws SAXException {
        if (sid.equals(PREFS_DTD_URI)) {
            InputSource is;
            is = new InputSource(new StringReader(PREFS_DTD));
            is.setSystemId(PREFS_DTD_URI);
            return is;
        }
        throw new SAXException("Invalid system identifier: " + sid);
    }
}

【讨论】:

    【解决方案2】:

    在尝试读取之前确保 InputStream 尚未关闭。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-10
      • 2023-03-03
      • 2012-03-19
      • 2016-06-29
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多