ウェブアプリケーション,インジェクション,コマンドインジェクション

Androidアプリ開発 データを持続させる

データディレクトリにファイルを保存

Saving Files to the Data Directory

もし保持したいデータがキー/値のペアでうまく表現されてなかったら、
そして、ファイルとしてファイルシステムにそのディレクトリを
保存をするプリミティブメソッドを使いたいかもしれません。
このオプションは長い文字列のテキストやバイナリデータの保存に
役立ちます。
保存していくファイルを作るためには、openFileOutput()メソッドを
使うことができ、ファイル名やファイルを開くときのモードを指定したり
できます。
このメソッドはFileOutputStreamオブジェクトを返してきます。

package net.learn2develop.files;

import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity{
  @Override
  public void onCreate(Bundle savedInstanceState){
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);

   //---writing to files---
   try{
    FileOutputStream fOut = openFileOutput(
      textfile.txt", MODE_PRIVATE);
   }catch (IOException ioe){
    ioe.printStackTrace();
   }
  }
}

バイトラインをファイルに書くためには、OutputStreamWriterクラスを
使い、write()メソッドを使い文字列をファイルに書き込みます。
変更をファイルに保存するには、close()メソッドを使います。

package net.learn2develop.files;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity{
  @Override
  public void onCreate(Bundle savedInstanceState){
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);

   //---writing to files---
   try{
    FileOutputStream fOut = openFileOutput("textfile.txt", MODE_PRIVATE);
    OutputStreamWriter osw = new OutputStreamWriter(fOut);
    //---write the string to the file---
    osw.write("書き込みたい文字列を入れます");
    osw.close();

    //---display file saved message---
    Toast.makeText(getBaseContext(), "File saved successfully",
        Toast.LENGTH_SHORT).show();
   }catch(IOException ioe){
    ioe.printStackTrace();
   }
  }
}

ファイルが作られたときに、
そのファイルは/data/data/<パッケージ名>/filesフォルダに
保存されていきます。


ちょっと注釈

filesフォルダに保存されているファイルは永続的です。
これらのファイルは、明らかに削除しない限り残ります。


同じように、openFileInput()メソッドをファイルを読み込み用として
開くのに使います。このopenFileInput()メソッドは
FileInputStreamオブジェクトを返し、このオブジェクトを
読み込み用にInputStreamReaderオブジェクトに渡すことができます。

package net.learn2develop.files;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity{
  @Override
  public void onCreate(Bundle savedInstanceState){
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);

   //---writing to files---
   try{
    FileOutputStream fOut = openFileOutput("textfile.txt", MODE_PRIVATE);
    OutputStreamWriter osw = new OutputStreamWriter(fOut);
    //---write the string to the file---
    osw.write("書き込みたい文字列を入力します");
    osw.close();

    //---display file saved message---
    Toast.makeText(getBaseContext(), "File saved successfully",
        Toast.LENGTH_SHORT).show();
   }catch(IOException ioe){
    ioe.printStackTrace();
   }

   //---reading from files---
   try{
    FileInputStream fIn = openFileInput("textfile.txt");
    InputStreamReader isr = new InputStreamReader(fIn);
   }catch (IOException ioe){
    ioe.printStackTrace();
   }
  }
}

ファイルから読み込まれる文字がどのくらいあるかを知る必要がないのは、
InputStreamReaderオブジェクトからread()メソッドを使い、
100バイトのブロックで文字を読み込むためです。
この100バイトという量は開発者に意味のある値に変更可能です。
このread()メソッドは読み込まれた文字数を返し、
文字が読み込まれなくなるまで読み込みを続けます。
読み込み終了は、”-1”がファイルの最後にあるためわかります。


この例では、100バイトのブロックでファイルから読み込みました。
これを1000バイトにしたらどうなるのか?
また、50バイトに減らしたら?
どちらも間違いなく動作しますが、ブロックのサイズは
ファイルのサイズで大まかに決定します。
もし大きなファイルをいつも使うようなら、ループを使って
繰り返しごとに、バイト量を追加するようにして全体の読み込み
バイト量を大きくするのもいいかもしれません。
ほかの方法としては、バッファ用にメモリの予約ができてから
大きなブロックサイズでさらにメモリも取れます。
一般的には、ブロックサイズを8Kバイト位に上げるのが妥当です。


package net.learn2develop.files;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity{
  static final int READ_BLOCK_SIZE = 100;
  @Override
  public void onCreate(Bundle savedInstanceState){
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activiy_main);

   //---writing to files---
   try{
    FileOutputStream fOut = openFileOutput("textfile.txt", MODE_PRIVATE);
    OutputStreamWriter osw = new OutputStreamWriter(fOut);

    //---write the string to the file---
    osw.write("書き込みたい文字列を入れます。");
    osw.close();

    //---display fole saved message---
    Toast.makeText(getBaseContext(), "File saved successfully",
        Toast.LENGTH_SHORT).show();
   }catch(IOException ioe){
    ioe.printStackTrace();
   }

   //---reading from files---
   try{
    FileInputStream fIn = openFileInput("textfile.txt");
    InputStreamReader isr = new InputStreamReader(fIn);

    char[] inputBuffer = new char[READ_BLOCK_SIZE];
    String s = "";
    int charRead;
    while ((charRead = isr.read(inputBuffer)) > 0){
     //---convert the chars to a String---
     String readString = String.copyValue Of(inputBuffer, 0, charRead);
     s += readString;
     inputBuffer = new char[READ_BLOCK_SIZE];
    }
    isr.close();

    Toase.makeText(getBaseContext(), "File loaded successfully" + s,
        Toast.LENGTH_SHORT).show();
    }catch(IOException ioe){
     ioe.printStackTrace();
    }
   }
}

ちょっと注釈

/data/data/<パッケージ名>フォルダは、ユーザが
アプリケーションをアンインストールすればフォルダ全体が削除されます。


ホーム
便利堂ロゴ
inserted by FC2 system