• 締切済み

サーブレットで掲示板

サーブレットで掲示板を作っています。 流れとしては 【HTML入力フォーム】 【getPrameterでデータを取得】 【PrintWriterでCSVファイルへ書き込み】 【BufferedWriterでファイルの内容を読み】 【readLineで一行読む】 【一行読んだ内容をStringTokenizerで分割】 【hasmorToken、while文nextTokenで次々と分割して表示】 という形にしています。 ただ、この状態では新しい内容がどんどん下へ表示されます。 そのため、CSVファイルへ入れたものを配列に入れ順番を入れ替えて表示することを考えました。 一列読み取った内容を配列の[i]に入れ、for文の条件で、ディクリメントしながら次々表示させていこうと考えました。 色々考えていたら、ここの処理がごちゃごちゃしてきてしまいました。 *ファイルの内容を格納する配列box[30]とする。 *i=0で初期化する。 *box[i]のiをインクリメントする。 *0~29まで配列に格納する。 *それを分割する。 *for文により、ディクリメントしながら出力する。 おそらく難しく考えすぎなのかとも思います。 新しいものが上に表示させるために、配列に入れるのは間違ってはいないと思いますが、もうすこしシンプルなやり方がありましたら教えていただきたいのです。 一人で考えていても時間がたつばかりではまってます。 それに、このやり方は実用的でないことにも気づきました。 配列がその内いっぱいになったときにエラーが出るからです。 そのためにVecroeの使用を考えています。

  • Java
  • 回答数2
  • ありがとう数2

みんなの回答

回答No.2

