0

ファイルの名前を Accumulo に書き込もうとしています。accumulo-core-1.43 を使用しています。

何らかの理由で、特定のファイルが名前の末尾に \x00 文字を付けて Accumulo に書き込まれるようです。アップロードは Java サーブレットを介して行われます (jquery ファイル アップロード プラグインを使用)。サーブレットで System.out.println を使用してファイルの名前を確認すると、正常に見えます。

org.apache.commons.lang.StringEscapeUtils.unescapeJava(...);

accumulo への実際の書き込みは次のようになります。

Mutation mut = new Mutation(new Text(checkSum)); 
Value val = new Value(new Text(filename).getBytes());
long timestamp = System.currentTimeMillis();
mut.put(new Text(colFam), new Text(EMPTY_BYTES), timestamp, val);

しかし、異常は何も表示されませんでした (おそらく \x00 はエスケープされていません)? しかし、accumulo でテーブルをスキャンすると、ファイル名に 1 つ以上の \x00 が含まれます。

これが引き起こすと思われる問題は、ファイルのリスト (表示される場所) を取得するときに XML 内でその文字列を返し、それをブラウザーに戻すことです。XML 内の情報をレンダリングすることになっている XSL は、もはやこれらの余分な文字がある場合に機能します(理由もわかりません)。

Chrome では、これらの呼び出しに対する応答として、ファイル名の後に 3 つの赤い点があることがわかります。その上にカーソルを合わせると、\u0 がポップアップします (これは 0/null の別の表現だと思いますか?)。

とにかく、なぜこれが起こるのか、または少なくとも、Java でファイルを返す前に \x00 文字を除外する方法を理解しようとしています。何か案は?

4

1 に答える 1

2

Hadoop Text クラスを間違って使用している可能性があります。これは Accumulo のエラーではありません。具体的には、上記の例で間違いを犯します。

Value val = new Value(new Text(filename).getBytes());

クラスが提供する長さを遵守する必要があります。Text詳細については、Text javadocを参照してください。Hadoop-2.2.0 を使用している場合は、提供されているcopyBytesメソッドを で使用できますText。このメソッドがまだ存在しない古いバージョンの Hadoop を使用している場合は、ByteBufferクラスまたはSystem.arraycopyメソッドのようなものを使用して、適切な制限が適用された byte[] のコピーを取得できます。

于 2014-01-18T23:17:54.317 に答える