我使用的是微软操作系统。下面是我的代码。这个是在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。
2条答案
按热度按时间klsxnrf11#
Android处理文件的方式与桌面JVM应用程序不同。您必须将文件打包到资源(
\app\src\main\res\raw
)或资产(\app\src\main\assets
)中,然后分别通过resources.openRawResource()
或assets.open()
检索它们。您将不会使用直接文件路径。您的本地目录不是安装在设备或模拟器上的打包应用的一部分。您只能获取InputStreams。文件:Resources和Assets
iyfjxgzm2#
字符串
多亏了这个https://www.geeksforgeeks.org/how-to-read-a-text-file-in-android/,它教会了我如何使用
InputStream
来读取文件。我想我需要将
InputStream
转换为FileInputStream
,因为它是抽象类。在C++中,我们永远不能使用抽象类,除非我们从那个抽象类继承了一个重写了适当函数的类。但这次在java/Kotlin中,我们可以直接做到这一点。