在 Kotlin 中使用 BufferedReader 的最佳方式

     2023-02-25     81

关键词:

【中文标题】在 Kotlin 中使用 BufferedReader 的最佳方式【英文标题】:Best way to use BufferedReader in Kotlin 【发布时间】:2017-04-21 09:36:26 【问题描述】:

所以我刚刚开始使用 Kotlin for Android,并将我的 Android Java 代码转换为 Kotlin。

在一次转换中,我偶然发现了一个 BufferedReader,我通常会用 Java 编写如下:

String result = "";
String line = "";
BufferedReader reader = new BufferedReader(someStream);
while ( (line = reader.readLine()) != null ) 
    result += line;

但在 Kotlin 中,似乎 Kotlin 不允许我在 while 条件下为变量赋值。

目前,我编写的代码如下:

val reader = BufferedReader(someStream)
var line : String? = ""
while (line != null) 
    line = reader.readLine()
    result += line

尽管使用了 Kotlin,但我觉得它并没有那么优雅并且感觉上一代。

是什么?

【问题讨论】:

【参考方案1】:

你可以像这样使用bufferedReader

val allText = inputStream.bufferedReader().use(BufferedReader::readText)

【讨论】:

解释:kotlinlang.org/docs/reference/…【参考方案2】:

如果您仍想逐行阅读,可以使用 std lib 中的一些扩展函数并按如下方式进行:

val reader = someStream.bufferedReader()
val iterator = reader.linesSequences().iterator()
while(iterator.hasNext()) 
    val line = iterator.next()
    // do something with line...

reader.close()

或者,使用“功能”方法:

val reader = someStream.bufferedReader()
reader.useLines 
    it.map  line -> // do something with line 

通过使用 useLines,您无需在阅读器上显式调用 close,useLines 扩展函数将为您完成!

只是添加这些以供参考.. 干杯

【讨论】:

useLines 是否一次加载所有行?如果我试图从一个大文件中读取,这会使用太多内存还是每行都根据需要获取?提前致谢。 因此 useLines 使用了一个序列,该序列对流进行惰性求值,这有利于打开文件句柄计数:(kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/…)。 Jetbrains 建议大文件 File.forEachLine 一次使用一行 (kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-file/…)。但在幕后 File.forEachLine 仍然使用 useLines,默认缓冲区大小相同,为 8 * 1024【参考方案3】:

您也可以尝试使用“forEachLine”方法。

val file = File("./folder/test.txt")
file.bufferedReader().forEachLine 
    println("value = $it")
 

它还会在读取最后一行后自动关闭流

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-reader/index.html

fun Reader.forEachLine(action: (String) -> Unit) 遍历每个 此阅读器的行,为读取的每一行调用操作并关闭 完成后的阅读器。

【讨论】:

【参考方案4】:

另一种方法是使用for循环:

val reader = BufferedReader(someStream)
for (line in reader.lines()) 
    println(line)

虽然它不像公认的答案那么简洁,但它可以让您循环并执行某种逻辑,而无需将所有内容都抽到一个字符串中,如下所示

val allText: String = inputStream.bufferedReader().use(BufferedReader::readText)

【讨论】:

请注意:您可以使用useLines() 方法迭代行,该方法返回一个惰性序列,然后为您关闭底层的 BufferedReader。【参考方案5】:

感谢 João Gonçalves 对 stdlib 的引用,我发现如果需要,您可以使用 forEachLine 遍历阅读器。

【讨论】:

【参考方案6】:

使用这样的代码

val 输入 = conn.inputStream val allText = input.bufferedReader().use(BufferedReader::readText) val 结果 = StringBuilder() 结果.append(allText) 返回结果.toString() 别的 返回“不成功”

【讨论】:

【参考方案7】:

当流有多行时,接受的答案失败。这是我的解决方案

val allText = inputStream.bufferedReader().use  it.readLines().joinToString("") 

【讨论】:

【参考方案8】:

你可以像这样使用 BufferReader :

val data = inputStream.bufferedReader().use(BufferedReader::readText)
    

【讨论】:

您的解决方案与接受的答案有何不同?

如何在 Kotlin 中使用 ViewModelProviders

】如何在Kotlin中使用ViewModelProviders【英文标题】:HowtouseViewModelProvidersinKotlin【发布时间】:2019-05-1916:30:45【问题描述】:我是Kotlin的新手,请帮助我.of(this)我的java代码是mFavViewModel=ViewModelProviders.of(this).get(FavouritesViewModel.class);我... 查看详情

是否可以在 Grails 中使用 Kotlin?

】是否可以在Grails中使用Kotlin?【英文标题】:IsitpossibletouseKotlininGrails?【发布时间】:2017-12-1822:41:12【问题描述】:导致我提出这个问题的一些基本事实:Groovy具有完整的Java互操作性Kotlin具有完整的Java互操作性Kotlin也可以编... 查看详情

在 Kotlin 流中使用 ReactiveSecurityContextHolder

】在Kotlin流中使用ReactiveSecurityContextHolder【英文标题】:UsingReactiveSecurityContextHolderinsideaKotlinFlow【发布时间】:2020-03-2119:44:22【问题描述】:我正在使用Kotlin开发SpringBoot(2.2)项目,使用CouchDB作为(反应式)数据库,因此使用异步... 查看详情

如何在 Kotlin 中使用回调?

】如何在Kotlin中使用回调?【英文标题】:HowIcanusecallbackinKotlin?【发布时间】:2018-05-1000:57:32【问题描述】:我有View和一个CircleShape,它应该在这个View中显示toast。我在主要活动中使用它。这是我的界面interfaceOnClickListenerInterface... 查看详情

