位置情報で子どもの居場所をお知らせ

このようなソースがあり

-------------------------------------------------
import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.BufferedInputStream;
import java.io.Serializable;
import java.io.ByteArrayInputStream;


public class TTT{

public static void main( String[] args ){

try{


FileInputStream fis = new FileInputStream( "C:\\aa\\ddd.txt" );
//FileInputStream fis = new FileInputStream( "C:\\aa\\aa.jpg" );
ObjectInputStream ois = new ObjectInputStream( fis );

}catch( Exception w ){
w.printStackTrace();
}

}


}
-------------------------------------------------


これをコンパイルをかけて実行すると
java.io.StreamCorruptedException: invalid stream header
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:737)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:253)
at TTT.main(TTT.java:24)

となってしまいます。

読み込むファイルをコメント部分の画像ファイルに
変えてみても同様です。

StreamCorruptedExceptionの内容はJAVAのAPIドキュメントでは読み込まれた制御情報が、内部整合検査に違反した場合にスローされると説明がありますがこれはどういう意味でしょうか?

また正しく実行させるにはどのようにすればいいのでしょうか?
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (7件)

こんばんは。


普通にバイナリデータを送りたいだけであれば、クライアント側はファイル読み込みにFileInputStream、ソケットへの出力にOutputStreamを、サーバ側はファイル書出しにFileOutputStream、ソケットからの入力にInputStreamを使うのが一番シンプルだと思います。
※下のサンプルを実行すると作業フォルダに、test.dataとserved_test.dataというファイルを作成します(既存の場合は上書き)
- - - - - - - - - - - - - - - - - - - -
[クライアント]
import java.io.*;
import java.net.*;

class TestClient {

public static void main(String[] args) {

if(!new File("test.data").exists()) {
TestClient.makeTestData();
}

try {
FileInputStream fis = new FileInputStream("test.data");
Socket s = new Socket("localhost", 10000);
OutputStream os = s.getOutputStream();
byte b = -1;
while((b = (byte)fis.read()) != -1) {
os.write(b);
c++;
}
os.close();
s.close();
fis.close();
}
catch(ConnectException ce) {
System.out.println("リモートアドレス/ポート上で待機しているプロセスがありません");
}
catch(Exception e) {
e.printStackTrace();
}

}

public static void makeTestData() {

byte[] testData = new byte[1024 * 8];

for(int i = 0; i < testData.length; i++) {
testData[i] = 0x01;
}

try {
FileOutputStream fos = new FileOutputStream("test.data");
fos.write(testData);
fos.flush();
fos.close();
}
catch(Exception e) {
e.printStackTrace();
}

}

}
- - - - - - - - - - - - - - - - - - - -
[サーバ]
import java.io.*;
import java.net.*;

class TestServer {

public static void main(String[] args) {

try {
FileOutputStream fos = new FileOutputStream("served_test.data");
ServerSocket ss = new ServerSocket(10000);
System.out.println("受付開始");
InputStream is = ss.accept().getInputStream();
byte b = -1;
while((b = (byte)is.read()) != -1) {
fos.write(b);
}
System.out.println("受付終了");
is.close();
ss.close();
fos.close();
}
catch(Exception e) {
e.printStackTrace();
}

}

}
- - - - - - - - - - - - - - - - - - - -
> ObjectOutputStream clientOut = new ObjectOutputStream(soket.getOutputStream());
> BufferedOutputStream clientBuf = new BufferedOutputStream(clientOut, 1024);
このコードだとclientOutはObjectOutputStreamのオブジェクトとしては使われていません。
ストリームへの書出しを担当しているのはBufferedOutputStreamのオブジェクトです。

No.3の方も書いているように、ObjectInputStream、ObjectOutputStreamは「直列化」(シリアライゼーション)データを扱うものです。
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java …

> クライアントからの切断もサーバー側で感知させる
クライアント側でファイル末尾まで正常に出力が完了したら、完了通知のコード(数値や文字列)を送る。完了通知のコードが届かない場合は、サーバ側でクライアントから切断されたと判断する。という方法が考えられます。

