問題タブ [objectinputstream]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - ストリームの入出力用のJava初期化変数
以下のコードに問題があります。in/outの変数を初期化する方法が明確ではありません。
このオブジェクトの作成中に、コンストラクター内でプログラムがハングします。の行にぶら下がっていますthis.inObjects = new ObjectIn.........
。これらの入出力オブジェクトを一度だけ作成して、メソッドで呼び出したり、読み取り/書き込みなどを適用したりするだけで、入出力、文字列、オブジェクトの読み取りと書き込みを行いたいと思います。
どこが間違っているのですか?データを受信しないことでハングする可能性はありますか?彼らはすべきではありませんよね?
java - Java Serializable クラスのアップグレード
シリアル化と serialVersionUID の使用に関するさまざまなブログを読みました。それらのほとんどは、シリアライズ可能なクラスの状態を維持するためにそれを使用することに言及しています。
私が持っているシナリオは次のとおりです。
古いserialVersionUIDと新しいserialVersionUIDを知っています。
古いserialVersionUIDを持つオブジェクトを読み込むときに、データを操作して新しいバージョンに適合させたいのですが、読み込んでいるオブジェクトが古いタイプの場合にのみ、これをやりたいと思います。
これは、非常に単純明快なことのように思えます。
オブジェクトが読み込まれるときに serialVersionUID を取得する方法はありますか?
シリアル化されたクラスの readObject メソッドが呼び出される前に InvalidClassException がスローされるため、そこにアクセスできません。
私が見つけた唯一のヒントは、ObjectInputStream をオーバーライドして readClassDescriptor() を利用できるようにすることですが、これはよくある問題に対する重い解決策のようです!
すべての助けに感謝します!
M
java - ObjectOutputStreamを使用して特定のデータを削除します
私は現在、人に関するデータを.datファイルに保存するプログラムを作成しようとしています。プログラムは、エントリの追加、エントリの表示、およびエントリの削除ができる必要があります(これらはすべて同じタイプのオブジェクトです)。
私が遭遇している問題は、エントリの削除にあります。ランダムアクセスファイルを使用しないように特に指示されましたが、データの特定の場所を削除できる必要があります。ポインタの種類を制御する方法がないため、削除するエントリを定義する方法がわかりません。エントリの場所を見つける方法はありますが、オブジェクトの場所にあるデータを削除する方法がありません。
ObjectOutputStreamがデータを削除する場所を定義する方法はありますか?特定のエントリを削除するにはどうすればよいですか?
java - ObjectOutputStream/ObjectInputStream の進行状況の取得
私は最近、ObjectOutputStream と ObjectInputStream を使用して、サーバーとクライアント間の単純な Java ソケット接続を介してオブジェクトを送信する方法を見つけました。画像など、サイズが大きい可能性があるオブジェクトを転送したいのですが、送受信されたデータの量の進行状況を追跡するスレッドを配置することは可能ですか? この質問への答えがあまり直接的でない場合、誰かが私が似たようなことをする方法を説明できますか? 前もって感謝します!
java - ObjectInputStreamはFileInputStreamに満足していますが、getResourceAsStreamには満足していません
ストリームからシリアル化されたオブジェクトを取り込むかなり標準的なコードがあります。これは基本的に次のようになります。
次に、リソースフォルダーにファイルがあるので、開発マシンでは、ファイルまたはJarResourceとして参照できます。
私の頭の中では、どちらもまったく同じことをする必要があります。ただし、どちらも有効な(null以外の)ストリームに解決されますが、FileInputStreamはgetObjectFromStream(InputStream)メソッドからオブジェクトを正しく返しますが、getResourceAsStreamバージョンは次の例外をスローします。
ほとんどの場合、これを修正する方法を知りたいのですが、2つのInputStreamの違いを理解していただければ幸いです...
java - Android プラットフォームで Bluetooth ソケットの InputStream を使用して ObjectInputStream を作成できない
Android 携帯用のマルチプレイヤー ゲームを作成しています。通信はBluetooth経由です。入力/出力ストリームを使用して、ある電話から別の電話にバイトを送信することができました。オブジェクトを転送できるようにする必要があるため、オブジェクトストリームが必要です。しかし、ストリームを使用して Objectstream を作成しようとすると、プログラムが命令でハングします。
//命令 new ObjectInputStream(mmInStream) は決して実行を終了しません。私はそれをキャッチするので、エラーをスローしていないようです。この命令でハングするだけです。この行より下のコードは実行されません。
私は何を間違っていますか?
java - ObjectInputStream を使用して異なる変数を読み取る Java
String と自分で作成したオブジェクトの 2 つの異なる入力を読み取る必要がある ObjectInputStream があります。入力を常に待機するスレッドがあり、入力に応じて文字列またはオブジェクトが結果を処理します。入力が 2 つを区別できるようにする方法が必要です。
どんな助けでも素晴らしいでしょう。
ありがとう
java - 多くの接続を受け入れなければならないときに、クライアント/サーバー タイプのアプリケーションで Java ソケットに問題があります。
まず、お読みいただきありがとうございます。ユーザーとしてスタックオーバーフローに参加するのはこれが初めてですが、常にそれを読んで有用な解決策を見つけました:D。ところで、説明が不十分で申し訳ありませんが、私の英語はあまり上手ではありません。
私のソケットベースのプログラムは奇妙な動作をしており、いくつかのパフォーマンスの問題があります。クライアントとサーバーは、シリアル化されたオブジェクトをオブジェクトの入力ストリームと出力ストリームにマルチスレッドで読み書きすることによって、相互に通信します。コードの基本をお見せしましょう。読みやすいように簡略化しました。たとえば、完全な例外処理は意図的に省略されています。サーバーは次のように機能します。
サーバ:
LjServerThread クラス、クライアントごとに 1 つのインスタンスが作成されます。
そして、クライアントは次のようになります。
ご覧のとおり、サーバー側で受け入れられたクライアントを処理する LjServerThread クラスは、所要時間を測定します... 通常、75 ~ 120 ミリ秒かかります (x は IP です)。
- クライアント x は正常に終了しました。
- 実行時間: 82
- クライアント x は正常に終了しました。
- 実行時間: 80
- クライアント x は正常に終了しました。
- 実行時間: 112
- クライアント x は正常に終了しました。
- 実行時間: 88
- クライアント x は正常に終了しました。
- 実行時間: 90
- クライアント x は正常に終了しました。
- 実行時間: 84
しかし、突然、予測可能なパターンはありません (少なくとも私にとっては):
- クライアント x は正常に終了しました。
- 実行時間: 15426
時には25秒に達する!時折、スレッドの小さなグループが少し遅くなることがありますが、それはあまり心配していません:
- クライアント x は正常に終了しました。
- 実行時間: 239
- クライアント x は正常に終了しました。
- 実行時間: 243
なぜこうなった?これはおそらく、サーバーとクライアントが同じ IP を持つ同じマシンにあるためでしょうか? (このテストを行うために、サーバーとクライアントを同じマシンで実行しますが、それらはインターネット経由で接続し、パブリック IP を使用します)。
これは私がこれをテストする方法です。main() で次のようにサーバーに要求します。
「Thread.sleep(100)」を使用せずにループで実行すると、接続リセットの例外が発生します (400 のうち 7 または 8 の接続が多かれ少なかれリセットされます)。 () が接続を受け入れると、serverSocket.accept() に再び到達するまでに非常に短い時間がかかります。その間、サーバーは接続を受け入れることができません。そのせいでしょうか。そうでない場合、なぜですか?サーバーにまったく同時に 400 の接続が到着することはめったにありませんが、発生する可能性があります。「Thread.sleep(100)」がないと、タイミングの問題も悪化します。
前もって感謝します!
更新しました:
なんてばかだ、私はローカルホストでそれをテストしました...そしてそれは何の問題も与えません! 「Thread.sleep(100)」の有無にかかわらず、問題なく動作します。どうして!したがって、ご覧のとおり、接続のリセットがスローされる理由についての私の理論は正しくありません。これは物事をさらに奇妙にします!誰かが私を助けてくれることを願っています...ありがとう!:)
更新 (2):
さまざまなオペレーティング システムで、まったく異なる動作が見られることを発見しました。私は通常、Linux で開発を行っており、説明した動作は、私の Ubuntu 10.10. Windows 7 では、接続間で 100 ミリ秒一時停止すると、すべて問題なく、すべてのスレッドが高速で点灯し、150 ミリ秒以上かかることはありません (低速接続の問題はありません!)。これは Linux で起こっていることではありません。ただし、「Thread.sleep(100)」を削除すると、一部の接続のみが接続リセット例外を取得するのではなく、すべてが失敗して例外がスローされます (Linux ではそれらの一部のみ、400 のうち 6 程度)。失敗していました)。
ふぅ!OS だけでなく、JVM 環境にも少し影響があることがわかりました。大したことではありませんが、注目に値します。私は Linux で OpenJDK を使用していましたが、現在、Oracle JDK では、接続間のスリープ時間を短縮すると、以前に失敗し始めることがわかります (50 ミリ秒で OpenJDK は正常に動作し、例外はスローされませんが、Oracle のものではかなり多くは 50ms のスリープ時間で動作しますが、100ms では正常に動作します)。
java - オブジェクトの入出力ストリームを使用してソケットを介して送信するオブジェクトのサイズは本当に重要ですか?
一連のオブジェクト書き込み後にストリームをフラッシュするよりも、 ObjectOutputStream#writeObjectを個別に呼び出した後にOutputStreamをフラッシュする方が効率的ですか?(例:オブジェクトを書き込んで4回フラッシュするか、4回書き込んでから1回だけフラッシュするか?)
ObjectOutputStreamは内部でどのように機能しますか?
java - Javaでオブジェクトにランダムにアクセスすることは可能ですか?
基本的に、文字列オブジェクトのファイルがあります。オブジェクトの格納にはJava ObjectOutputStreamを使用しました。オブジェクト(文字列)にランダムにアクセスすることは可能ですか?たとえば、11番目のオブジェクトにアクセスしたい場合、readObject()を11回使用してその場所にループすることなく、その場所にジャンプできます。また、ジャンプして戻りたい場合は、最初からループしなくても実行できます。ありがとう。
示唆されているように、skipBytes() メソッドを使用して何らかのランダムアクセスを実現できると思います。オブジェクトが固定サイズであることを保証することはできませんが、それらのオブジェクトの位置の配列をファイルに保持できるとしたら、その配列をインデックスとして使用し、skipBytes() をランダム アクセスに使用できます。とにかく、実際にオブジェクトを書いているときにオブジェクトのサイズを知ることができたので、どうにかして位置を記録できたのでしょうか?