3

編集: getResourceAsStream() 対 FileInputStream

私が見つけた最良の説明です。個人的には、InputStream のさまざまなサブクラスをすべて試した後、FileInputstream() によって返される InputStream の実装と getResourceAsStream() によって返される実装が微妙に異なると感じています (javax.xml.parsers との非互換性を引き起こします)。

誰かがたまたま答えを持っている場合に備えて、これをしばらく開いたままにしますが、完了しました。すべてのアドバイス、提案、ヘルプに感謝します。時間も過ぎて次へ。


XML ini ファイルから初期化データを収集するサーブレットがあり、このようにサーブレット セッション コンテキストから InputStream として開きます。

   HttpSession session = request.getSession(true);
   ServletContext ctx=session.getServletContext();
   InputStream myini = ctx.getResourceAsStream("/WEB-INF/myini.xml");

それはうまくいきますが、後で JUnit テストを作成し、setup 関数で、この同じ ini にアクセスする必要があります。テスト環境にサーブレット コンテキストがないため、次を使用して InputStream を作成しようとしています。

InputStream testing = new FileInputStream(String pathToFile);

そしてまた

InputStream testing = new FileInputStream(File fileObj); 

XML パーサーからスローされた例外 (以下)

初期化ファイルの InputStream を取得できず、File を使用せざるを得ないことがわかりました。

セキュリティ上の制限がある場合に備えて、javadoc を確認し、ファイルの場所を移動しました。最終的に、ini を必要とするクラスにデュアル コンストラクターを追加し、File と InputStream の両方を受け入れて、単体テスト (File ref が必要な場合) とランタイム (InputStream がサーブレット セッション コンテキストから返される場合) に対応しました ...

しかし、私は当惑している/かなりイライラしているので、尋ねなければなりません

「File」を使用してファイルオブジェクトを返すことができるのはなぜですか。これは、javax.xml.parsers によって正常に解析されます (以下の関数を参照)。

File myini = new File("C:\\apache-tomcat-7.0.30\\myini\\myini.xml");

しかし、「InputStream」を使用してこれと同じことはできませんか?

InputStream myini = new FileInputStream("C:\\apache-tomcat-7.0.30\\myini\\myini.xml");

まったく同じ文字列パスを使用する (つまり、ファイルが存在する)

それぞれがどちらかに渡されます

public xmlNode parse(InputStream is) throws xmlException {
        try {
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            document = dBuilder.parse(is);
            document.getDocumentElement().normalize();

            xmlNode node = new xmlNode(document.getDocumentElement());
            return node;
        } catch (ParserConfigurationException e) {
            throw new xmlException("Error in configuration of XML parser", e);
        } catch (SAXException e) {
            throw new xmlException("Error in parsing XML document", e);
        } catch (IOException e) {
            throw new xmlException("Error in reading InputStream", e);
        }
    }

または

public xmlNode parse(File file) throws xmlException {
        try {
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            document = dBuilder.parse(file);
            document.getDocumentElement().normalize();

            xmlNode node = new xmlNode(document.getDocumentElement());
            return node;
        } catch (ParserConfigurationException e) {
            throw new xmlException("Error in configuration of XML parser", e);
        } catch (SAXException e) {
            throw new xmlException("Error in parsing XML document", e);
        } catch (IOException e) {
            throw new xmlException("Error in opening file", e);
        }
    }

この例外は、InputStream メソッドが呼び出された場合にのみスローされます (上記の適切な初期化の後)。

xml.utils.xmlException: Error in reading InputStream
    at xml.utils.xmlDocument.parse(xmlDocument.java:40)
    at com.jcando.util.XMLini.<init>(XMLini.java:49)

パスを InputStream の文字列として定義する別の方法はありますか? 私が知らないセキュリティブロックはありますか?

誰かが私が欠けているもの、または私が切り株のように厚いところを説明できるなら、私はそれを感謝します.

4

3 に答える 3

2

いつでも書くことができますFile f = new File("anyName"):ファイルが存在しなくても例外をスローすることはありません。

それでも、ドキュメントでわかるように、ファイルが存在しない場合、書き込みは例外InputStream myini = new FileInputStream("anyName")をスローします。FileNotFoundException

于 2013-07-17T16:13:14.500 に答える
1

文字エンコーディング エラー、またはドキュメント内の相対 URL の解決に関連するエラーが発生している可能性があります (例外が発生するかどうかはわかりませんが)。

次のようなことを試してみたいと思うかもしれません:

InputSource source = new InputSource(is);
source.setEncoding(... your character encoding ...);
source.setSystemId(systemId);
dBuilder.parse(inputSource);

としてsystemId決定されfile.toURI().toASCIIString()ます。

于 2013-07-17T19:18:11.217 に答える
0

getResourceAsStream() と FileInputStream

私が見つけた最良の説明です。個人的には、InputStream のさまざまなサブクラスをすべて試した後、FileInputstream() によって返される InputStream の実装と getResourceAsStream() によって返される実装が微妙に異なると感じています (javax.xml.parsers との非互換性を引き起こします)。

于 2013-07-22T08:15:23.607 に答える