参考URL:http://www.hellohiro.com/socket.htm

この回答への補足

UKY様、koki_m様
大変ご丁寧な回答ありがとうございました。m(_ _)m
おかげさまで何とか無事に送受信ができました。
ですがもう少しお聞きしてよろしいでしょうか?

実はサーバー側の仕組みなのですが、下記(1)(2)のスレッドが用意されています。
----------------------------------------------------------------------------------
 (1)クライアントから接続を受けるスレッド(1ポート毎に用意)
    ⇒接続を受けた後、(2)のスレッドに処理を完全に渡す
     (socket.accept().getInputStream()によるInputStreamを渡す)
     (2)へ処理を渡した後、また別のクライアントからの接続待ちを行う。

 (2)クライアントからのデータ受信を行うスレッド(1クライアント毎に用意)
    ⇒(1)から引き継いだInputStreamにより、データの受信を行う。
     受信後は、データをByteデータに加工し、また別のスレッドに渡す。
     その後、再度同じクライアントからのデータ受信待ちを行う。
     (1度接続されてからは切断されるまで、ひたすらデータを受けつづける)
----------------------------------------------------------------------------------

ですので1回のデータ送信後にすぐSocketをCloseするということができません。
ひたすらSocketは開いたままなのですが、1回分の送信データのみを確実にByteデータにして
保持したいのです。そしてクライアントからの切断も判断させたいのです。

何度もご質問して申し訳ありませんが、何卒ご回答宜しくお願いいたします。

補足日時:2005/09/21 21:25
    • good
    • 0

>> UKYさん



間違いの指摘ありがとうございます。
完全に基本部分を忘れてました(笑)
intの255=(3バイト省略) 11111111はbyteでは-1ですよね。
おかげ様でこれからは間違えないように書けます。

for文で書いた方が変数宣言もできてスマートですね。
こちらも参考にさせて頂きます。
    • good
    • 0

>> koki_mさん



while((b = (byte)fis.read()) != -1) {
os.write(b);
}

これはまずいですよ。先に byte にキャストして比較すると読み込んだバイトデータとして 0xff が入っていたときにそこで処理が終わってしまいます。
必ず int のまま比較して、後で byte にキャストしないと。

for (int b; (b = fis.read()) != -1; ) {
os.write((byte) b);
}
    • good
    • 0

すいません。

No.4の訂正です。
[クライアント]の
while((b = (byte)fis.read()) != -1) {
os.write(b);
c++;
}

は、
while((b = (byte)fis.read()) != -1) {
os.write(b);
}
です。
    • good
    • 0

基本的には、バイナリデータを読み取るだけなら FileInputStream だけでできます。

というか、InputStream と名の付くものはすべてバイナリデータを読み取る機能を備えています。

問題は、読み取ったデータをどのように扱いたいかということです。

例えばテキストファイルを読み込む場合、単純にバイナリデータとして読み取っただけでは意味がなく、それを文字列に変換してやらなければいけません。そのためには InputStream に InputStreamReader を「かます」とか、読み取ったデータをデコーダに掛けるなどといったことをします。

あるいは JPEG 形式の画像ファイルを読み込む場合、読み込んだデータを画像処理プログラムに渡すなどといったことをするでしょう。

ObjectInputStream は、「直列化」という特殊な方法で作られたバイナリデータをオブジェクトに復元するために使います。つまり、そういう特殊な形式のデータしか読み込むことができません。

この回答への補足

みなさま色々アドバイス頂き、ありがとうございます。
今やろうとしている事は、Socket通信でクライアントからサーバーへバイナリデータ(約8K)を送信させようとしています。
送信する1回のバイナリデータのサイズは不確定で、多数のクライアントから1つのサーバーに大量のデータが送信されることが
予想されています。
そこで色々調べていたのですが、どうやら『JAVAのSocket通信で、1回の送信で送れる最大バイト数は1024byte』らしいとの事でした。
そのため、送受信ともに1024バイトずつ処理を実行させようと考えました。
ソースを以下に提示します。

