問題タブ [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 - android/java: ObjectInputStream ではなく別のものを使用してオブジェクトをロードする
アプリの開始時にメモリにロードする必要があるいくつかのファイルに格納された一連のオブジェクトがあります。これが私のやり方です:
HashMap<Integer, int[]>
問題は、サイズが 500k を超えるobject( ) をロードしようとすると、携帯電話で永遠に時間がかかることです。それが ObjectInputStream の問題であるかどうかはわかりません。もしそうなら、ファイルからオブジェクトを保存および取得するための他のより高速な方法はありますか? 速いほど良いです、どうもありがとう。
java - Exception.getCause() が例外のソースを見つけようとすると null を返す
なぜSystem.out.println(e.getCause());
与えるのnull
ですか?そして、このように HashSet コレクション全体を保存できますか?
printStackTrace()
の代わりに使用getCause()
コレクションの最初のオブジェクトにスナップされ、コレクションが実装されSerializable
、すべてのオブジェクトも実装されSerializable
、スレッドが宣言された一時的な場所を持っていることを除いて、まだ問題は見られません
java - AndroidアプリでreadObjectを実行するとEOFExceptionが発生する
シリアル化を使用して、Androidアプリにデータを保存しています。ユーザーがファイルを開くことができないと報告するまで、すべてがうまく機能します。
彼が送ってくれたファイルを調べたところ、readObject()のときのEOFExceptionが問題であることがわかりました。
.serファイルをvimで開きましたが、空ではありません。正常に開くことができる他のファイルと同じように正常に見えます。
ユーザーが.serファイルを保存しても、驚くことはありませんでした。
私の質問は次のとおり
です。1。そもそもシリアル化を使用するのは間違った決定ですか?
2.私のコードはほとんどの場合正常に機能しますが、最終的にこの問題を引き起こす何かを見逃した可能性があります。
3.ユーザーは、ファイルが彼にとって非常に重要であると言ったので、このファイルを開くための回避策を本当に見つけたいと思います。
ファイルの読み取り方法のコードは次のとおりです。
これが、シリアライズ可能ファイルを保存するために使用するコードです。
ブロック定義のコードスニペットは次のとおりです。
java - (java) オブジェクトの間違ったバージョンをデシリアライズする ObjectInputStream
私は Java の本からネットワーキングを学んでいるので、ちょっと初心者です。この問題は、本やオンラインで見つけることができなかったので、インターネットに問い合わせることにしました。
この本には、ObjectOutputStream と ObjectInputStream を使用して、オブジェクトを異なるコンソールに送受信するように書かれています。
これで、送信したオブジェクトを正常に受信できますが、1 回だけです。ランダムな文字列、整数、名前のないインスタンスなど、さまざまなオブジェクトを送信すると、コンソールにはすべて正しいフィールドが表示されます。しかし、オブジェクトのインスタンスを送信し、インスタンスのフィールドの 1 つの値を変更してオブジェクトを再送信すると、入力ストリームは元のインスタンスの値をロードします。
たとえば、public int "var" が 1 のクラスのインスタンスがあるとします。このクラスのインスタンスを送信すると、クライアントはそれを受信し、var = 1 と正しく報告します。 var を (同じインスタンスで) 2 に変更して再送信すると、クライアントは read() メソッドの呼び出しを終了します (したがって、新しいオブジェクトを受信したに違いありません!) が、var が 1 であると報告されます。インスタンスをまだ受け取っていない別のクライアントは、var を 2 として正しく報告し、var を変更しても 2 として報告し続けます。
クライアントがインスタンスの正しいバージョンを以前に受信していない場合に読み取るという事実は、オブジェクトが出力ストリームを介して適切に送信されていることを意味する必要があります。何らかの理由で入力ストリームが機能していません。同じオブジェクトであることを認識しているように見えるため、チェックせずに同じ値を持っていると想定します。なぜこれが起こり、どうすれば修正できますか?
ばかげたことを聞いていたら申し訳ありませんが、この本ではシリアライゼーションとソケットがどのように機能するかは説明されておらず、それらの使用方法のみが説明されているため、それらの使用方法について根本的に混乱する可能性があります。ありがとうございました!
問題をテストするために私が書いた簡単なコード:
サーバー: (更新されたオブジェクトを送信し続けるためのタイマー アクションがあります)
クライアント
これらのプログラムを実行すると、サーバー クラスの出力は 1、2、3、4... と無限に増加しますが、クライアントの出力は 1、1、1、1、1、1、1 などになります。
これを読んでいただきありがとうございます。私がばかげているだけなら申し訳ありませんが、私はこのようなことに慣れていません。
EDIT:申し訳ありませんが、read()はタイプミスでした(フォーマットを正しく取得できなかったため、手動でコードを入力しました)、input.readObject()を意味しました
java - ObjectInputStream の働き
ファイルに複数のオブジェクトが保存されています。これは ObjectInputStream に関するものです。以下のコードがある場合:
私の質問は: 2 番目のオブジェクト ストリーム (obj2) から呼び出された readObject は、ファイル内の 1 番目または 2 番目のオブジェクトになりますか?
java - 複数のクライアントを持つ Java SocketServer - StreamCorruptException
アプリケーション
ObjectStream クラスを使用してソケットを介してオブジェクトを送信することで通信するクライアント/サーバー アプリケーションを Java で作成しています。アプリケーションの各ノードは、おおよそ次のようになります。
ここで、server
変数はこのノードがリッスンするソケットであり、client
変数は他のノードがリッスンし、このノードがオブジェクトを送信するソケットです。
クライアント ソケットの 1 つにオブジェクトを書き込むために使用するコードは、次のようになります。
接続を処理し、ノードのサーバー ソケットからオブジェクトを読み取るために使用するコードは、次のようになります。
問題
ここのソケットに何か問題があると思います。すべてのサーバーが単一のクライアントにのみ接続されている場合、すべてが正常に機能します。ただし、複数のクライアントが同じサーバーと通信している場合、事態は悪化し、ObjectInputStream から StreamCorruptedException が発生し、その他の奇妙な動作 (UpdateRequest メッセージのインスタンスを挿入し、Integer(0) のインスタンスといくつかの例外を取得する) が発生します。例えば。)
私の直感では、2 つのオブジェクト/バイト ストリームが何らかの形で混ざり合っており、オブジェクトを逆シリアル化しようとすると奇妙な結果が生じることがわかります。私の質問は、なぜこれが起こっているのか、何が間違っているのか、どうすれば修正できるのでしょうか?
java - JavaObjectInputStreamが2番目のクライアントインスタンスでハングする
解決策が見つかりました(7時間前に自分の質問に答えることができないため、これを閉じて回答したと考えてください)。不要なSocketインスタンスを残していたため、clienアプリがハングしました。ご迷惑をおかけして申し訳ありません。問題を探して走り回るのを手伝ってくれてありがとう=)愛してるよ!
私はこの「問題」の解決策を見つけようとしています。銀行の複数の支店間の銀行振替をシミュレートする必要がある銀行シミュレーションアプリケーションがあります。私は現在、クライアントのコネクタオブジェクトによってキャッチされたさまざまなイベントオブジェクトをディスパッチするイベントバスを使用しています。クライアントが受信したイベントをリッスンすると、コマンドオブジェクトが呼び出され、更新する必要があるものは何でも更新されます(全体像を把握できるようにするため)。
なんらかの理由で理解できません。最初のクライアントインスタンスは正常に開き、期待どおりに動作しますが、最初のインスタンスの後に開かれたクライアントインスタンスは、次の行でハングします(変数は初期化される前に宣言されます)。
例外はスローされず、何もありません... 2番目、3番目、...起動されたインスタンスは、これらの非常に単純な行を通過することはありません。ご存知のとおり、上記のコードは、クライアントのmain関数によってインスタンス化されたEventBusConnector(...)オブジェクトで呼び出されます。前述のように、コマンドオブジェクトを使用するReadEventFromStreamクラスは次のとおりです。
}
だから、うーん...ええ...私はこれに何時間も頭をぶつけてきました、そして私はこれに夢中になっているので本当に助けが必要です。さらにコードが必要な場合は、貼り付けます。ありがとう=)
java - EOF例外を使用してファイルの終わりを検出するのは良い習慣ですか?
ObjectInputStreamから読み取っていますが、オブジェクトの数が事前にわかりません。したがって、EOF例外catchブロックを使用して、ファイルのENDに到達したことを検出し、ファイルを閉じます。
それは良い/安全なプログラミングの練習ですか?
それが良いアプローチではない場合、それはいくつかのより良い方法で行うことができますか?
java - Javaストリーム関数を使用してデータがストリーム内にあるかどうかを確認するためのより良いソリューションはありますか?
何百ものソケット通信を読み取る必要があるアプリケーションがあります。
これらのソケットにサービスを提供するために、スレッド数に上限のあるThreadPoolを使用しています。これにより、ソケットに着信メッセージがない場合、すべてのスレッドがブロックされます。
私は現在、永続的なブロッキングを回避するために100msのsoTimeoutを使用しています。入力の受信を開始すると同時にタイムアウトになる可能性があるため、このアプローチは好きではありません。
とにかくこれに近づくために他にありますか?
ObjectInputStream.isAvailable()でチェックしようとしましたが、ストリームにデータがあるかどうかに関係なく、常に0が返されます。
ストリームにデータがあるかどうかを確認する他の方法が見つかりません。これは理想的です。データがあるかどうかを確認でき、ない場合は次のストリームに進むことができます。
java - Java - ObjectInputStream でソケットをリッスンする
わかりましたので、サーバーが接続を受け入れるたびに「クライアント」と呼ばれるスレッドクラスがあり、新しいクライアントが作成されます..runメソッドはクライアントからのメッセージをリッスンし、ObjectInputStreamを使用しています..
私が抱えている問題は、ループするたびに新しい ObjectInputStream を作成する必要があるのはなぜですか...そして、ループの最後で入力ストリームを閉じて、別のメッセージのために再びループすると、エラーが発生します...誰か助けてください