V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
banker
V2EX  ›  程序员

Java 可以像 C 一样 readline 么?

  •  
  •   banker · 2017-05-10 09:12:03 +08:00 via iPhone · 3465 次点击
    这是一个创建于 2790 天前的主题,其中的信息可能已经有所发展或是发生改变。
    就是不做加工的把文件内容按换行符读到 byte 数组里
    randomaccessfile readline 再 getbytes(iso8859-1)这种存在乱码时可以还原么?
    还有没有更高效的方法?
    14 条回复    2017-05-11 09:18:30 +08:00
    armstrong
        1
    armstrong  
       2017-05-10 09:21:18 +08:00
    可以试试 Guava,Files.readLine() 或者 readLines()
    mosliu
        2
    mosliu  
       2017-05-10 09:27:23 +08:00
    (new BufferedReader(new InputStreamReader(new FileInputStream("path"),"utf-8"))).readLine()
    kiwi95
        3
    kiwi95  
       2017-05-10 09:29:30 +08:00
    scanner
    mosliu
        4
    mosliu  
       2017-05-10 09:30:30 +08:00
    或者直接
    Files.readAllLines("path")
    后面接 lambda 很方便
    banker
        5
    banker  
    OP
       2017-05-10 09:30:49 +08:00 via iPhone
    @mosliu 这个对文件中的乱码没法还原
    mosliu
        6
    mosliu  
       2017-05-10 09:35:06 +08:00
    锟斤拷乱码?

    读的时候直接按照编码读不就好了?
    SoloCompany
        7
    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
        8
    ihuotui  
       2017-05-10 10:20:01 +08:00 via iPhone
    要高效率用 nio
    Arthur2e5
        9
    Arthur2e5  
       2017-05-10 10:32:20 +08:00
    唔我问个白痴问题:在各种 UTF-16 和 UTF-32 存在的情况下,是如何做到在阅读未知编码的文件下考虑换行符的?(逃)
    lululau
        10
    lululau  
       2017-05-10 11:20:08 +08:00
    Files#lines
    acidsweet
        11
    acidsweet  
       2017-05-10 16:29:24 +08:00
    @kiwi95 Scanner+1
    mosliu
        12
    mosliu  
       2017-05-10 21:27:26 +08:00
    @SoloCompany 不是我问的。。。
    我明白 所以才说 锟斤拷 :D:D:D
    banker
        13
    banker  
    OP
       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
        14
    Ouyangan  
       2017-05-11 09:18:30 +08:00
    common 的 fileUtil 试试
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2739 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:11 · PVG 20:11 · LAX 04:11 · JFK 07:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.