/* ----------------------- クライアント側 ("Test.data"ファイルはObjectOutputStreamクラスを使用して作成しています)-----------------------*/
//バイナリデータファイルの読み込み
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("Test.data"));
ByteArrayOutputStream bOut = new ByteArrayOutputStream();

int i;
while((i = bis.read()) != -1){
bOut.write(i);
}
byte[] bData = bOut.toByteArray();

//出力ストリームを取得
ObjectOutputStream clientOut = new ObjectOutputStream(soket.getOutputStream());
BufferedOutputStream clientBuf = new BufferedOutputStream(clientOut, 1024);

//データ長を送信
int length = bData.length;
int offset = 0;
while(length > 1024){
clientBuf.write(bData, offset, 1024);
offset += 1024;
length2 -= 1024;
}
if (length > 0 ) {
clientBuf.write(bData, offset, length);
}
clientBuf.flush();
clientBuf.close();


/* ----------------------- サーバー側 --------------------------------------------------------------------------------------------------*/

//入力ストリームを取得
ObjectInputStream serverIn = new ObjectInputStream(socket.getInputStream());
BufferedInputStream serverBuf = new BufferedInputStream(serverIn);
ByteArrayOutputStream bOut = new ByteArrayOutputStream();

//データ長を受信
byte[] bufByte = new byte[1024];
int length = serverIn.readInt();
while (length > 1024) {
serverBuf.read(bufByte, 0, 1024);
bOut.write(bufByte, 0, 1024);
length -= 1024;
}
if (length > 0) {
serverBuf.read(bufByte, 0, length);
bOut.write(bufByte, 0, length);
}

byte[] bData = bOut.toByteArray();
String message = new String (bData);

if(message == null){
//クライアントからの切断!?
}


上記のようにしているのですが、サーバー側のObjectInputStreamでreadInt()メソッドをコールした際に
戻り値が負の整数となってしまいます。
また同時にクライアントからの切断もサーバー側で感知させるようにもしたいです。
この他の手法でもまったく構いませんので、何かよい解決方法をご教授頂きたいと思います。
よろしくお願いいたします。m(_ _)m

補足日時:2005/09/21 15:46
    • good
    • 0

こんばんは。


> 内部整合検査に違反した場合にスローされる
おそらく読込もうとしたファイルが、オブジェクトをバイナリで書き出したファイルではない。ということだと思います。

指定ファイル(C:\\aa\\ddd.txt)がObjectOutputStreamで書き出したバイナリデータであれば上記例外は出ないようです。
- - - - - - - - - - - - - - - - - - - - -
import java.io.*;

public class Test {

public static void main( String[] args ){

try{
String testString = "This is a test.";
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("C:\\aa\\ddd.txt"));
oos.writeObject(testString);
oos.close();

FileInputStream fis = new FileInputStream( "C:\\aa\\ddd.txt" );
//FileInputStream fis = new FileInputStream( "C:\\aa\\aa.jpg" );
ObjectInputStream ois = new ObjectInputStream( fis );

String returnString = (String)ois.readObject();
System.out.println(returnString);
ois.close();
fis.close();
}
catch(Exception w){
w.printStackTrace();
}

}

}
- - - - - - - - - - - - - - - - - - - -
> 正しく実行させるにはどのようにすればいいのでしょうか?
何が正しい実行なのかがちょっと分からないですが、ソースコードから2通り推測できます。
・書き出したオブジェクトを読み込みたい
 →上記のように書き出したオブジェクトファイルを指定してください。
(ファイル名は.txtのままですが、oos.writeObject(testString);でオブジェクトファイルとなります)
・テキストや画像を読み込みたいが、間違ってObjectInputStreamを使おうとしていた
 →テキストファイルはBufferedReader等、画像はDataInputStream等を使用します。
    • good
    • 0
