3

POSTリクエストをリッスンしてクライアントからXMLペイロードを取得し、最初にInputStreamとして保存するREST Webサービスがあります。つまり、getStream()を呼び出すことができるRepresentationオブジェクトに保存します。

InputStreamに保持されているXMLを利用したいのですが、それを永続化するのが賢明だと思い始めているので、データを何度も問い合わせることができます。一度読み取ると、オブジェクトはnullになります。そこで、InputStreamを文字列に変換することを考えました。javax.xml.parsersライブラリのDocumentBuilder.parse()は以下を渡すことしかできないため、これはお勧めできません。

  • InputStreams
  • ファイル
  • URL
  • SAX入力ソース

文字列ではありません。

XMLを解析することに関して、InputStreamsで実際に何をすべきですか?念頭に置いて、コードによって将来のプロセスでそのXMLを再問い合わせしたいと思います。

4

6 に答える 6

2

InputStreamがあり、それをXMLドキュメントとして使用したい場合は、単にそれを解析してDocumentオブジェクトを渡してみませんか?このオブジェクトを永続化する場合は、シリアライザーを使用してテキストとして書き戻します。

Tom Hawtinへのコメントで述べたように、XMLを扱う場合はエンコーディングが非常に重要です。あなたの特定の状況を見逃すかもしれない長い投稿をここに書くのではなく、ここ に私が書いた記事があります。

編集:実際、私の記事ではWebサービスについて具体的に説明していないので、ここで少し詳しく説明する必要があります。コンテンツエンコーディングを指定できる場所は、XMLプロローグまたはContent-Type応答ヘッダーの2つです。XML仕様によると、前者が使用したいものであり、パーサーが使用するものです。ほとんどの場合、それは問題ではありません。仕様を知らない人が設定したWebサービスは、通常、文字セットの仕様がないtext / xmlを使用します(これは正しくありませんが、害を及ぼすことはないでしょう)。正しく機能する場合は、utf-8エンコーディングでapplication/xmlを指定します。ただし、パーサーが処理できない奇妙なエンコーディングになってしまわないように、取得しているものを確認する必要があります。

于 2009-03-12T12:19:07.617 に答える
1

一般的に、永続性について話しているときは、それをディスクまたは他のメディアに書き込むことについて話している。そこにはパフォーマンスの低下があり、ディスク容量の問題について考える必要があります。これを、そのXMLを長期的に使用することの価値と比較検討する必要があります。

それをメモリに保持することについて話しているだけの場合(これはあなたが求めているもののように聞こえます)、バイト配列を割り当てて、すべてをバイト配列に読み込むことができます。ByteArrayInputStreamを使用して、そのストリームを読み取ったり、再読み取りしたりできます。

それによるコストは2倍です。まず、コピーをメモリに保持しており、それをスケーラビリティ要件と比較検討する必要があります。次に、XMLの解析にはいくらかコストがかかるため、可能であれば1回だけ解析し、結果をオブジェクトに保存することをお勧めします。

編集:

バイト配列を割り当てて読み取るために、多くの場合(常にではありませんが)、InputStreamのavailable()メソッドを使用して、割り当てる量を指定できます。InputStreamをDataInputStreamでラップして、readFully()を呼び出して、1回の呼び出しですべてをバイト配列に吸い込むことができるようにします。

もう一度編集します。

以下のSteenのコメントを読んでください。この場合、available()を使用するのは悪い考えです。

于 2009-03-12T12:10:29.477 に答える
1

ApacheCommonsIOライブラリを使用することをお勧めします。IOUtilsクラスには、InputStreamsをStringに、またはその逆に変換するための多くの便利なメソッドが含まれています。

于 2009-03-12T12:11:29.397 に答える
0

エンコーディングを維持するのにより適した(つまり、エンコーディングにとらわれない)いくつかの構造を調べる必要があると思います。低レベルの構造については、検討してbyte[]ください(ただし、メモリの割り当て解除には注意してください)。または、ニーズに合ったデータ型を設計してみてください。

(メソッドの1つを使用しInputStreamて)をに読み込み、そこからを抽出することができます。ByteArrayOutputStreamread()byte[]

于 2009-03-12T12:09:14.223 に答える
0

XMLを複数回使用したい場合は、InputStreamから1回解析して(これは大変な作業です)、返されたドキュメントを保持してみませんか?

于 2009-03-12T12:17:18.917 に答える
-2

java.io.StringReaderを使用できるようになりますInputSource

データをに保存してbyte[]から、で読み取ることをお勧めしByteArrayInputStreamます。特に大きい場合は、圧縮を検討することをお勧めします。これはiwthで読み取ることができGzipInputStream、多くの場合、でラップする必要がありますBufferedInputStream

于 2009-03-12T12:08:44.973 に答える