14

ストリームからシリアル化されたオブジェクトを取り込むかなり標準的なコードがあります。これは基本的に次のようになります。

  Object getObjectFromStream(InputStream is){
    ObjectInputStream ois = new ObjectInputStream(is);
    ois.readObject();を返します。
  }

次に、リソースフォルダーにファイルがあるので、開発マシンでは、ファイルまたはJarResourceとして参照できます。

  InputStream is = new FileInputStream( "/ home /.../ src / main / resources / serializedObjects / testObject");
  InputStream is = this.getClass()。getResourceAsStream( "/ serializedObjects / testObject");

私の頭の中では、どちらもまったく同じことをする必要があります。ただし、どちらも有効な(null以外の)ストリームに解決されますが、FileInputStreamはgetObjectFromStream(InputStream)メソッドからオブジェクトを正しく返しますが、getResourceAsStreamバージョンは次の例外をスローします。

  java.io.StreamCorruptedException:無効なストリームヘッダー:EFBFBDEF
    java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:800)で
    java.io.ObjectInputStream。(ObjectInputStream.java:297)で

ほとんどの場合、これを修正する方法を知りたいのですが、2つのInputStreamの違いを理解していただければ幸いです...

4

5 に答える 5

18

EFBFBDUnicode置換文字U+FFFDのUTF-8表現です。したがって、ファイルが何らかのエンコーディング変換プロセスを通過したように見えます。

Mavenは、特にそのリソースフィルタリング機能が疑われる可能性があります。

于 2011-03-24T15:59:50.377 に答える
7

あなたの場合、あなたのファイルをいじっていたのはMavenでしたが、私は別の理由で同じものを見つけたので、これがGoogleでの唯一の有用な検索結果であるため、ここに文書化します。

シリアル化されたオブジェクトを単体テスト用のデータセットとして保存し、バージョン管理に保存していました。これが良い考えであったかどうかは議論の余地がありますが、また別の機会です。

次で始まるファイル:

AC ED 00 05 ...

それらをGitに保存すると、次のようになります。

EF BF BD EF BF BD 00 05 ...

これにより、エラーが発生します。

java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:782)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:279)

Gitは、これらの開始バイトだけでなく、ファイル全体の多くのバイトを変更します。WindowsスタイルとUnixスタイルの行末を変換しようとしています。ファイルにテキストが含まれているかどうかを識別するために使用されているヒューリスティックが失敗しています。

.gitattributes解決策は、この処理から除外するいくつかのファイルを指定したファイルを追加することでした。

*.bytes -crlf

.git/configまた、ファイルに次のものがあることを確認しました。

[core]
    autocrlf = false

これらの変更に伴い、インデックスを削除して強制的にリセットしました。

rm .git/index
git reset      # force rescan of the index
git status     # any files listed here will experience changes
git add -u
git commit -m "Line ending normalisation changes."

それが誰かを助けることを願っています。私はGitの第一人者ではないので、これらの手順のいくつかは必要ないかもしれませんが、それらは私のために働きました。

于 2012-05-21T14:00:17.043 に答える
6

これは私のために働いた。

        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>2.5</version>
          <configuration>
            <encoding>UTF-8</encoding>
            <nonFilteredFileExtensions>
              <nonFilteredFileExtension>xls</nonFilteredFileExtension>
              <nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
              <nonFilteredFileExtension>jrxml</nonFilteredFileExtension>
              <nonFilteredFileExtension>jasper</nonFilteredFileExtension>
            </nonFilteredFileExtensions>
          </configuration>
        </plugin>
于 2013-11-27T17:27:35.313 に答える
1

1つの問題は、Mavenがリソースフォルダー内のすべてをフィルター処理しようとすることです。別のフォルダーを作成し、それをフィルター処理しないようにMavenに指示します。

<resources>
   <resource>
       <directory>${basedir}/bin</directory>
       <filtering>false</filtering>
       <includes>
           <include>**/*</include>
       </includes>
   </resource>
</resources>
于 2013-05-08T18:25:27.873 に答える
0

まったく違いはありません。getResourceAsStream()に使用しているパスは、他のファイルを検索している必要があります。serializedObjects / testObjectとして保存されている他のファイルを検索し、見つからないかどうかを確認します。FileInputStreamは現在のディレクトリを基準にしており、getResourceAsStream()はクラスパスを基準としていることに注意してください。

于 2011-03-24T15:56:52.960 に答える