最近在用kotlin练习写一个Android项目,记录中途遇到的一些问题
一,android中的AssetsUtil
public static String getJson(Context context, String fileName){
StringBuilder stringBuilder = new StringBuilder();
//获得assets资源管理器
AssetManager assetManager = context.getAssets();
//使用IO流读取json文件内容
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(
assetManager.open(fileName),"utf-8"));
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}
return stringBuilder.toString();
}
这是平时我们用java来读取android下Assets目录下的json文件的写法
二,Kotlin中的AssetsUtil
因为在用Kotlin写项目,所以需要将以上代码用kotlin实现,自己尝试写了下,发现不好使,然后就直接将上面代码用android-studio转成kotlin 发现报错了。
var line: String = ""
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line)
}
报错行出现在while里面line = bufferedReader.readLine()这里。异常为:Assignments are not expressions, and only expressions are allowed in this context
是因为在kotlin中的while不允许这么写,它会将他认为是一个表达式,而这里不允许这么写表达式。所以就想到了kotlin中的do-while ,下面是kotlin写法
object AssetsUtil {
fun getFormAssets(context: Context, fileName: String): String? {
val stringBuilder = StringBuilder()
BufferedReader(InputStreamReader(context.assets.open(fileName), "UTF-8")).run {
var line: String? = ""
do {
line = readLine()
if (line != null) {
stringBuilder.append(line)
} else {
break
close()
}
} while (true)
return stringBuilder.toString()
}
return null
}
}
测试过,以上代码可用。
三,kotlin中的 do while
其实kotlin中的 while 和 do while和Java中的用法是一样的。这里主要是想强调一下 在使用while的三个关键字
Kotlin有三种结构化跳转表达式:
- return。默认从最直接包围他的函数或者匿名函数返回(return@this也支持从指定位置返回)
- break。终止最直接包围它的循环
- continue。继续下一次最直接包围它的循环。