1

いくつかの文字列を単純な .txt ファイルに保存してから読み取りたいのですが、Base64 を使用してそれらをエンコードしようとすると、うまくいきません。^^

書き込み方法:

private void write() throws IOException {
    String fileName = "/mnt/sdcard/test.txt";
    File myFile = new File(fileName);

    BufferedWriter bW = new BufferedWriter(new FileWriter(myFile, true));

    // Write the string to the file
    String test = "http://google.fr";
    test = Base64.encodeToString(test.getBytes(), Base64.DEFAULT);

    bW.write("here it comes"); 
    bW.write(";");
    bW.write(test);
    bW.write(";");

    bW.write("done");
    bW.write("\r\n");

    // save and close
    bW.flush();
    bW.close();
}

読み取り方法:

private void read() throws IOException {
    String fileName = "/mnt/sdcard/test.txt";
    File myFile = new File(fileName);
    FileInputStream fIn = new FileInputStream(myFile);

    BufferedReader inBuff = new BufferedReader(new InputStreamReader(fIn));
    String line = inBuff.readLine();
    int i = 0;
    ArrayList<List<String>> matrice_full = new ArrayList<List<String>>();
    while (line != null) {
        matrice_full.add(new ArrayList<String>());
        String[] tokens = line.split(";");

        String decode = tokens[1];
        decode = new String(Base64.decode(decode, Base64.DEFAULT));

        matrice_full.get(i).add(tokens[0]);
        matrice_full.get(i).add(tokens[1]);
        matrice_full.get(i).add(tokens[2]);
        line = inBuff.readLine();
        i++;
    }
    inBuff.close();
}

理由はありますか?

4

1 に答える 1

4

コードにいくつかのエラーがあります。

最初に、コードに関するいくつかの注意事項を示します。

  1. ここに投稿するとき、SSCCEを添付すると、他の人があなたのコードをデバッグするのに役立ちます。コンパイルされないため、これはSSCEEではありません。いくつかの定義済み変数がないため、実際の意味を推測する必要があります。また、コードにclose-commentトークンを貼り付けまし*/たが、start-commentトークンは1つもありません。
  2. read(メソッドのcatch-blockのように)例外をキャッチして抑制することは、自分が何をしているのかを本当に理解していない限り、本当に悪い考えです。ほとんどの場合、潜在的な問題をあなたから隠すことです。少なくとも例外のスタックトレースを書き込むのはcatchブロックです。
  3. デバッグして、宛先ファイルに正確に何が出力されるかを確認してみませんか?これを行う方法を学ぶ必要があります。これにより、特にキャッチが難しい問題を抱える大規模なプロジェクトの場合、開発プロセスがスピードアップします。

ソリューションに戻る:

  1. プログラムを実行します。例外をスローします:

    02-01 17:18:58.171: E/AndroidRuntime(24417): Caused by: java.lang.ArrayIndexOutOfBoundsException
    

    ここの行によって引き起こされます:

    matrice_full.get(i).add(tokens[2]);
    

    変数を調べると、変数ではなく要素が含まtokensれていることがわかります。23

  2. それでは、writeメソッドによって生成されたファイルを開きましょう。これを行うと、次の出力が表示されます。

    here it comes;aHR0cDovL2dvb2dsZS5mcg==
    ;done
    here it comes;aHR0cDovL2dvb2dsZS5mcg==
    ;done
    here it comes;aHR0cDovL2dvb2dsZS5mcg==
    ;done
    

    ここで改行していることに注意してください。これはBase64.encodeToString()、エンコードされた文字列の最後に追加の改行を追加するためです。余分な改行なしで単一の行を生成するにはBase64.NO_WRAP、次のように2番目のパラメーターとして追加します。

    test = Base64.encodeToString(test.getBytes(), Base64.NO_WRAP);
    

    ここで、不適切な改行があるため、以前に作成されたファイルを削除する必要があることに注意してください。

  3. コードを再度実行します。これで、適切な内容のファイルが作成されます。

    here it comes;aHR0cDovL2dvb2dsZS5mcg==;done
    here it comes;aHR0cDovL2dvb2dsZS5mcg==;done
    
  4. nowの出力を印刷すると、次のようにmatrice_fullなります。

    [
        [here it comes, aHR0cDovL2dvb2dsZS5mcg==, done],
        [here it comes, aHR0cDovL2dvb2dsZS5mcg==, done]
    ]
    

    コード内の変数の値を使用して何もしていないことに注意してください。decodeしたがって、2番目の要素は、ファイルから読み取られるその値のBase64表現です。

于 2013-02-01T16:27:02.557 に答える