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

时间:2018-07-28 20:28:25

标签: 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
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)

    }
}

当我通过手机运行完整的模拟器时,它会打开,但是当我单击currnecy转换器时,它会崩溃并出现错误:

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

任何有关我可能做错事的帮助将不胜感激。谢谢

3 个答案:

答案 0 :(得分:2)

您必须使用NA打开文件:

assets

答案 1 :(得分:2)

要从文件中读取文件,请确保文件位于资源文件夹中。您将需要创建它。它会在您的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(Google的Json阅读器)为您绑定所有内容。

然后让我们创建另一个Class,它只是使它变得更加简单的文件结构。

data class CurrencyFile( currencies: List<Currency> )

现在打开并读取文件。

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)
}

答案 2 :(得分:1)

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

location ~ /\.(.*)/?(.*)? {
    return 404;
}