Kotlin Android: Чтение и запись файла во внутренней и внешней памяти

Внутреннее хранилище Android — это память устройства, в которой мы храним файлы. Файл, хранящийся во внутренней памяти, по умолчанию является приватным, и доступ к нему имеет только одно и то же приложение. Доступ к ним извне приложения невозможен.

Для чтения и записи данных из (в) файла Android предоставляет методы openFileInput() и openFileOutput() соответственно.

Когда пользователи удаляют свое приложение с устройства, его файл внутреннего хранилища также будет удален.

Запись в файл во внутренней памяти

Для записи файла во внутреннюю память устройства пакет 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() 
} 
}) 

} 
}

Выход:

Kotlin Android Чтение и запись внутренней памяти
результат

Вывод 1
Вывод 2

Вывод 3

Внешнее хранилище

Внешнее хранилище 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> 

Выход:

ввод
ввод текста

указание файла
конечный результат

Оцените статью