Android 在尝试读取文件时,我不断得到java.io.FileNotFoundException

Android 在尝试读取文件时,我不断得到java.io.FileNotFoundException,android,android-studio,kotlin,Android,Android Studio,Kotlin,我是Android开发和Kotlin的新手,所以作为一个项目,我想在Android Studio中制作一个货币转换器。为此,我在资产文件夹中保存了一个货币列表文件,我想读取该文件并将其内容放入微调器。这是我的密码: import android.support.v7.app.AppCompatActivity import android.os.Bundle import android.widget.ArrayAdapter import android.widget.Spinner impo

我是Android开发和Kotlin的新手,所以作为一个项目,我想在Android Studio中制作一个货币转换器。为此,我在资产文件夹中保存了一个货币列表文件,我想读取该文件并将其内容放入微调器。这是我的密码:

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.ArrayAdapter
import android.widget.Spinner
import java.io.File
import java.io.InputStream
import java.util.*

class currency_converter : AppCompatActivity() {
    lateinit var currency_1: Spinner
    lateinit var currency_2: Spinner

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_currency_converter)


        val inputStream: InputStream = File("currency_list.txt").inputStream()
        val currency_list = mutableListOf<String>()

        inputStream.bufferedReader().useLines { lines -> lines.forEach { currency_list.add(it) } }

        currency_1 = findViewById(R.id.currency_1) as Spinner
        currency_2 = findViewById(R.id.currency_2) as Spinner

        currency_1.adapter = ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, currency_list)
        currency_2.adapter = ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, currency_list)

    }
}
导入android.support.v7.app.app活动
导入android.os.Bundle
导入android.widget.ArrayAdapter
导入android.widget.Spinner
导入java.io.xml文件
导入java.io.InputStream
导入java.util*
类货币\u转换器:AppCompatActivity(){
lateinit var currency_1:微调器
lateinit var currency_2:微调器
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity\u currency\u转换器)
val inputStream:inputStream=File(“currency_list.txt”).inputStream()
val currency_list=mutableListOf()
inputStream.bufferedReader()
currency_1=作为微调器的findViewById(R.id.currency_1)
currency_2=作为微调器的findViewById(R.id.currency_2)
currency_1.adapter=ArrayAdapter(这是android.R.layout.simple_list_项目_1,currency_list)
currency_2.adapter=ArrayAdapter(这是android.R.layout.simple_list_项_1,currency_列表)
}
}
当我通过手机运行完整的emulator时,它会打开,但当我单击Currency converter时,它会崩溃,并出现错误:

java.io.FileNotFoundException:currency_list.txt(无此类文件或目录)


任何关于我可能做错什么的帮助都将不胜感激。谢谢

您必须使用
资产
打开文件:

val inputStream: InputStream = assets.open("currency_list.txt")

您可以直接从应用程序访问资产:

 val currencies = "currency_list.txt" 
val currenciesString = application.assets.open(currencies).bufferedReader().use{ it.readText() }

要读取文件,请确保您的文件位于资产文件夹中。您将需要创建这个。它将位于java和res文件夹的旁边

assets/my_file.json
java/...
res/...
现在,我还建议对您试图读取的任何文件使用json。这会让它更快,也会让你更容易

你会有一个类似这样的文件。其中有一个对象数组(方括号)(花括号)。然后,您可以创建对象,就像在代码中设置对象一样

{
    "currencies": [
        {
            "name": "USD",
            "value": 1.0
        },
        {
            "name": "CAD",
            "value": 0.65
        }, 
        {
            "name": "AUS",
            "value": 1.22
        }

        // any more currencies
    ]

    // anything else you want to store
}
然后您可以为您的货币创建一个类

data class Currency( val name: String, val value: Float )
请注意名称是如何相同的,并且使用Gson(谷歌的Json阅读器),它将为您绑定所有内容

让我们创建另一个类,它只是文件结构,使它更容易

data class CurrencyFile( currencies: List<Currency> )

您将文件放在哪里?在资产文件夹中。在Java文件夹和res文件夹之间
fun getCurrencyFile(context: Context) : CurrencyFile {
        val stream = context.assets.open("my_file.json")

        val size = stream.available()
        val buffer = ByteArray(size)

        stream.read(buffer)
        stream.close()

        return fromJson(String(buffer), CurrencyFile::class.java)
}