Внутреннее хранилище Android — это память устройства, в которой мы храним файлы. Файл, хранящийся во внутренней памяти, по умолчанию является приватным, и доступ к нему имеет только одно и то же приложение. Доступ к ним извне приложения невозможен.
Для чтения и записи данных из (в) файла Android предоставляет методы openFileInput() и openFileOutput() соответственно.
Когда пользователи удаляют свое приложение с устройства, его файл внутреннего хранилища также будет удален.
- Запись в файл во внутренней памяти
- Чтение содержимого файла из внутренней памяти
- Пример чтения и записи в файл во внутреннюю память
- Activity_main.xml
- MainActivity.kt
- Внешнее хранилище
- Запись в файл во внешнем хранилище
- Чтение содержимого файла
- Разрешение на доступ
- Kotlin Android: пример чтения и записи данных в файл во внешнее хранилище
- Activity_main.xml
- MainActivity.kt
- AndroidManifest.xml
Запись в файл во внутренней памяти
Для записи файла во внутреннюю память устройства пакет java.io предлагает метод openFileOutput(), который возвращает экземпляр класса FileOutputStream. Чтобы записать данные в файл, вызовите метод FileOutputStream .write().
val file:String = fileName.text.toString()
val data:String = fileData.text.toString()
val fileOutputStream:FileOutputStream
try {
fileOutputStream = openFileOutput(file, Context.MODE_PRIVATE)
fileOutputStream.write(data.toByteArray())
}catch(e: Exception){
e.printStackTrace()
}
Чтение содержимого файла из внутренней памяти
Для чтения файла из внутренней памяти устройства пакет java.io предлагает метод openFileInput(), который возвращает экземпляр класса FileInputStream. Чтобы прочитать данные из файла, вызовите BufferedReader().readLine().
var fileInputStream: FileInputStream? = null
fileInputStream = openFileInput(filename)
var inputStreamReader: InputStreamReader = InputStreamReader(fileInputStream)
val bufferedReader: BufferedReader = BufferedReader(inputStreamReader)
val stringBuilder: StringBuilder = StringBuilder()
var text: String? = null
while({ text = bufferedReader.readLine(); text }() != null) {
stringBuilder.append(text)
}
//Displaying data on EditText
fileData.setText(stringBuilder.toString()).toString()
Пример чтения и записи в файл во внутреннюю память
В этом примере мы будем записывать данные в файл во внутреннюю память и читать то же содержимое файла из внутренней памяти.
Activity_main.xml
Добавьте следующий код в файл activity_main.xml. В этот файл добавьте два элемента EditText для ввода имени файла, содержимого файла и две кнопки для сохранения и просмотра содержимого файла.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="example.javatpoint.com.kotlininternalstoragereadwrite.MainActivity"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_alignParentTop="true" android:layout_marginLeft="31dp" android:layout_marginStart="31dp" android:layout_marginTop="117dp" android:text="File Name" android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"/> <EditText android:id="@+id/editFile" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/textView" android:layout_alignBottom="@+id/textView" android:layout_alignLeft="@+id/btnSave" android:layout_alignStart="@+id/btnSave" android:layout_marginLeft="31dp" android:layout_marginStart="31dp" android:ems="10" android:paddingLeft="10dp" android:inputType="textPersonName" android:hint="file name" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignEnd="@+id/textView" android:layout_alignRight="@+id/textView" android:layout_below="@+id/textView" android:layout_marginTop="67dp" android:text="File Data" android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"/> <EditText android:id="@+id/editData" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/textView2" android:layout_alignBottom="@+id/textView2" android:layout_alignLeft="@+id/editFile" android:layout_alignStart="@+id/editFile" android:ems="10" android:lines="5" android:hint="data" /> <Button android:id="@+id/btnSave" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView2" android:layout_alignParentBottom="true" android:layout_alignStart="@+id/textView2" android:layout_marginBottom="53dp" android:layout_marginLeft="49dp" android:layout_marginStart="49dp" android:text="Save" /> <Button android:id="@+id/btnView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignEnd="@+id/editData" android:layout_alignRight="@+id/editData" android:layout_alignTop="@+id/btnSave" android:layout_marginEnd="33dp" android:layout_marginRight="33dp" android:text="View" /> </RelativeLayout>
MainActivity.kt
Добавьте следующий код в класс MainActivity.kt. В этом классе мы сохраняем имя файла и данные во внутренней памяти, нажимая кнопку сохранения, и извлекаем содержимое файла, нажимая кнопку просмотра.
package example.javatpoint.com.kotlininternalstoragereadwrite
import android.content.Context
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import java.io.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val fileName = findViewById<EditText>(R.id.editFile)
val fileData = findViewById<EditText>(R.id.editData)
val btnSave = findViewById<Button>(R.id.btnSave)
val btnView = findViewById<Button>(R.id.btnView)
btnSave.setOnClickListener(View.OnClickListener {
val file:String = fileName.text.toString()
val data:String = fileData.text.toString()
val fileOutputStream:FileOutputStream
try {
fileOutputStream = openFileOutput(file, Context.MODE_PRIVATE)
fileOutputStream.write(data.toByteArray())
} catch (e: FileNotFoundException){
e.printStackTrace()
}catch (e: NumberFormatException){
e.printStackTrace()
}catch (e: IOException){
e.printStackTrace()
}catch (e: Exception){
e.printStackTrace()
}
Toast.makeText(applicationContext,"data save",Toast.LENGTH_LONG).show()
fileName.text.clear()
fileData.text.clear()
})
btnView.setOnClickListener(View.OnClickListener {
val filename = fileName.text.toString()
if(filename.toString()!=null && filename.toString().trim()!=""){
var fileInputStream: FileInputStream? = null
fileInputStream = openFileInput(filename)
var inputStreamReader: InputStreamReader = InputStreamReader(fileInputStream)
val bufferedReader: BufferedReader = BufferedReader(inputStreamReader)
val stringBuilder: StringBuilder = StringBuilder()
var text: String? = null
while ({ text = bufferedReader.readLine(); text }() != null) {
stringBuilder.append(text)
}
//Displaying data on EditText
fileData.setText(stringBuilder.toString()).toString()
}else{
Toast.makeText(applicationContext,"file name cannot be blank",Toast.LENGTH_LONG).show()
}
})
}
}
Выход:





