为什么Java函数在Android Studio中不起作用,但可以在IntelliJ Idea中使用Kotlin语言和Gradle脚本

holgip5t  于 2023-08-03  发布在  Java
关注(0)|答案(2)|浏览(93)

我使用的是微软操作系统。下面是我的代码。这个是在android studio上写的。这里我使用${project_name}\app\src\main\res作为resources root目录。我对下面声明的两个类使用相同的包。

import java.nio.charset.Charset
import java.nio.file.Files
import java.nio.file.Paths

class Parser(fileName:String){
     val fileName=fileName
     val fileContent=getContent()

fun getContent():String{
    val encoded= Files.readAllBytes(Paths.get(".",fileName))
    //here relative path is the `res` folder in android studio 
    return String(encoded, Charset.defaultCharset())
    }
}

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val parser=Parser("default.vert")
    findViewById<TextView>(R.id.tv_test).also {
        it.text=parser.fileContent
        }
    }
}

字符串
它说:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.MainActivity}: java.nio.file.NoSuchFileException: ./default.vert
但是在intellij idea社区版中:
基本上使用了相同的代码,但文件路径略有不同,因为我将其中一个文件夹标记为默认的resources root目录:

import java.nio.charset.Charset
import java.nio.file.Files
import java.nio.file.Paths

class Parser(fileName:String){
    val fileName=fileName
    val fileContent=getContent()
    fun getContent():String{
        val encoded= 
        Files.readAllBytes(Paths.get(".","src","main","resources",fileName))
        //here I used the most top level directory (maybe the scientific term is `root` 
        //but I am not sure)in the project which was named `Test`.
        return String(encoded, Charset.defaultCharset())
        }
    }

fun main(){
    val parser=Parser("test.vert")
    print(parser.fileContent)
}


然后打印内容:

layout (location=0) in vec4 vPosition;

void main(){
    gl_Position=vPosition;
}

如何让代码也在Android Studio中运行?使用Kotlin

我也尝试过绝对路径,例如:c:\\users\\${user_name}\\..until_the_file\\default.vert但仍然从android studio获得exception fileNotFoundException。

klsxnrf1

klsxnrf11#

Android处理文件的方式与桌面JVM应用程序不同。您必须将文件打包到资源(\app\src\main\res\raw)或资产(\app\src\main\assets)中,然后分别通过resources.openRawResource()assets.open()检索它们。您将不会使用直接文件路径。您的本地目录不是安装在设备或模拟器上的打包应用的一部分。您只能获取InputStreams。
文件:ResourcesAssets

iyfjxgzm

iyfjxgzm2#

import android.content.Context

class Program(val context: Context, val id:Int){
    val fileContent=getContent()

    private fun getContent(): String {
        try {
            val input = context.resources.openRawResource(id)
            val size=input.available()
            val buffer=ByteArray(size)
            input.read(buffer)
            input.close()
            return String(buffer,Charsets.UTF_8)
        }
        catch(e:Exception){
            e.printStackTrace()
            return ""
        } 
    }
}

字符串
多亏了这个https://www.geeksforgeeks.org/how-to-read-a-text-file-in-android/,它教会了我如何使用InputStream来读取文件。
我想我需要将InputStream转换为FileInputStream,因为它是抽象类。在C++中,我们永远不能使用抽象类,除非我们从那个抽象类继承了一个重写了适当函数的类。
但这次在java/Kotlin中,我们可以直接做到这一点。

相关问题