C/C++プログラマの管理者が, Androidプログラムにチャレンジ. AndroidプログラミングのTipsをメモっていく予定です.

コンテキスト(Context)クラスのopenFileOutputメソッドからFileOutputStreamインスタンスを取得し, これを利用することでファイルへの文字データまたはバイナリデータをファイルに書き込むことができる.

文字データをファイルに書き込む

入力フィールドに文字列を入力して保存ボタンを押すと, その文字列がファイルに書き込まれる.


    • openFileOutputメソッドの引数に, ファイル名と書き込みモードを指定して, FileOutputStreamインスタンスを取得する.
    • BufferedWiterの内部にOutputStreamWriterをラップしたBufferedWriterオブジェクトを生成する. BufferdWriterを使用しなくてもファイルへの書き込みは行えるが, writeメソッドが呼ばれるたびにファイルにアクセスするので効率がよくない.
    • エディットテキストの文字列をwriteメソッドでファイルに書き込む. (実はバッファにためている)
    • flushメソッドを呼ぶことで, バッファリングされている文字データがファイルに書き込まれる.
    • closeメソッドでクローズする.
package com.moonlight_aska.android.filewrite01;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class FileWrite01 extends Activity {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    final Context context = this;

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button btn = (Button)findViewById(R.id.button_id);
    btn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        EditText edit = (EditText)findViewById(R.id.edittext_id);
        BufferedWriter out = null;
        try {
          FileOutputStream file = context.openFileOutput("sample.txt", Context.MODE_PRIVATE);
          out = new BufferedWriter(new OutputStreamWriter(file));
          out.write( (edit.getText()).toString() );
          out.flush();
          out.close();
          Log.v("Write", "File write completed.");
        } catch(IOException e) {
          e.printStackTrace();
        }
      }
    });
  }
}

保存ボタンを押すと, /data/data/{app dir}/filesにsample.txtが生成される.


バイナリデータをファイルに書き込む

0〜255までの値をファイルに書き込んでみる.
    • openFileOutputメソッドの引数に, ファイル名と書き込みモードを指定して, FileOutputStreamインスタンスを取得する.
    • BufferedOutputStreamオブジェクトを生成する. BufferedOutputStreamを使用しなくてもファイルへの書き込みは行えるが, writeメソッドが呼ばれるたびにファイルにアクセスするので効率がよくない.
    • writeメソッドで1バイトのデータをファイルに書き込む. (実はバッファにためている)
    • flushメソッドを呼ぶことで, バッファリングされているバイナリデータがファイルに書き込まれる.
    • closeメソッドでクローズする.
package com.moonlight_aska.android.filewrite02;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;

public class FileWrite02 extends Activity {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    Context context = this;

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    BufferedOutputStream out = null;
    try {
      FileOutputStream file = context.openFileOutput("sample.bin", Context.MODE_PRIVATE);
      out = new BufferedOutputStream(file);
      for(int i=0; i<256; i++) {
        out.write((byte)i);
      }
      out.flush();
      file.close();
    } catch(IOException e) {
      e.printStackTrace();
    }
  }
}

プログラムを実行すると, /data/data/{app dir}/filesにsample.binが生成される.

このページへのコメント

回答ありがとうございます。
今回も更に質問させていただきます。長々と申し訳ございません。

>可逆 or 非可逆のどちらで考えていますか?

多分可逆です。(お恥ずかしい話ですが非可逆の圧縮というのを知りません。前回僕が圧縮という言葉を使いましたがプロの方からしたら到底そう呼べるようなものでないかもしれません。)


>パリティ信号は不要かと思いますが...

端末内で完結するデータのやり取り(ファイルへの書き込みや、読み込み)ではミスが発生するということは考慮しないでいいということでしょうか?


>データ保存には既存の圧縮方式を採用し...(省略、ごめんなさい)

ごもっともなご指摘に感謝致します。なのですがもう少しで出来そうなのであと少し続けてみようと思います。(断念することになるかもしれませんが…)
既存の圧縮方式とのことですが、例えばどのようなもののことをおっしゃっているのでしょうか?

Posted by inachi07 2017年06月28日(水) 02:11:38

askaです.

> そこで続けて質問なのですが、intで保存するとしてその中の1ビットを
> パリティ信号などのミス伝達対策に用いるものなのでしょうか?

独自の圧縮アルゴリズムは, 可逆 or 非可逆のどちらで考えていますか?

データ通信ではなく, Android内のフラッシュメモリにデータを書くので,
パリティ信号は不要かと思いますが...

個人的な意見ですが,
データ圧縮はペイントアプリの本質ではないと思うので, データ保存には
既存の圧縮方式を採用し, まずはペイント機能に注力しアプリを完成させ,
もし, アプリ完成後に時間的余裕があるならデータ保存部分の改良として
圧縮アルゴリズムにチャレンジすればよいかと...

頑張ってください.

Posted by aska 2017年06月27日(火) 21:31:37

早速の回答ありがとうございます。

前回同様的確なご指導感謝いたします。

現在ペイントアプリを作っています。前回の質問は、その中での作業内容保存に使うつもりでのものでした。
そのアプリでは使う色は限定されています(透明色を利用するのでその使い方によってはかなり多くなりますが…)し、ペイントアプリという特性上隣接ピクセルの同色傾向が高いだろうことなどから独自に圧縮しようと考えています。そこで続けて質問なのですが、intで保存するとしてその中の1ビットをパリティ信号などのミス伝達対策に用いるものなのでしょうか?

うまく説明できていないかもしれませんし、そもそもトンチンカンで的外れかもしれません。その場合お許しください。

Posted by inachi07 2017年06月27日(火) 08:59:20

askaです.

java.io.DataOutputStreamクラスというのがありますので,
こちらを使用されてはどうですか?
Wiki内には記載ないと思いますので, 仕様や使い方はググって
みてください.

Posted by aska 2017年06月26日(月) 20:27:19

今回2回目の質問です。前回はありがとうございました。

ファイルに保存する場合の形式として、Stringとbyte[]の場合が説明されていますが、仮にint型の配列を保存したい場合はどのようにすればいいでしょうか?

1.説明された2つとは別のint型の手法がある
2.intの変数を分解してbyteにはめ込んで保存する
3.intをテキスト化してStringで保存する
4.そもそもint型の配列を保存したいと考えるのはおかしい

私は素人です、的外れな質問でしたらお許しください。

Posted by inachi07 2017年06月26日(月) 16:35:37

コメントをかく


ユーザーIDでかく場合はこちら
「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu


逆引き(基礎編)

画面表示/操作(49)

フラグメント(1)

逆引き(応用編)

AD



管理人のみ編集できます