AndroidのFileOutputStreamとopenFileOutput()の違い



Difference Between Androids Fileoutputstream



転送元:http://www.cnblogs.com/elleniou/archive/2012/05/17/2505630.html
openFileOutput()


まず、ファイルを使用してデータを保存する方法を紹介します。アクティビティは、データをファイルに出力するために使用できるopenFileOutput()メソッドを提供します。特定の実装プロセスは、J2SE環境のファイルにデータを保存することと同じです。

public void save()
{{
{を試してください
FileOutputStream outStream = this.openFileOutput(“ a.txt”、Context.MODE_WORLD_READABLE)
outStream.write(text.getText()。toString()。getBytes())
outStream.close()
Toast.makeText(MyActivity.this、” Saved”、Toast.LENGTH_LONG).show()
} catch(FileNotFoundException e){
戻る
}
キャッチ(IOException e){
戻る
}
}



openFileOutput()メソッドの最初のパラメーターは、ファイル名を指定するために使用されます。パス区切り文字「/」を含めることはできません。ファイルが存在しない場合、Androidは自動的にファイルを作成します。作成されたファイルは/ data / data // filesディレクトリに保存されます。例:/data/data/cn.itcast.action/files/itcast.txt [Eclipse]メニューの[ウィンドウ]-[ビューの表示]-をクリックします。 [その他]、ダイアログウィンドウでandroidフォルダーを展開し、下のファイルエクスプローラービューを選択してから、ファイルエクスプローラービューで/ data / data // filesディレクトリを展開してファイルを表示します。
openFileOutput()メソッドの2番目のパラメーターは、操作モードを指定するために使用されます。次の4つのモードがあります。Context.MODE_PRIVATE= 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
Context.MODE_PRIVATE:はデフォルトの操作モードです。つまり、ファイルはプライベートデータであり、アプリケーション自体からのみアクセスできます。このモードでは、新しく書き込まれたコンテンツをファイル内の元のコンテンツに追加する場合、書き込まれたコンテンツは元のファイルのコンテンツを上書きします。 Context.MODE_APPENDを使用できます
Context.MODE_APPEND:モードはファイルが存在するかどうかをチェックします。存在する場合はコンテンツをファイルに追加し、存在しない場合は新しいファイルを作成します。
Context.MODE_WORLD_READABLEおよびContext.MODE_WORLD_WRITEABLEは、他のアプリケーションがファイルの読み取りおよび書き込みのアクセス許可を持っているかどうかを制御するために使用されます。
MODE_WORLD_READABLE:現在のファイルを他のアプリケーションで読み取ることができることを示しますMODE_WORLD_WRITEABLE:現在のファイルを他のアプリケーションで書き込むことができることを示します。
ファイルを他のアプリケーションで読み書きできるようにする場合は、次のものを渡すことができます。
openFileOutput(“ itcast.txt”、Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE)

Androidには独自のセキュリティモデルがあります。アプリケーション(.apk)がインストールされると、システムは彼にユーザーIDを割り当てます。アプリケーションがファイルなどの他のリソースにアクセスする場合は、ユーザーIDの照合が必要です。デフォルトでは、アプリケーションで作成されたファイル、共有設定、およびデータベースはプライベート(/ data / data // filesにあります)である必要があり、他のプログラムからアクセスすることはできません。作成時にContext.MODE_WORLD_READABLEまたはContext.MODE_WORLD_WRITEABLEが指定されていない限り、他のプログラムのみが正しくアクセスできます。
ファイルの内容を読む



public void load()
{{
{を試してください
FileInputStream inStream = this.openFileInput(“ a.txt”)
ByteArrayOutputStream stream = new ByteArrayOutputStream()
バイト[]バッファ=新しいバイト[1024]
int length = -1
while((length = inStream.read(buffer))!=-1){
stream.write(buffer、0、length)
}
stream.close()
inStream.close()
text.setText(stream.toString())
Toast.makeText(MyActivity.this、” Loaded”、Toast.LENGTH_LONG).show()
} catch(FileNotFoundException e){
e.printStackTrace()
}
キャッチ(IOException e){
戻る
}
}



プライベートファイルには、ファイルを作成したアプリケーションからのみアクセスできます。ファイルを他のアプリケーションで読み書きできるようにする場合は、ファイルの作成時にContext.MODE_WORLD_READABLEおよびContext.MODE_WORLD_WRITEABLE権限を指定できます。
アクティビティは、getCacheDir()メソッドとgetFilesDir()メソッドも提供します。
getCacheDir()メソッドは、/ data / data // cacheディレクトリを取得するために使用されます。
getFilesDir()メソッドは、/ data / data // filesディレクトリを取得するために使用されます。



ファイルをSDカードに入れます



アクティビティのopenFileOutput()メソッドを使用してファイルを保存します。ファイルは電話スペースに保存されます。一般的に、携帯電話の収納スペースはそれほど大きくありません。いくつかの小さなファイルを保存しても問題ありません。ビデオのような大きなファイルを保存したい場合、それは実行可能ではありません。ビデオのような大きなファイルの場合、SDカードに保存できます。 SDカードは何をしますか?あなたはそれをモバイルハードドライブまたはUSBスティックと考えることができます。

エミュレータでSDCardを使用するには、SDCardカードを作成する必要があります(もちろん、SDCardではなく画像ファイルのみ)。 SDカードの作成は、Eclipse作成エミュレーターを使用して作成するか、次のようにDOSコマンドを使用して作成できます。

Dosウィンドウで、android SDKインストールパスのtoolsディレクトリを入力し、次のコマンドを入力して2G SDCardを作成します。ファイルのサフィックスは簡単に取得できます。.imgを使用することをお勧めします:

mksdcard 2048M D: AndroidTool sdcard.img

プログラムでSDカードにアクセスするには、SDカードへのアクセスを申請する必要があります。

AndroidManifest.xmlでSDカードにアクセスするための権限は次のとおりです。











ファイルをSDCardに保存するには、プログラムはまず、電話機にSDCardが装備されており、読み取りと書き込みができるかどうかを判断する必要があります。

注:SDCardへのアクセスには、AndroidManifest.xmlのSDCardへのアクセスが含まれている必要があります

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

File sdCardDir = Environment.getExternalStorageDirectory()//Get the SDCard directory

File saveFile = new File(sdCardDir, “a.txt”)


FileOutputStream outStream = new FileOutputStream(saveFile)

outStream.write(“test”.getBytes())

outStream.close()

}


Environment.getExternalStorageState()メソッドは、SDカードの状態を取得するために使用されます。電話機にSDカードが装備されており、読み取りまたは書き込みが可能な場合、メソッドはEnvironment.MEDIA_MOUNTEDと等しいステータスを返します。

Environment.getExternalStorageDirectory()メソッドは、SDCardディレクトリを取得するために使用されます。もちろん、SDCardディレクトリを取得するには、次のように書くこともできます。

File sdCardDir = new File( '/ sdcard')// SDCardディレクトリを取得します

ファイルsaveFile = new File(sdCardDir、“ itcast.txt”)

//上記の2行のコードを1つの文に組み合わせることができます:File saveFile = new File( '/ sdcard / a.txt')

FileOutputStream outStream = new FileOutputStream(saveFile)

outStream.write(“test”.getBytes())

outStream.close()

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

public void button(View view){
Person p = new Person()
p.setAge(10)
p.setName('Lee')

saveObject(p, 'MainActivity.dat')
}

public void button2(View view){
Person p = (Person) readObject('MainActivity.dat')
System.out.println(p.getAge())
}

public boolean saveObject(Serializable ser, String file) {
FileOutputStream fos = null
ObjectOutputStream oos = null
try{
fos = openFileOutput(file, MODE_PRIVATE)
oos = new ObjectOutputStream(fos)
oos.writeObject(ser)
oos.flush()
return true
}catch(Exception e){
e.printStackTrace()
return false
}finally{
try {
oos.close()
} catch (Exception e) {}
try {
fos.close()
} catch (Exception e) {}
}
}

/**
* Read object
* @param file
* @return
* @throws IOException
*/
public Serializable readObject(String file){
FileInputStream fis = null
ObjectInputStream ois = null
try{
fis = openFileInput(file)
ois = new ObjectInputStream(fis)
return (Serializable)ois.readObject()
}catch(FileNotFoundException e){
}catch(Exception e){
e.printStackTrace()
//Deserialization failed - delete cache file
if(e instanceof InvalidClassException){
File data = getFileStreamPath(file)
data.delete()
}
}finally{
try {
ois.close()
} catch (Exception e) {}
try {
fis.close()
} catch (Exception e) {}
}
return null
}


}

class Person implements Serializable{
int age
String name
public int getAge() {
return age
}
public void setAge(int age) {
this.age = age
}
public String getName() {
return name
}
public void setName(String name) {
this.name = name
}
}