この回答へのお礼

詳しい回答ありがとうございます。

バイナリデータを読み込むというのが目的でした。
でObjectInputStreamクラスを使用したのですがそもそも
使い方が間違っているのでしょうか?

お礼日時:2005/09/21 12:16

何だかとんちんかんなことをしているような……。



ObjectInputStream はどのような機能を持ったクラスでどのようにして使うかを知らずに、出任せでプログラムを書いていませんか?

とりあえず、このソースを読んだだけでは何をするためのプログラムを作ろうとしているのかよくわからないので、説明をお願いします。

この回答への補足

回答ありがとうございます

FileInputStreamクラスと
ObjectInputStreamクラスを使用して
バイナリファイルデータの読み込みをしたいと思っています。
読み込むデータのサイズは8Kで、Socketにてクライアントからデータの送信をさせようとしています。

補足日時:2005/09/20 20:44
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QSQLで違うテーブルの値を比較して値に差があるレコードを抽出したいので

SQLで違うテーブルの値を比較して値に差があるレコードを抽出したいのですがヒントをいただけないでしょうか。
下に例を作ってみました。(テキストに貼りなおしてもらうと見易くなると思います)
<Aテーブル>
A1A2A3A4A5
------- ------- ------- ------- ----------
XXXXXXX XX1ABC32009/05/08
WWCWWCW WW2CCB12008/03/21
DDDDDDD DD1JPN52007/08/08
GGGGGGG GX9SOX21977/01/04
FFFFFFF USJNPB32001/09/11


<Bテーブル>
B1B2B3B4B5
------- ------- ------- ------- ----------
XXXXXXX XX1ibichaoshimu2002/07/05
XXXXXXX XX1takeshiokada2005/07/15
XXXXXXX XX1kamoshu1857/09/25
WWCWWCW WW2waowao2008/10/22
DDDDDDD DD1uihhh2006/06/30
DDDDDDD DD1jojoj x5xx1999/09/09
DDDDDDD DD1momohara2005/03/07
DDDDDDD DD1itaiu-2003/12/22
DDDDDDD DD1komanogoal2007/04/26
GGGGGGG GX9 damerecord2009/11/14
FFFFFFF USJ ikitai1995/08/15
FFFFFFF USJ sstebuspi2004/01/05
FFFFFFF USJ bbpp2009/08/23

A1とB1は主キー、A2とB2は副キーです。
Aテーブルの「A4」カラムにはBテーブルのレコード数を持っています。(主キー、副キーが同じものの)
しかし、よくよく見るとAテーブルの「GGGGGGG」のA4には「2」のはずなのにBテーブルには実際にレコードは1つしかありません。
こういう状態になってしまっているのを割り出したいのですがどのようにA4とBテーブルで数があってないものを抽出できるでしょうか。
よろしくお願いいたします。

SQLで違うテーブルの値を比較して値に差があるレコードを抽出したいのですがヒントをいただけないでしょうか。
下に例を作ってみました。(テキストに貼りなおしてもらうと見易くなると思います)
<Aテーブル>
A1A2A3A4A5
------- ------- ------- ------- ----------
XXXXXXX XX1ABC32009/05/08
WWCWWCW WW2CCB12008/03/21
DDDDDDD DD1JPN52007/08/08
GGGGGGG GX9SOX21977/01/04
FFFFFFF USJNPB32001/09/11


<Bテーブル>
B1B2B3B4B5
------- ------- ------- ------- ----------
XXXXXXX XX1ibichaoshimu200...続きを読む

Aベストアンサー

SELECT A.* FROM Aテーブル A
INNER JOIN
TABLE(SELECT B1,B2,COUNT(*) SU
FROM Bテーブル GROUP BY B1,B2) B
ON A.A1=B.B1 AND A.A2=B.B2
AND A.A4<>B.SU

または