Внешнее хранилище
Внешнее хранилище Android Kotlin — это пространство памяти, в котором мы выполняем операции чтения и записи. Файлы во внешнем хранилище хранятся в папке /sdcard или /storage и т. д. Файлы, сохраненные во внешнем хранилище, доступны для чтения и могут быть изменены пользователем.
Прежде чем получить доступ к файлу во внешнем хранилище в приложении, мы должны проверить доступность внешнего хранилища в нашем устройстве.
Запись в файл во внешнем хранилище
Пакет java.io предлагает метод openFileOutput(), который возвращает экземпляр класса FileOutputStream для записи файла во внешнее хранилище устройства. Чтобы получить каталог, который используется только вашим приложением, вызовите getExternalFilesDir(). Чтобы записать данные в файл, вызовите метод FileOutputStream .write().
var myExternalFile:File = File(getExternalFilesDir(filepath),fileName)
try {
val fileOutPutStream = FileOutputStream(myExternalFile)
fileOutPutStream.write(fileContent.toByteArray())
fileOutPutStream.close()
} catch(e: IOException) {
e.printStackTrace()
}
Чтение содержимого файла
Пакет java.io предлагает метод openFileInput(), который возвращает экземпляр класса FileInputStream и считывает файл из внешнего хранилища устройства. Чтобы прочитать данные из файла в Котлин, вызовите BufferedReader().readLine().
var myExternalFile:File = File(getExternalFilesDir(filepath), fileName)
val filename = fileName.text.toString()
myExternalFile = File(getExternalFilesDir(filepath),filename)
var fileInputStream =FileInputStream(myExternalFile)
var inputStreamReader: InputStreamReader = InputStreamReader(fileInputStream)
val bufferedReader: BufferedReader = BufferedReader(inputStreamReader)
val stringBuilder: StringBuilder = StringBuilder()
var text: String? = null
while({ text = bufferedReader.readLine(); text }() != null) {
stringBuilder.append(text)
}
fileInputStream.close()
Разрешение на доступ
Добавьте следующее разрешение в файл AndroidManifest.xml.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Kotlin Android: пример чтения и записи данных в файл во внешнее хранилище
В этом примере мы будем записывать данные в файл во внешнее хранилище и читать то же содержимое файла из того же внешнего хранилища.
Activity_main.xml
Добавьте следующий код в файл activity_main.xml. В этот файл добавьте два элемента EditText для ввода имени файла, содержимого файла и две кнопки для сохранения и просмотра содержимого файла.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="example.javatpoint.com.kotlinexternalstoragereadwrite.MainActivity"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView2" android:layout_alignParentTop="true" android:layout_alignStart="@+id/textView2" android:layout_marginTop="68dp" android:text="File Name" android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.027" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.065" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/editTextData" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginBottom="36dp" android:layout_marginLeft="50dp" android:layout_marginStart="50dp" android:text="File Data" android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.027" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView" app:layout_constraintVertical_bias="0.167" /> <EditText android:id="@+id/editTextFile" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/editTextData" android:layout_alignStart="@+id/editTextData" android:layout_alignTop="@+id/textView" android:ems="10" android:inputType="none" /> <EditText android:id="@+id/editTextData" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" android:layout_below="@+id/editTextFile" android:layout_marginEnd="37dp" android:layout_marginRight="37dp" android:layout_marginTop="30dp" android:ems="10" android:inputType="none" android:lines="5" /> <Button android:id="@+id/button_save" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginBottom="68dp" android:layout_toLeftOf="@+id/editTextData" android:layout_toStartOf="@+id/editTextData" android:text="Save" /> <Button android:id="@+id/button_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/button_save" android:layout_alignEnd="@+id/editTextData" android:layout_alignRight="@+id/editTextData" android:layout_marginEnd="43dp" android:layout_marginRight="43dp" android:text="View" /> </RelativeLayout>
MainActivity.kt
Добавьте следующий код в класс MainActivity.kt. В этом классе мы сохраняем имя файла и данные во внешнем хранилище, нажимая кнопку сохранения, и извлекаем содержимое файла, нажимая кнопку просмотра.
package example.javatpoint.com.kotlinexternalstoragereadwrite
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import android.os.Environment
import java.io.*
class MainActivity : AppCompatActivity() {
private val filepath = "MyFileStorage"
internal var myExternalFile: File?=null
private val isExternalStorageReadOnly: Boolean get() {
val extStorageState = Environment.getExternalStorageState()
return if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState)) {
true
} else {
false
}
}
private val isExternalStorageAvailable: Boolean get() {
val extStorageState = Environment.getExternalStorageState()
return if (Environment.MEDIA_MOUNTED.equals(extStorageState)) {
true
} else{
false
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val fileName = findViewById(R.id.editTextFile) as EditText
val fileData = findViewById(R.id.editTextData) as EditText
val saveButton = findViewById<Button>(R.id.button_save) as Button
val viewButton = findViewById(R.id.button_view) as Button
saveButton.setOnClickListener(View.OnClickListener {
myExternalFile = File(getExternalFilesDir(filepath), fileName.text.toString())
try {
val fileOutPutStream = FileOutputStream(myExternalFile)
fileOutPutStream.write(fileData.text.toString().toByteArray())
fileOutPutStream.close()
} catch (e: IOException) {
e.printStackTrace()
}
Toast.makeText(applicationContext,"data save",Toast.LENGTH_SHORT).show()
})
viewButton.setOnClickListener(View.OnClickListener {
myExternalFile = File(getExternalFilesDir(filepath), fileName.text.toString())
val filename = fileName.text.toString()
myExternalFile = File(getExternalFilesDir(filepath),filename)
if(filename.toString()!=null && filename.toString().trim()!=""){
var fileInputStream =FileInputStream(myExternalFile)
var inputStreamReader: InputStreamReader = InputStreamReader(fileInputStream)
val bufferedReader: BufferedReader = BufferedReader(inputStreamReader)
val stringBuilder: StringBuilder = StringBuilder()
var text: String? = null
while ({ text = bufferedReader.readLine(); text }() != null) {
stringBuilder.append(text)
}
fileInputStream.close()
//Displaying data on EditText
Toast.makeText(applicationContext,stringBuilder.toString(),Toast.LENGTH_SHORT).show()
}
})
if (!isExternalStorageAvailable || isExternalStorageReadOnly) {
saveButton.isEnabled = false
}
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="example.javatpoint.com.kotlinexternalstoragereadwrite"> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Выход:




