Java 可以像 C 一样 readline 么?

2017-05-10 09:12:03 +08:00
 banker
就是不做加工的把文件内容按换行符读到 byte 数组里
randomaccessfile readline 再 getbytes(iso8859-1)这种存在乱码时可以还原么?
还有没有更高效的方法?
3273 次点击
所在节点    程序员
14 条回复
armstrong
2017-05-10 09:21:18 +08:00
可以试试 Guava,Files.readLine() 或者 readLines()
mosliu
2017-05-10 09:27:23 +08:00
(new BufferedReader(new InputStreamReader(new FileInputStream("path"),"utf-8"))).readLine()
kiwi95
2017-05-10 09:29:30 +08:00
scanner
mosliu
2017-05-10 09:30:30 +08:00
或者直接
Files.readAllLines("path")
后面接 lambda 很方便
banker
2017-05-10 09:30:49 +08:00
@mosliu 这个对文件中的乱码没法还原
mosliu
2017-05-10 09:35:06 +08:00
锟斤拷乱码?

读的时候直接按照编码读不就好了?
SoloCompany
2017-05-10 10:00:39 +08:00
@mosliu 大部分的编码方式的编码空间都是不可还原的(意思是说 decode 为 string 后再 encode 无法保证得到原始的 byte 序列),包括我们最常见的 utf8 以及 gb18030,如果你希望可 100% 还原,那么可以选择 Files.readAllLines(Path, ISO_8859_1), 然后每行都要先使用 ISO_8859_1 重新 encode 回 bytes 再强制编码转换
ihuotui
2017-05-10 10:20:01 +08:00
要高效率用 nio
Arthur2e5
2017-05-10 10:32:20 +08:00
唔我问个白痴问题:在各种 UTF-16 和 UTF-32 存在的情况下,是如何做到在阅读未知编码的文件下考虑换行符的?(逃)
lululau
2017-05-10 11:20:08 +08:00
Files#lines
acidsweet
2017-05-10 16:29:24 +08:00
@kiwi95 Scanner+1
mosliu
2017-05-10 21:27:26 +08:00
@SoloCompany 不是我问的。。。
我明白 所以才说 锟斤拷 :D:D:D
banker
2017-05-11 01:05:30 +08:00
看起来比较简单的做法就是 RandomAccessFile 的 readLine,再 getBytes("ISO8859-1")了,就是这个 readLine 是一个字节一个字节读的估计效率不会很高,如果要高效估计就要改写几个 io 库的几个类了
@Arthur2e5 就我所知,换行符都是\n 或者\r\n
@mosliu 文件编码有约定,但是有的文件中存在乱码,比如在 UTF-8 编码中出现 0x88 这种,按照 utf-8 读文件,再 getBytes("utf-8")得到的字节数组就和文件中存储的不一致了
Ouyangan
2017-05-11 09:18:30 +08:00
common 的 fileUtil 试试

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/360280

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX