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が生成される.

このページへのコメント

訂正です。
自分で作った圧縮は大幅に負け越していました。
お恥ずかしい限りです。
PNGの方を使わせていただきます。

初歩的な質問の数々であるにも関わらず、ご丁寧な対応心よりお礼申し上げます。ありがとうございました。

0
Posted by inachi07 2017年06月29日(木) 13:51:35 返信

毎回のご回答ありがとうございます。
分かりやすい解説には感動さえしてしまいます。

BitmapからJPGへ変換したことはありましたが、同じ形でPNGにもできることは知りませんでした。
教えていただいたことに感謝いたします。

早速PNGを試しました。出来上がった自分の手法と比べるとほぼ同じだったり時々勝ったりします。エラーが怖いしPNGを使ったほうが無難かとも思います。

僕の質問はあきれるくらいに簡単であっただろうに大変丁寧にお答えいただいたことに重ねてお礼申し上げます。

0
Posted by inachi07 2017年06月28日(水) 23:41:36 返信

askaです.

・可逆圧縮:圧縮前のデータと、圧縮・展開を経たデータが完全に
 等しくなるデータ圧縮(例:Deflate)
・非可逆:圧縮前のデータと、圧縮・展開を経たデータとが完全には一致しないデータ圧縮(例:jpeg)

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

考えなくていいと思います.

> 既存の圧縮方式とのことですが、例えばどのようなもののことを
> おっしゃっているのでしょうか?

画像データを保存するのであれば, BitmapからPNG形式に変換して
保存すればよいです. (PNGはDeflate圧縮アルゴリズムを使用)

0
Posted by aska 2017年06月28日(水) 22:07:07 返信

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

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

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


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

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


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

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

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

askaです.

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

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

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

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

頑張ってください.

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

コメントをかく


「http://」を含む投稿は禁止されています。

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

Menu


逆引き(基礎編)

画面表示/操作(49)

フラグメント(1)

逆引き(応用編)

Firebase(2)

AD



管理人/副管理人のみ編集できます