WITH B(B1,B2,SU) AS
(SELECT B1,B2,COUNT(*) SU
FROM Bテーブル GROUP BY B1,B2)
SELECT A.* FROM Aテーブル A
INNER JOIN B ON A.A1=B.B1
AND A.A2=B.B2 AND A.A4<>B.SU

こんなのでどうでしょうか?
後者の方が標準的(他のDBシステムでも
使える可能性が高い)かと思います。

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

Qシンボルが見つかりませんというエラーが理解できません。

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Image[3];
Thread t;
int index1 = 0;
int index2 = 0;
String msg = "";
String msg1 = "";

boolean state = false;
Button b1 = new Button("ぐー");
Button b2 = new Button("ちょき");
Button b3 = new Button("ぱー");

public void init(){
for(int i = 0; i<=2; i++){
img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG");
}
add(b1);
add(b2);
add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
msg1 = "結果は・・";

}

public void paint(Graphics g){
g.drawImage(img[index1],350,30,this);
g.drawImage(img[index2],695,30,this);
g.drawString("コンピューター",420,300);
g.drawString("あなた",800,300);
g.drawString(msg,630,320);
g.drawString(msg1,550,320);
}

public void start(){
state = true;
t = new Thread(this);
t.start();

}

public void run(){
while(state){
index1++;
if(index1 == 3){
index1 = 0;
}
index2++;
if(index2 == 3){
index2 = 0;
}
repaint();
try {
Thread.sleep(60);
}catch(InterruptedException e) { }
}
}

public void actionPerformed(ActionEvent e){
if(state == false) {
start();
return;

}
state = false;
if(e.getSource() == b1) {
msg = "ぐー";
index2 = 0;
}

else if(e.getSource() == b2){
msg = "ちょき";
index2 = 1;
}

else if(e.getSource() == b3){
msg = "ぱー";
index2 = 2;
}
check();
repaint();
}

public void check() {
if(index1 == index2) msg ="あいこ";


else if (index1 == 0) {
if(index2 == 2) msg="あなたの勝ち";
else msg ="あなたの負け";
}

else if(index1 == 1) {
if(index2 == 0) msg="あなたの勝ち";
else msg="あなたの負け";
}

else if(index1 == 2) {
if(index2 == 1) msg="あなたの勝ち";
else msg="あなたの負け";
}

}
}

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Imag...続きを読む

Aベストアンサー

「シンボルを見つけられません。」というエラーの下に何か表示がありませんでしたか?そこにヒントがあると考えられます。
シンボルを見つけられませんといエラーが表示される主な理由は4つあります。
(1)クラス、メソッド、変数などの綴りミスや定義していない変数を使用している可能性がある。
(2)コンストラクタを呼び出すときに、newを忘れている可能性がある。(3)公開されていないメンバーを呼び出している可能性がある。
(4)必要なimport文を記述し忘れている可能性がある。
ここでのあなたのエラーは(1)番ではないでしょうか?上記ではimageとなっている変数がimgになっていますね。
これはエラー表示をよく見ることで意外と簡単に解決できるのです。
ゆっくり丁寧にエラー表示を見るように心がけることが大事ですよ。

QJava-jspの画面入力値保持について

画面にテキスト、ラジオボタン、リストボックス とボタンがあります。
ボタンを押すと、JAVAで処理を行い、jspのviewで表示します。

1.テキスト、ラジオボタン、リストボックスなどに値が入力、設定されている状態で
ボタンを押して処理後にテキスト、ラジオボタン、リストボックスの値が
変わらないようにしたいのですが、
その場合、たとえば、入力、設定値をセッションになどに格納しておき
jspの所で、セッションから値を設定すると言うような方法になるのでしょうか?

2.ボタン押して処理後、ラジオボタン、リストボックスの選択値も
  変えないようにしたいのですが、
  これはどのように実現するのが、適切なのでしょうか?


以上、よろしくお願いします。

Aベストアンサー

ボタンというのはフォームのサブミットボタンのことですよ?
つまり、画面遷移が起きることを前提とすると(元の同じ画面に戻るのも含みます)

