android读取文件内容_Android在测试期间读取文本文件

android读取文件内容

学习Android开发 (Learning Android Development)

If you search on how can Android read a text file, you can find several solutions on Stackoverflow. However, they all need context to read the file either from res or asset folder.

如果您搜索Android如何读取文本文件,则可以在Stackoverflow上找到几种解决方案。 但是,它们都需要context来从resasset文件夹中读取文件。

// file store in /assets
val inputStream = context.assets.open("test.txt")// or file store in /res/raw
val inputStream = context.resources.openRawResource(R.raw.test)

In unit testing, we will like to avoid using context. With that, how can we read from a file?

在单元测试中,我们将避免使用context 。 这样,我们如何读取文件?

E.g. will be useful for doing Mock Web Service test as below

例如,对于进行如下所示的Mock Web Service测试将非常有用

Java classLoader来解救 (Java classLoader came to rescue)

Apparently we can read a file using classLoader

显然我们可以使用classLoader读取文件

val inputStream = javaClass.classLoader?.getResourceAsStream(fileName)

With this, we can read the file from the resources folder, without needing any Context.

这样,我们可以从resources文件夹中读取文件,而无需任何上下文。

Image for post

Below is the detail of how to read the file just to provide complete reference

下面是如何阅读文件的详细信息,仅提供完整的参考

读取JSON样式文件 (Reading JSON style file)

Assuming we just need to read JSON file, so we don’t care about the next line, then we can just use readLine()

假设我们只需要读取JSON文件,所以我们不在乎下一行,那么我们可以使用readLine()

@Throws(IOException::class)
fun readFileWithoutNewLineFromResources(fileName: String): String {
var inputStream: InputStream? = null
try {
inputStream =
javaClass.classLoader?.getResourceAsStream(fileName)
val builder = StringBuilder()
val reader = BufferedReader(InputStreamReader(inputStream))
var str: String? = reader.readLine()
while (str != null) {
builder.append(str)
str = reader.readLine()
}
return builder.toString()
} finally {
inputStream?.close()
}
}

This will exclude all \n, but it is good enough for some cases (e.g. JSON formated content).

这将排除所有\n ,但是在某些情况下(例如JSON格式的内容)就足够了。

读取所有字符串内容 (Reading All String Content)

If one would like to include all characters including \n, then we’ll need to use read() instead

如果要包含所有字符,包括\n ,那么我们需要使用read()代替

@Throws(IOException::class)
fun readFileWithNewLineFromResources(fileName: String): String {
var inputStream: InputStream? = null
try {
inputStream =
javaClass.classLoader?.getResourceAsStream(fileName)
val builder = StringBuilder()
val reader = BufferedReader(InputStreamReader(inputStream))
var theCharNum = reader.read()
while (theCharNum != -1) {
builder.append(theCharNum.toChar())
theCharNum = reader.read()
}
return builder.toString()
} finally {
inputStream?.close()
}
}

Updated: A shorter version

更新:较短的版本

Refer here for the explanation

请参考这里的说明

@Throws(IOException::class)
fun readFileWithNewLineFromResources(fileName: String): String {
return getInputStreamFromResource(fileName)?.bufferedReader()
.use { bufferReader -> bufferReader?.readText() } ?: ""}

读取二进制文件 (Reading Binary File)

In case the file is binary, you can do as below

如果文件是二进制文件,则可以执行以下操作

@Throws(IOException::class)
fun readBinaryFileFromResources(fileName: String): ByteArray {
var inputStream: InputStream? = null
val byteStream = ByteArrayOutputStream()
try {
inputStream =
javaClass.classLoader?.getResourceAsStream(fileName)
var nextValue = inputStream?.read() ?: -1
while ( nextValue != -1 ) {
byteStream.write(nextValue)
nextValue = inputStream?.read() ?: -1
}
return byteStream.toByteArray()
} finally {
inputStream?.close()
byteStream.close()
}
}

To convert ByteArray to String, just use String(byteArray) will do.

要将ByteArray转换为String,只需使用String(byteArray)

Updated: A shorter version

更新:较短的版本

Refer here for the explanation

请参考这里的说明

fun readBinaryFileFromResources(fileName: String): ByteArray {
ByteArrayOutputStream().use { byteStream ->
getInputStreamFromResource(fileName)?.copyTo(byteStream)
return byteStream.toByteArray()
}}

You can get the code from here.

您可以从此处获取代码。

翻译自: https://medium.com/mobile-app-development-publication/android-reading-a-text-file-during-test-2815671e8b3b

android读取文件内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值