2

質問「ローカル(res / raw)ファイルを1行ずつ読み取る方法は?」同様の問題を扱っていますが、そこで提供された回答に基づいてソリューションベースを構築することができませんでした。私は非常に有用な情報(readLineメソッドを持つDataInputStreamクラス)を取得しました。これを開発者のWebサイトで調査し、機能させるように努めています。

私がやろうとしているのは、テキストファイルの連続する行に格納されている情報を文字列配列に読み込むことです。最初の行は最初の配列要素、2番目の行は次の配列要素などです。次にこの文字列配列は、次に開かれるアクティビティのテキストフィールドに入力するために使用されます。これはすべてスイッチケース内で発生します(ケースに応じて、つまりどのリストアイテムが選択されているかによって、異なるテキストファイルがロードされます)。これが私がこれまでに持っているものです:

//Retrieve necessary text file for inputstream
InputStream buildinginfo = getResources().openRawResource(R.raw.testbuilding);
class DataInputStream extends FilterInputStream{
    protected DataInputStream(InputStream buildinginfo) {
        super(buildinginfo);
        // TODO Auto-generated constructor stub
        int i;  
        String[] building_info;
        //Assign lines of text to array
        for(i=0; i<5; i++){
            building_info[i] = buildinginfo.readLine();
        }
    }
}

これまでのところ、編集者はこれらのエラーを除いてそれで大丈夫です、そして私はそれらを理解するのに十分な経験がありません。私は彼らが言っていることを理解していますが、それらを修正する方法は理解していません。エラーは、入力ストリームを設定して値を割り当てようとしているスイッチケース内のセクションにあります。最も重要なことは、readLineコマンドが実行される行で、次のようになります。"-メソッドreadLineはタイプDataInputStreamに対して未定義です""-メソッドreadLineはタイプInputStreamに対して未定義です"

私が間違っていなければ、ここ(http://developer.android.com/reference/java/io/DataInputStream.html)にDataInputStreamクラスでreadLineメソッドが使用可能であると書かれているので(私はこれは上記の質問から)。明らかに、私はDataInputStreamを正しく使用していませんが、その方法を理解できないようです。私はここでいくつかの質問に目を通し、上記のリンク先のページを数回参照しました。

誰かが私が間違っていることを見ることができれば、私はあなたの助けを大いに感謝します。この種のタスクで間違ったツリーを完全に吠えている場合は、時間を無駄にしていることをお詫びしますが、いくつかのガイドラインまたは適切なチュートリアルリソースへの紹介をいただければ幸いです。私はこれらのエラーを理解するために過去2日間を費やしました。

4

1 に答える 1

11

さて、ここであなたを助けた人は誰もいません...ここに行きます.

基本的に、API クラスの使用方法を理解する上で間違った方向に進んでいます。

コードはDataInputStream クラスを定義しようとしています。代わりに、API によって既に提供されているものを使用したいと考えています。クラスを再定義することで、実際には API クラスをマスクしています (絶対にそうしたくありません)。

したがって、DataInputStream のドキュメントを見ると、コンストラクターが表示されます。これにより、クラスのインスタンスを作成できます。これはあなたが代わりに欲しいものです:)

InputStream buildinginfo = getResources().openRawResource(R.raw.testbuilding);
DataInputStream myDIS = new DataInputStream(buildinginfo);

//you've now got an instance of DataInputStream called myDIS

String firstString = myDIS.readLine();

//voila ... your firstString variable should contain some text

配列コードにも問題があります...しかし、私はこのように配列を使用しません。

サイズをいじる必要がないように、ArrayList を使用してから while ループで行を読み取る必要があります。

まず、この行を削除しましょう (コメントアウトします:

//String firstString = myDIS.readLine();

そして、テンプレート クラスである ArrayList のインスタンスを作成します。String山括弧内の は、配列に必要な要素の種類を示していることに注意してください。

ArrayList<String> list = new ArrayList<String>();

add メソッドを使用して、arraylist に要素を追加できます。すべてを一度に行うつもりです。後で説明しますので心配しないでください...

String myLine; //declare a variable

//now loop through and check if we have input, if so append it to list

while((myLine=myDIS.readline())!=null) list.add(myLine);

最後の行は少し凝っていますが、myLine 変数を割り当てると、NULL と比較できる結果が返されます。最後の行が読み取られると、readline 関数は null を返します。while ループの条件は false に相当し、ループから抜け出します。

toArray配列リストを単純な配列に変換するために呼び出される単純なヘルパー関数があります。

String[] myStringArray = list.toArray(new String[list.size()])

これで目的の出力が得られました。この言語の一般的な感触をつかむために、Android でいくつかのビデオを視聴することをお勧めしますが、これが間違いの場所を理解するのに役立つことを願っています。

于 2013-02-19T22:59:22.010 に答える