1 名前:デフォルトの名無しさん mailto:sage [2009/08/02(日) 23:47:15 ] プログラミング言語Javaに関する質問スレです。 JavaScript, Ajaxの質問は、ここでは受け付けていません。 Web製作管理 pc11.2ch.net/hp/ Webプログラミング pc11.2ch.net/php/ をご利用下さい。 よくある質問 ・「コマンドまたはファイル名が違います」 「'javac' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 「Exception in thread "main" java.lang.NoClassDefFoundError: 」 www.wikiroom.com/java/?path,classpath ・String に == は使うな。equals() を使え。 ・「\12288 は不正な文字です。」 文字リテラル以外で全角スペースは使えません。半角スペースに。 ・その他の質問→「APIのjavadoc見ろ」 前スレッド 【初心者】Java質問・相談スレッド129【歓迎】 pc12.2ch.net/test/read.cgi/tech/1247322478/ 次スレは>>990 あたりで。 過去ログ、関連スレッド、よくある質問とその回答など、 質問をする前に、貴方が見なければならないサイトについての情報は、 下のwikiのページにまとめてあります。 www.wikiroom.com/java/
337 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 16:43:41 ] JAVA AWTに関しての質問なのですが 最初のウィンドウ?に コンポーネントをextendsして作成したクラスを追加した後 追加したコンポーネント上でマウスがクリックされた等の動作を最初のウィンドウのクラスで検知することはできるのでしょうか? (よく分からないため 用語の使い方等がおかしい可能性が高いです。) ttp://www.dotup.org/uploda/www.dotup.org18518.jpg イメージ
338 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 17:11:16 ] 最初のウィンドウクラスにリスナー追加したらおk
339 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 17:14:50 ] >>336 今どきならばJUnitでモックとか使う。 というか、大昔からそれしかないが・・・(C言語でも似たようなことやってた)
340 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 17:17:32 ] >>336 おおざっぱに 「他システムに接続してデータ取得」の部分を一つのオブジェクトにしておいて、 interface Transfer { Data receiveData(Param param); } class RealTransfer impliments Transfer { public Data receiveData(Param param) { /*他システムと接続してDataを得て返す*/ } } class MockTransfer impliments Transfer { public Data receiveData(Param param) { /*テスト用のDataを適当に生成して返す*/ } } class Main { public static void main(String args[]) { //転送用オブジェクトを選択生成 Transfer trans = null; if(args.length == 1 && args[1].equals("test")) { trans = new MockTransfer(); } else { trans = new RealTransfer(); } //本番かテストか気にせず使用 Param param = 〜; Data data = trans.receiveData(param); } } てな感じ。
341 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 17:20:59 ] >>337 すみません その方法を教えていただけないでしょうか。 感で addMouseListener(追加したキャンバスクラス); と書いてみたものの駄目でしたorz また、最初のウィンドウクラスに public void mouseClicked(MouseEvent e) { System.out.println("click"); } と書いても追加コンポーネントをクリックした時は反応がありませんでした。 (ウィンドウ上コンポーネント外では反応しました。)
342 名前:340 mailto:sage [2009/08/09(日) 17:27:42 ] >>340 うああ "args[1]"→"args[0]" その場書きだからとゆるしてやってくれ…汚しスマ
343 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 17:31:17 ] >>341 ”感”じゃなくて”勘”だろうw 未確認だが 追加したキャンバス.addMouseListener(最初のウインドウ); ではどうだ?
344 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 17:37:48 ] Javaって機能ごとにクラスを分割するじゃん。(入力チェッククラス、ファイル書き込みクラス・・・) でも、これらって1つのおおもとになるクラスから、いちいちnewして呼ぶんでしょ。 1つのクラスに書いたほうが、たくさんインスタンスを作らなくてよい分、性能がいいんじゃないの? クラスが増えるとメンテナンスも悪くなるし。 きちんとメソッドごとに機能をわけていればよいと思うんだけど。
345 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 17:42:35 ] >>343 上手くいきました ありがとうございます。
346 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 17:48:00 ] >>344 んなこた無い。再利用性ってググってみよう。
347 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 17:55:37 ] /home/ユーザー/hoge1/hoge2/hoge.txtというパスにあるファイルを作りたいと考えています どこのディレクトリまで存在しているか?ということをどうやったら、調べられますか? 例えば/home/ユーザー/まではちゃんとディレクトリが存在して、hoge1以下は存在しないよ〜 って感じです。
348 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 17:58:40 ] >>344 正解。皆騙されているだけ
349 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 18:09:57 ] >>347 File file = new File("/home/ユーザー/hoge1/hoge2/hoge.txt"); while(!file.exists()) file = file.getParentFile(); //この時点のfileはあるらしい //rootもなけりゃぬるぽ もちろん未確認
350 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 18:20:26 ] >>347 作りたいだけなら file.getParentFile().mkdirs(); file.createNewFile();
351 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 18:22:10 ] >>348 やっぱりそうですよね。 僕はそう簡単にだまされません。 先日、入力チェッククラスを作っている童貞がいました。 C++神の僕にはそんなクラスはかっこ悪くて作れません。
352 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 18:24:07 ] >>344 >>348 一人で全部作ってろ
353 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 18:24:20 ] 部品化(Bean)など上手くいっている現場は珍しい。 ほとんどはウンコ。わけわかめ。分けりやあいいってもんじゃない。 かえって思考が分散する。以上だ。
354 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 18:27:05 ] 太古の昔から部品の共通化などと能書きは垂れるが 細部にまで一貫性を保ってプロジェクトを運用し、設計思想を貫けるような SEは殆どいない。理想はそうだろうが人間の頭は付いて来ない。 わかったか。
355 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 18:27:44 ] 俺できるよ?
356 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 18:28:47 ] >>351 何で入力チェッククラスがダメなの?
357 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 18:32:39 ] 分けなくていいもんまで分けたり、 分けられるもんを分けなかったり、 取っておけるもんを毎回作って消したり、 単にツクリが悪いだけだろ。
358 名前:347 mailto:sage [2009/08/09(日) 18:50:47 ] >>349-350 わかりました。ありがとうございます 参考にします
359 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 18:52:48 ] >>344 1つのおおもとになるクラスから他のクラスを呼ぶってのは、 最近あまりみないよ。
360 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 18:57:42 ] >>336 Java言語向けのやり方としては、外部システム接続がらみの境界線で interfaceを定義して、テスト環境ではモックオブジェクトに切り替える ようにするのが定石。 で、その切り替え処理はある程度DIコンテナ(Spring, Seasar2, Google Guice等)に任せるのが最近の傾向。
361 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 19:08:33 ] テキストファイルを1行読み込んだら、読み込んだデータをテキストを処理するクラスに渡す という作業をループを使用して実装したいと考えています。 速度向上のためにテキストを処理するクラスはThreadを継承しようと考えています。 しかし、IOの方が遅いので行を読み込み終る前にテキストを処理するスレッドが終了してしまいます どうにかして、勝手におわらせないようにしたいのですが どのようにすればいいのでしょうか?
362 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 19:12:20 ] 1行1スレッドという発想は神ですね。 感動しました。
363 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 19:18:35 ] >>362 煽るの好きだな
364 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 19:21:59 ] >>361 つBlockingQueue
365 名前:361 mailto:sage [2009/08/09(日) 19:29:12 ] >>364 ありがとうございます。 早速ググってみます
366 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 19:46:02 ] final String str = "str";str = "STR";はダメなのに final ArrayList<String> list = new ArrayList<String>();list.add(str); は問題なくadd()出きるのですか?
367 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 19:54:55 ] Java には代入とメソッドの区別ができるから
368 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 20:04:11 ] >>366 final はオブジェクトの参照そのものが変化しないことを要求するだけ。 String への代入は参照そのものが変化するから× list.add は list への参照そのものは変化しないから○
369 名前:366 mailto:sage [2009/08/09(日) 20:06:49 ] >>367-368 非常に参考になりました。ありがとうございます
370 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 20:30:23 ] >>366 finalが制限するのは、変数とオブジェクトの結び付きだけなので、オブジェクト自身に対する操作には影響しない。 絶対切れない紐の先に犬を結び付けたら別の犬に取り替えることはできないけど、犬がモノを食っても紐の種類には関係ない。
371 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 21:53:02 ] 1つのメインのクラスから、色々なクラスをよぶとき、 クラス図はどう表現すればよいのでしょうか? 1つのメインになるクラスから、使用しているクラスに矢印をひっぱるのでしょうか?
372 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:03:19 ] アノテーションについて質問です。 アノテーションはあくまでクラス(Class<?>)が持つもので 例えば class Hoge { @Anno Integer i; } Hoge h = new Hoge(); としたとき h.iからそのフィールドに付いてる@Annoを取得(h.getDeclaredFields()してFieldを取得することなく)することはできないという認識でよいのでしょうか?
373 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:23:59 ] >>371 適当にやじるし引っ張っとけ。 あってもいないし間違ってもいないし、理解もしていない。 >>372 正しい。h.iは単なるInteger型の参照でそれからは情報を取ることはできない。 Hogeのクラス情報(h.getClass, Hoge.class)から取得する。 ちなみに、アノテーションはRuntime属性にしておかなければ実行時には情報がなくなるので注意されたし
374 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:37:45 ] アノテーションって何が出来るのですか
375 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:38:23 ] >>373 アノテーションの意味的には取得できてもよさそうなものですが、やはり無理なのですね。 ありがとうございます。
376 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:46:24 ] >374 一言で言えばフィールドやメソッドにラベルを付けられる ラベルが付いているか付いていないかでIDEやフレームワークが「なにか」をするかもしれない >375 いやできないのが自然だろう。 アノテーションは商品の値札のようなもの。 値札はパッケージや陳列棚にはつけるが、商品そのものには付けない が、他の店で等々の品はある。
377 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:51:09 ] javaにはRTTIがないから>>372 の動作が自然だと思ってたんだが>>375 はなんでそう思うの?
378 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 22:52:00 ] >>371 それは依存なので破線の矢印で表す。 矢印の方向はそれであってる。
379 名前:デフォルトの名無しさん mailto:sage [2009/08/09(日) 23:00:58 ] @deprecateは取り消し線が付いて有益だと思う @supressは黄色いびっくりwarningが消えるので有益 他に何かある?
380 名前:>>375 mailto:sage [2009/08/09(日) 23:07:10 ] >>376-377 考えがかなり浅かったようです。 >>376 の例を考えると納得でした。 勉強になりました。重ねてお礼を申し上げます。
381 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 05:15:08 ] 株やFXの業者サイトを開くと有名なjavaのマークの周りを■がぐるぐる回るアイコンが表示され その後チャートなどが表示されますが、あれは「JAVAで作成されたプログラム準備中」という意味でしょか?
382 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 12:12:04 ] BlockingQueueを教えてもらった者ですが、確認させていただきます BlockingQuequeに何も無くなったら、 自分自身(BlockingQueque)があるスレッドを自分自身で止めるということでいいんですよね?
383 名前:デフォルトの名無しさん [2009/08/10(月) 12:20:40 ] >>374 DI
384 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 13:00:29 ] ファイル読込で、BufferedReaderとInputStreamReaderを使用すると読み込むことは可能ですが、UTF8に変換されるのが困ってます。 SJIS読込→UTF8となって後の処理 SJISファイル出力でファイルを出力すると一部文字が文字化けしてしまいます。 これを解決するために、SJISファイルを読み込んで、内部的にもSJISの状態を保持して読み込むことは可能でしょうか?
385 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 13:03:54 ] >>382 自分自身(BlockingQueque)があるスレッド、などというものは存在しないよ BlockingQueue自身はスレッドを持っていない 止めるのは要素を取り出そうとした(takeを呼び出した)スレッド あとついでに、満杯のキューにputしようとしたスレッドも空きが出来るまで止められる
386 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 13:08:37 ] >>384 そもそもInputStreamReaderというのは、byte(バイト)をchar(Unicode文字)に変換するためのクラス 変換を通さずInputStreamから直にbyteを読み取ってOutputStreamに出力すればよいのでは
387 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 13:20:19 ] >>386 やっぱりそうなりますよねぇ。 一行読込とかやりたかったんだけど、自前で組むしかなさそうですねぇ。 サンクスです。
388 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 13:23:32 ] if(objFrm.get("idno")!=null && !objFrm.get("idno").equals("")){ このときに、!=nullはヌルじゃないを検査して、 !objFrm.get("idno").equals("")もヌルじゃないを検査しているのですけど どうして2回繰り返すのでしょうか。
389 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 13:24:39 ] s-jisのreader使って一行読み込んで,s-jisのwriter使ってoutputstreamに書き込めばいいんでない?
390 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 13:25:51 ] ちゃんと読まなかった結果がこれだよ…
391 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 13:29:58 ] >>384 もしかして "SJIS" じゃなくて "Windows-31j" とか "MS932" を指定すると上手く動いたりしないだろうか
392 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 13:31:17 ] >>388 null と "" は別のものなので、2個チェックする必要があります
393 名前:382 mailto:sage [2009/08/10(月) 13:33:58 ] >>385 わかりました、ありがとうございます
394 名前:デフォルトの名無しさん [2009/08/10(月) 13:43:53 ] >>384 "Windows-31j" と"MS932"は、試してみましたがだめでした。 2chのスレッド内容を取得しようと思ったんですけど、httpHeaderに設定されている「content-length」の値と SJIS→UTF8→SJISファイル出力で取得したbyte長が異なるので困ってます。 うーんいい方法はないのかなぁ。
395 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 13:53:40 ] >>394 改行コードの問題とかはない? readLineは\nでも\rでも\r\nでも改行扱いするはずだけど、出力してる改行コードが元と違うとか 具体的に何がどう変わってるのか、バイナリダンプかなんかで比較して調べるべきかと
396 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 14:19:09 ] >>387 >一行読込とかやりたかったんだけど ttp://commons.apache.org/io/api-release/ こういうのがありますが、使えませんか?
397 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 14:27:35 ] >>394 やりたいこととやってることが微妙に合っていないように聞こえるが。 2chのhtmlが文字列だからといって、Reader/Writerを使わなければならない訳じゃない。 そもそもContentLengthはhttpのボディ部が”バイナリとして”何バイトあるかを示しているはずだ。 だからReader/Writerじゃなく、InputReader/Writerでバイナリのままファイルに落とせ。
398 名前:397 mailto:sage [2009/08/10(月) 14:29:48 ] >>397 ごめ、イキオイで間違った。 >inputRaeader/Writer じゃなくて InputStream/OutputStream
399 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 14:45:36 ] >>396 ディレクトリ操作とか便利そうですが、今回のファイル入出力に関してはちょっと用途が違うなと思いました。 >>397 ,398 やっぱしstreamでI/Oするのがスマートそうですね。 ちょっと実装してみます。
400 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 14:46:08 ] >>394 >「content-length」の値と >SJIS→UTF8→SJISファイル出力で取得したbyte長が異なるので困ってます。 content-lengthの事を書いているのを見ると、差分データを取りに行きたいんでしょ? スレッド番号.infoみたいなのを作ってレスポンスヘッダからconect-lengthの値を取得して、 <content-length>数値</content-length>とかやった方がいいと思うんだけど。
401 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 14:46:16 ] >>394 改行コードは問題ありませんでした。LFなので特に困ってないです。
402 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 14:49:46 ] >>400 ご名答。 ずばり2chスレッドの差分データを取得するために、content-lengthの値を設定したいのですが、思った通りに値を設定できなくて四苦八苦してます。 ちょっと悩んでみます。
403 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 14:51:37 ] うるさい
404 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 14:52:42 ] むしろHTTPなら java.net.HttpURLConnection とか import java.net.URL でまかなえるのでは
405 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 15:01:25 ] >>402 自分で全体から一部を取り出さなくても、”新着レスの表示”リンクを見れば URLにちょっと書くだけで差分が送られてくることが分かるだろ 全体を得たとしても、htmlを良く見ればレスがdat落ちと似た形式で一行毎になっているのが確認できるはずだ。 その部分を抜き出せば、レスの件数=行数。差分も得やすくなるだろ。
406 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 15:02:19 ] 受信した生データはいったんそのままStreamでファイルに保存しておいて、 あらためてファイルからReaderで1行ずつ読み込めばいい
407 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 15:23:52 ] >>402 >>404 にも書いてある通りHttpURLConnection 使った方がいいと思うな www.fk.urban.ne.jp/home/kishida/kouza/kishou/14net.html てか、content-lengthを取得できないっってことはe-tagも取得できていないでしょ? サーバに必要なデータを送らないと、ちゃんとデータを送り返してくれないような気がする 差分データはステータスコードを気にしながらコードを書かないいけないので注意
408 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 15:28:35 ] >>405 それがdatファイルの扱いに関しては簡単ではないんです。 >>406 ,407 初回は、HttpURLConnectionで取得しているのですが2回目以降は、最初に取得した情報をファイルに出力しておいて ファイルの差分をHttpURLConnectionで問い合わせようとしています。 そこで、content-lengthが重要になってくるんです。 javaじゃなければ簡単に処理できんだけど、なんでUTF8以外を扱おうとするとおかしくなるんだろ。
409 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 15:32:26 ] >>392 ありがとうございました。
410 名前:デフォルトの名無しさん mailto:sage [2009/08/10(月) 15:48:57 ] >>408 とりあえず、初回読込はネットから取得してSJISファイル保存。 2回目以降のアクセスは、さきほどのファイルからbyteを取得して、ネットから差分取得でうまくいきました。 ありがとうございます。