テキスト、ラジオボタン、リストボックスの状態を「要求パラメータ」として
送信し、それを次画面に反映するというのが最も一般的な方法です。

フレームワーク struts のアクションフォーム&JSPカスタムタグを使うと比較的楽に
そういう画面が作れますが、多くのフレームワークでも大差ありません。
簡単な画面なら素のサーブレート+JSPでも十分作れます。

セッションでもできますが、 セッションはログイン情報などの保持など、
限定された範囲で使うのが普通です。また、結局セッションに最新の
テキスト、ラジオボタン、リストボックスの状態を送るには、「要求パラメータ」
を送信する必要があります。

AJAXを使うという方法もあります。この場合、ボタンは AJAX 処理だけを行い
画面遷移を起こさないので、サーバ側で画面のテキスト、ラジオボタン、
リストボックスの状態をもつ必要はありません。

Qsqlplusで表示が変なので、出力を整形したい。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------

上記のように意味不明な形式で出てきます。

例えばこんな風に

select カラム1,カラム2,カラム3 from hoge;

カラム1 1の値
---------------------------
カラム2 2の値
---------------------------
カラム3 3の値

等のように分かりやすく表示できないでしょうか?

ちなみにOracle9iR2を使用しています。
sqlに関するツールは使用できないルールでして、あくまでsqlplusのコマンド上でみやすくしなければなりません。

分かりづらくですいませんが、皆さま、ご教授お願いします。

いつもお世話になっています。

サーバにアクセスしてsqlplusで、
データを調べたいのですが、
出力形式が見づらくて困っています。

よくわからいのですが、
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
---------------------------
1の値 2の値
3の値
---------------------------
カラム名1
---------------------------
カラム名2
---------------------------
カラム名3
-----------------------...続きを読む

Aベストアンサー

SQLPLUSを起動して、

SQL>set linesize 列数

でどうだ。

SQL>show linesize

で確認ができる。

QViewにインデックスは張れますか?

件名の通りなのですが、作成したViewが遅くて困っています。
改善方法としてはViewを作成しないで従来のSQLにインデックスを張って取得する方法にしようかなと考えています。
なにかいい方法はありますか?

Aベストアンサー

Viewの元テーブルに適切なIndexを貼る、ではいけないのですか?

QGROUP BYを行った後に結合したい。

oracle8iを使用しています。
2つのテーブルを結合したいと思っていますが、
テーブル構成が、N対Nのテーブルのため、
片方をグループ化したあとに結合させようと思っています。

ところが、単純にGroup byを使うと、結合した後に
グループ化してしまうために、期待した値がひょうじされません。

なんとか、1回のSQLで正しく情報をとることはできないものでしょうか。

Aベストアンサー

>テーブル構成が、N対Nのテーブルのため、
>片方をグループ化したあとに結合させようと思っています。

多分こんな形ではどうですか?

SELECT A.KEY,B.KEY,
FROM TABLE_A A
,(SELECT KEY FROM TABLE_B
GROUP BY KEY) B
WHERE A.KEY=B.KEY;

要はFROM句にテーブル名ではなく、SELECT~GROUP BYを書く。

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

QNUMBER(N,M) としたときの、格納データサイズ(バイト)

ORACLEで、DB項目をNUMBER(N,M)と定義したときの
データサイズ(バイト)を知りたいです。

例えば、
NUMBER(1,0),
NUMBER(2,0),
....
NUMBER(10,0)
としたときには、サイズは何バイトになりますか?

また、小数以下を指定したときにはどうなるでしょうか?

よろしくお願い致します。

Aベストアンサー

こんにちは。

NUMBER型はVARCHAR2型と同じく可変長なので
入力された値の桁数によって異なります。

■計算式
長さ = 1 + CEIL (n / 2)

型については下記のURLを参考してください。

参考URL:http://otndnld.oracle.co.jp/skillup/oracle9i/3_1/index.html


人気Q&Aランキング