如何在 kotlin 中使用非静态方法?

】如何在kotlin中使用非静态方法?【英文标题】:Howdoiusenonstaticmethodinkotlin?【发布时间】:2018-10-1810:05:09【问题描述】:我有一个类扩展BroadcastReceiver。因此,当消息到达时,将调用该方法。现在在那个方法中,我正在调用另一... 查看详情

如何在 kotlin native 中使用 swift 库?

】如何在kotlinnative中使用swift库?【英文标题】:Howtouseaswiftlibraryinkotlinnative?【发布时间】:2020-06-2622:21:31【问题描述】:如何在Kotlin/Native中使用Swift库?我在Kotlin/Native中尝试使用cinteropt使用Objective-c库,但我似乎无法弄清楚如... 查看详情

如何在 Kotlin/Multiplatform 项目中使用 .klib 库

】如何在Kotlin/Multiplatform项目中使用.klib库【英文标题】:Howtouse.kliblibraryinKotlin/Multiplatformproject【发布时间】:2021-02-0105:40:19【问题描述】:我想在我的Kotlin/Multiplatform项目(通用级别)中使用C代码。通过这篇文章:https://theprogr... 查看详情

如何使用 Kotlin 在 ListAdapter 中使用 Filterable?

】如何使用Kotlin在ListAdapter中使用Filterable?【英文标题】:HowtouseFilterableinListAdapterusingKotlin?【发布时间】:2021-05-0303:21:05【问题描述】:我会使用SearchView来过滤我的RecyclerView,在***和其他网站上,我发现只是在我使用ListAdapter... 查看详情

在 Kotlin 中使用 BufferedReader 的最佳方式

】在Kotlin中使用BufferedReader的最佳方式【英文标题】:BestwaytouseBufferedReaderinKotlin【发布时间】:2017-04-2109:36:26【问题描述】:所以我刚刚开始使用KotlinforAndroid,并将我的AndroidJava代码转换为Kotlin。在一次转换中,我偶然发现了一... 查看详情

我可以在 Kotlin 脚本中使用 kotlinx 类吗?

】我可以在Kotlin脚本中使用kotlinx类吗?【英文标题】:CanIusekotlinxclassesinKotlinscripts?【发布时间】:2021-04-1709:43:19【问题描述】:是否可以在简单的Kotlin脚本中从kotlinx包中导入类?myscript.kts:importkotlinx.serialization.*importkotlinx.seria... 查看详情

如何使用 kotlin 在 android 中初始化小部件

】如何使用kotlin在android中初始化小部件【英文标题】:Howtoinitializewidgetsinandroidusingkotlin【发布时间】:2016-09-2713:58:42【问题描述】:我已经开始学习在android中使用kotlin语言并在初始化我的按钮变量时遇到问题,因为在定义我的... 查看详情

如何使用 Kotlin 在所有活动中播放背景音乐?

】如何使用Kotlin在所有活动中播放背景音乐?【英文标题】:HowtoplaybackgroundmusicthroughallactivitiesusingKotlin?【发布时间】:2019-09-2313:30:10【问题描述】:如何使用Kotlin在所有活动中在后台播放音乐文件?我到处寻找,但我只找到了J... 查看详情

在“使用”标准库函数中测试 Kotlin lambda

】在“使用”标准库函数中测试Kotlinlambda【英文标题】:TestKotlinlambdawithin"use"standardlibraryfunction【发布时间】:2019-10-0419:21:14【问题描述】:我正在尝试在传递给使用Kotlin标准库内联函数的lambda函数中对代码进行单元测试... 查看详情

在java中使用kotlin库(代码片段)

...在AndroidStudio中使用GitHub库(MeowBottomNavigation)。但是它用kotlin编写,我不能使用它中的监听器。唯一给出的就是这个bottomNavigation.setOnShowListenerbottomNavigation.setOnClickMenuListener建议显示使用(功能1)我不确定如何在java中实现它。任... 查看详情

如何在 Kotlin 中使用协程将图像保存在设备中

】如何在Kotlin中使用协程将图像保存在设备中【英文标题】:HowtosaveanimageindeviceusingCoroutinesinKotlin【发布时间】:2021-08-1100:01:22【问题描述】:我正在开发绘图应用程序项目,我成功了。但最后,我需要将该图像保存在设备上。... 查看详情

如何在 Kotlin 协程中使用 Sqldelight

】如何在Kotlin协程中使用Sqldelight【英文标题】:HowtouseSqldelightwithKotlinCoroutines【发布时间】:2020-06-0703:16:51【问题描述】:显然有SqlDelight的Kotlin协程扩展函数,但我不知道如何实现它们,因为我找不到文档。我有一个看起来像... 查看详情

kotlin-反射

...,都能够调用它的任意一个方法和属性。常用API使用demoKotlin的反射需要集成org.jetbrains.kotlin:kotlin-reflect仓库,版本保持与kotlin一致。在Kotlin中,字节码对应的类是kotlin.reflect.KClass,因为Kotlin百分之百兼容Java,所以Kotlin中可以使用J... 查看详情

在 Java 项目中使用 Kotlin 库作为依赖项

】在Java项目中使用Kotlin库作为依赖项【英文标题】:UsingKotlinlibrariesasdependenciesinaJavaproject【发布时间】:2019-02-0319:30:19【问题描述】:我有一个为其他项目提供共享功能的库项目。实现是用Kotlin编写的。但是,我确保库的公共... 查看详情