JAVAでの動的ファイル

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tomomi

JAVAでの動的ファイル

#1

投稿記事 by tomomi » 13年前

JAVA/JAVAC/ibook/java初心者
JAVA言語で動的ファイルを扱いたいと思っています。

「test1.txt」という下記の内容が格納されているファイルがあったとします。
あ 3画 200.3 213.3 543.2
イ 2画 234.0 233.3
宇 6画 80.4 79.9 200.2 333.3 344.5 411.2
江 6画 77.7 77.7 180.8 210.1 222.0 219.1
お 3画 180.8 602.9 100.0

文字、画数、1画目の長さ、2画目の長さ・・・という順番です。
このファイルは更新可能としてどんどん増えていきます。

これを使いってプログラムでは、入力された画数と長さ情報をもとにどの文字が入力されたのかを検索できるようにしたいです。
たとえば「3画 200.3 213.3 543.2」と入力されたら「あ」と表示するものです。
(正確には、ぴったり同じ長さ情報は入力されないで、ファイルにある長さと入力された長さを比に直します)

この操作をするために、プログラムを動かすたびに、ファイルを一度配列に格納して配列内で検索しなければならないと思い込んでいたのですが、単純にファイル検索したほうがいいのかなと思いました。
そこで質問なのですが初心者にはどっちが理解しやすいでしょうか。また、具体的にどうするべきかをプログラムで説明して頂けると助かります。よろしくおねがいします<(_ _)>

nil
記事: 428
登録日時: 14年前

Re: JAVAでの動的ファイル

#2

投稿記事 by nil » 13年前

JAVAのファイル入出力には疎いので
コードを提示することはできませんが、
ファイルを全て読み込んでから配列に対して検索を行うことをおすすめします。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: JAVAでの動的ファイル

#3

投稿記事 by beatle » 13年前

tomomi さんが書きました: この操作をするために、プログラムを動かすたびに、ファイルを一度配列に格納して配列内で検索しなければならないと思い込んでいたのですが、単純にファイル検索したほうがいいのかなと思いました。
tomomiさんがいう「ファイル検索」って何ですか?
ファイルを配列に読み込んで検索するのもファイル検索だと思うのですけど。

頻繁に更新されるファイルを読み書きするのはどうやるのでしょうね。大変そうですね。
行が追加されるだけなのか、それとも既存の行が変更される可能性があるのか、それは決まってますか?
データが追加されるだけなら比較的楽です。

ゆうたろう

Re: JAVAでの動的ファイル

#4

投稿記事 by ゆうたろう » 13年前

JAVAはよく知らないけど
とりあえず1行分だけ配列に入れて
区切り文字で分解してそれを入れる変数を5つ用意して
もし入力した文字が一致するならループ抜ける
一致しないならfseekとかでシークポイントを1行ずらしていく
っていうかんじでできると思います

while(){
if(abcdeが入力数字と一致){ループ抜ける}else{シークポイント1行ずらす}}

tomomi

Re: JAVAでの動的ファイル

#5

投稿記事 by tomomi » 13年前

beatle さんが書きました: 頻繁に更新されるファイルを読み書きするのはどうやるのでしょうね。大変そうですね。
行が追加されるだけなのか、それとも既存の行が変更される可能性があるのか、それは決まってますか?
データが追加されるだけなら比較的楽です。
頻繁でもなく、行は追加されるだけで変更はされません。
「比較的楽」を具体的に説明してもらえると助かります<(_ _)>

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: JAVAでの動的ファイル

#6

投稿記事 by beatle » 13年前

まず、tailというコマンドを使ってみて下さい。Unix系のOSなら標準搭載されていると思います。
(僕はiBookには詳しくないですが、確かMac OSXシリーズが載ってる機種もありますよね。Mac OSXはUnix系OSなのでtail使えます)

$ tail -f ファイル名

のように使えば、ファイルへ行が追加されるたびに、画面に反映されていきます。

$ echo "1" > a
$ tail -f a
とやって、他のターミナルから
$ echo "2" >> a
とやれば、追加された「2」がtailによって画面に表示されます。

さて、僕自身は「比較的楽」の詳しい実装を知りません。
オープンソースのtailコマンドが存在し、それを解読しさえすれば実装方法が分かる、という意味で「比較的楽」と書きました。

かずま

Re: JAVAでの動的ファイル

#7

投稿記事 by かずま » 13年前

コード:

import java.io.*;

class Tail {
    public static void main(String[] args) throws Exception {
        String fileName = (args.length == 1) ? args[0] : "test1.txt";
        BufferedReader br = new BufferedReader(new FileReader(fileName));
        while (true) {
            String s = br.readLine();
            if (s == null)
                try { Thread.sleep(1000); } catch (Exception e) { }
            else
                System.out.println(s);
        }
    }
}
このプログラムは test1.txt を読み続けるので、
別の端末から、cat test2.txt >>test1.txt のようにデータを
追加すると、それを表示します。

読み込みと検索を同時に行うなら、Thread が必要です。

コード:

import java.io.*;
import java.util.*;

class Tail2 {
    ArrayList<String> lines = new ArrayList<String>();

    public static void main(String[] args) throws IOException {
        Tail2 tail = new Tail2();
        tail.readFile(args.length == 1 ? args[0] : "test1.txt");
        tail.findString();
    }

    void findString() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            System.out.print("> ");
            String s = br.readLine().trim();
            int i;
            for (i = 0; i < lines.size(); i++)
                if (lines.get(i).contains(s)) break;
            if (i < lines.size())
                System.out.println(lines.get(i));
            else
                System.out.println("# not found");
        }
    }

    void readFile(final String fileName) {
        new Thread() {
            public void run() {
                try {
                    BufferedReader br = new BufferedReader(new FileReader(fileName));
                    while (true) {
                        String s = br.readLine();
                        if (s == null)
                            try { Thread.sleep(1000); } catch (Exception e) { }
                        else
                            lines.add(s);
                    }
                } catch (IOException e) { e.printStackTrace(); }
            }
        }.start();
    }
}

閉鎖

“C言語何でも質問掲示板” へ戻る