>最終的には掲示板としてより実用的なものを作る必要があるんです。 であればDBに格納した方がいいんじゃないですか? 質問やお礼を読むと同時更新した場合とかを考慮していないように思われますし。 あと、ごちゃごちゃするのは ・ファイルに書く ・ファイルから読む ・分割する ・表示する を1つのメソッドの中で実行しようとしているからややこしくなってしまうのでは? 例えば String 書くデータ = req.getParameter("入力内容"); ファイルに書く(ファイル名,書くデータ); Vector 読み込んだ内容 = ファイルから読む(ファイル名); Vector 分割した内容 = 分割する(読み込んだ内容); 表示する(分割した内容); としておいて private void ファイルに書く(String ファイル名,String 書くデータ){   //書く   … } private Vector ファイルから読む(String ファイル名){   //1行読んでVectorに格納   Vector v = new Vector();   while(){     v.add(in.readLine());   }   return v; } private Vector 分割する(Vector 読み込んだ内容){   Vector 分割した内容 = new Vector();   for(int i = 0;i < 読み込んだ内容.size();i++){     //1行ごと分割     StringTokenizer st = new StringTokenize((String)読み込んだ内容.get(i));     //分割する     while(st.hasMoreTokens()){       分割した内容.add(st.nextToken());     }   }   return 分割した内容; } private void 表示する(Vector 分割した内容){   for(int i = 分割した内容;i > -1;i--){     //i番目の内容を表示   } } のような感じでどうでしょうか。 (…まだごちゃごちゃしてますかね…orz)

66umi66
質問者

お礼

お礼が遅くなって申し訳ありません。 結局Vectorに追加して入れて、順番を入れ替えて、分割させて、表示するという順番でうまくいきました。 一度整理したらわかりやすくなりました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

配列とかVectorを使うなら Stackを使えばいいと思います。 たかだか30個くらいだったら 文字列で outputString = 出力 + outputString; すれば、新しいモノ程前にくるようにできると思いますが。

66umi66
質問者

お礼

早速ありがとうございます。 今は試しに30個を配列に格納して表示できるかっていることでやっているんですが、最終的には掲示板としてより実用的なものを作る必要があるんです。 それで、どんどんふえていくことを考えて、 ・受け取ったデータをVectorに入れる。 ・ファイルへ書き込む。 ・一行読む。 ・Vectorのの順番を入れ替える。 ・表示する。 という流れがどうかと思っていたんです。 ただ、ここで入れ替えて表示する条件を考えていたらごちゃごちゃしてきてしまったんです。

関連するQ&A

  • クラス StringTokenizerのコンストラクタ

    あるCSVファイルから行を読み込んで、以下のように文字列を配列に格納しようとしたのですが、カンマとカンマの間の文字列がNULLの時に、次のカンマにある文字列がずれて格納されてしまいます。 例外処理(if文)で処理を振り分けるなどとして、NULLもきちんと配列におさめるにはどのようにすればよろしいのでしょうか? ・ ・ line = csvfile.readLine(); StringTokenizer analy = StringTokenizer(line,","); String[] moji = new String[analy.countTokens()]; for (int n=0; n<moji.length; n++){ moji[n] = analy.nextToken(); } ・ ・

    • ベストアンサー
    • Java
  • カンマで区切られたメールアドレスを配列に格納したい場合

    いつもお世話になっております。 下記のようなStringのデータを配列に格納したいのですが、 private static final String MAILS = "test1@test.com,tes,t2@tes,t.net,test3@te,st.jp"; 普通にカンマで分割するとメールアドレスの形式はめちゃくちゃで配列に格納されてしまいます。 StringTokenizer st = new StringTokenizer(MAILS, ","); String [] mailList = new String[st.countTokens()]; int i = 0; while (st.hasMoreTokens()) { mailList[i] = st.nextToken(); i++; } test1@test.com tes,t2@tes,t.net test3@te,st.jp 上記のようにちゃんとしたメールの形式で配列に格納するにはどうすればいいでしょうか? ご教授頂ければ幸いです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • C言語 文字列格納

    テキストファイルから整数データ又は文字列を読み込んで配列に格納する動作についての質問です。 テキストファイルが1行区切りの整数型なら1次元配列で for(i = 0; i < maxSize; i++) { fscanf(fp,"%d", &data[i]); } テキストファイルが1行区切りの文字列なら2次元配列で for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%s", &data[i][300]) == EOF) break; } for(j = 0; j < i; j++) printf("%s\n", data[j]); みたいな具合に格納できたんですが、 テキストファイルが1行区切りのデータではなく、空白文字区切りの文字データだった場合、それぞれどのようにして配列に格納すればいいかがわかりません。 イメージとしては、1文字目から見ていって空白が出ればそこで切って格納していくというかんじなのですが・・・ 質問の内容がわかりにくいかもしれませんが、是非教えてください。お願いします。

  • ファイルからの読み込み 配列

    座標データの数値のテキストファイルから配列の中に座標値を格納したいのですが、int型のデータを読み込んで配列に格納するのは、どのようにプログラムを組めばよろしいのでしょうか?下のようにxzahyou.csvというファイルから配列Z[i]に格納したくて組んでみたら、 br = new BufferedReader(new FileReader("xzahyou.csv")); for(int i=0;i<X.length;i++){ String line = br.readLine(); X[i]=line; X[i] = line;のところで互換性がないと出てきました。int型の場合どのようにすればよろしいのでしょうか?教えてください。お願いします。

  • 【PHP】csvファイルへの書き出し(1行追加or1行上書き)について

    【PHP】csvファイルへの書き出し(1行追加or1行上書き)について はじめて利用させていただきます。 現在、PHPにて書き出し処理を作成している者ですが、csvファイルへの書き出しの際に先頭行にスペースが大量に入ってしまい、困っています。 自分なりに調べてみたのですが、原因がわかりません。詳しい方からのアドバイスをお願いしたいです。 【行っている処理】 1.csvファイルを1行ずつ読み込み、配列に格納 2.既存のデータに同じ名前の人が存在する場合は、その行の配列の内容を変更(存在しない場合は配列の末尾に1件追加) 4.現在ファイルにあるデータを削除(丸めこみ)し、配列データを書き書き出し 【ソース】(書き出し処理に問題があると思ったため、それ以外の部分は割愛させていただきます) <?php $filename = 'data.csv'; $file = fopen($filename, "r+" ); $name = array(); if(flock($file,LOCK_SH)){ while( $data = fgetcsv( $file, 1000, "," ) ) {   //配列に格納 } //配列の内容変更or新規に一行追加処理 //現在のファイル内のデータを削除(まるめこみ) ftruncate($file, 0); //1行分のデータをカンマ区切りで結合し、書き出し for($i = 0; $i < $count; $i++){ $ins = $name[$i]; $ins .= ','; $ins .= $number[$i]; //書き込み失敗時のエラー if(fwrite($file, "$ins\n" ) === FALSE){ print("ファイル書き込みに失敗しました"); }else{ //処理なし } } //ファイルロック解除 flock($file, LOCK_UN); }else{ print("ファイルロックに失敗しました"); } 【csvファイルの中身(処理実行前)】 佐藤,1234 田中,12345 中村,9876 【csvファイルの中身(処理実行後)】                       佐藤,1234 田中,12345 中村,9876 以上です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • VBSにてCSV読み込みし比較

    ある場所に比較するCSVファイルを2個格納しております。 ただしCSVファイル名は可変であります。 その場合 Set objTextA = objFSO.OpenTextFile("C:\" & "A.csv")と特定して呼び出せません。 名前が可変なときのため、そのパスにあるCSV2個を順に呼び出すにはどうすればよいのでしょうか。 また呼出し後、split関数により、配列に入れます。A配列とB配列に格納したとします。 一つ一つ比較していきたいのですが、 以下のような構文の場合、比較で違ったときテキストに書き込みとなりますでしょうか? for i=0 to i=10 step 1 if strcomp(a(i) ,b(i))) = 1 then テキストに書き込み endif next

  • php配列格納

    $lines = file ('db.csv'); 上記でファイルの中身を配列に入れますがその逆で データを配列にして格納したいのですがどうすればいいのでしょうか? ファイルの不要な行を除いて再度変数に配列で格納しファイルを作成 したいのです。

    • ベストアンサー
    • PHP
  • Excel(VBA)で配列の要素数を調べるには?

    お世話になります。 ExcelのVBAで、split関数を使って配列に格納したデータの要素数を調べる方法がわかりません。 下記のようなコードで、読み込んだデータを配列(Arraydata)に格納することは出来たのですが、test.csvの要素数が処理の度に変わるため、要素数に応じて後続の処理を行ないたいと考えています。 Open test.csv For Input As #1 ' test.csvファイルを開く Line Input #1, test.csv ' データ行を読み込む Arraydata = Array(Split(test.csv, ",")) ' 配列に格納 よろしくお願いします。

  • CSVファイルの、列だけ取得したい

    FileReader filereader = new FileReader(FileName); BufferedReader bufferedreader = new BufferedReader(filereader); String line; int i = 0; while((line = bufferedreader.readLine()) != null) { int j = 0; StringTokenizer stringTokenizerTest = new StringTokenizer(line, ","); while(stringTokenizerTest.hasMoreTokens()) { item[j][i]=stringTokenizerTest.nextToken().toString(); j++; } i++; } filereader.close(); このような記述で、CSVの中身を全て取得することは出来るのですが、 ある一列だけ取得する方法がわかりません。 具体的には、コンボボックスにCSVのある一列だけ表示させたいです。 (その後、重複なしの値のみにフィルタリングしたい) 現在は苦し紛れに、 combo1.setModel(new DefaultComboBoxModel(new String[] { item[1][3], item[1][4], item[1][5], item[1][6], item[1][7], item[1][8], item[1][9], })); などと、配列を使ってピンポイントで値を取得していますが これでは使えないので・・ アドバイスよろしくお願いいたします。

    • ベストアンサー
    • Java
  • JAVA 配列を格納したArrayListのサイズ

    ArrayListにcsvファイルを格納する処理を作成しました。 読み込みはBufferedReaderで行単位で読み込ませ、 ArrayListの各要素には各行をカンマ区切りでわけた配列を 入れてあります。 ここで読み込むcsvファイルがデータなしの時にデータがないことを コメントする処理を入れたいのですが、ArrayListのサイズが0であるという 条件を思いつき、「length」や「size()」で条件文を作成したところ、 コンパイルされても処理が正常に走りませんでした。 条件にしている箇所があっているのか間違っているのか。 あっているならば、配列をしまってあるArrayListの要素数を 得る方法、間違っているならば、正しい条件を教えてください。 大変恐縮ですが、ご助言お願いいたします。 inName : 取り込みファイル名(argsで引っ張っています。) outName : はき出しファイル名(同上) ExceptionはIOとFileNotFoundをcatchしています。 try{ bf = new BufferedReader(new FileReader(inName)); outbf = new BufferedWriter(new FileWriter(outName)); String line; while((line = bf.readLine()) != null){ al.add(line.split(",",0)); /*for(int i=0 ; i < data.length ; i++){ al.add(data[i]); }*/ //行数0の処理を記述しようとしている箇所 } for(String[] out : al){ for(int i=0 ;i<out.length ; i++){ outbf.write(out[i]); outbf.newLine(); } } }

専門家に質問してみよう