使用Files.lines遇到文件编码带bom的问题
来源:互联网 发布:怎么写出淘宝试用报告 编辑:程序博客网 时间:2024/06/10 11:18
参考:http://jybzjf.iteye.com/blog/2262392
java读取编码有bom文件之前是有bug,后来修复了。
但是JDK8中新增了Files的Stream操作好像依然不支持bom文件读取。
读取文件行数据使用的是Files.lines,使用方法如下:
//读取所有内容List<String> lines = Files.readAllLines(Paths.get("g://test.txt"), Charsets.UTF_8);//读取部分内容long index = 0l; //从0行开始读int limit = 10; //读取10行内容Files.lines(Paths.get("g://test.txt"), Charsets.UTF_8) .skip(index) .limit(limit) .forEach(line -> { //对每行内容做处理 });
可以看到JDK8后使用Files的stream操作可以只用一行代码,甚至不用写文件输入输出流、缓冲就能方便读写文件。
但是也因此又出现了读写文件编码带bom的bug。
开篇参考链接里面的资料是java适配了编码带bom文件的读写,其中处理编码带bom文件的主要代码如下:
//注意:jdk8里,UnicodeInputStream类又有了一些细微的变化File f = new File("D:"+File.separator+"Order.txt"); FileInputStream in = new FileInputStream(f); String dc = Charset.defaultCharset().name(); UnicodeInputStream uin = new UnicodeInputStream(in,dc); BufferedReader br = new BufferedReader(new InputStreamReader(uin)); String line = br.readLine();
UnicodeInputStream 就是处理带bom文件的处理类。
但是Files.lines都已经封装好了,参数只能传文件路径,并且也没有提供参数是文件流的接口。怎么处理呢?
接下来我们看下Files.lines方法源码。
public static Stream<String> lines(Path path, Charset cs) throws IOException { BufferedReader br = Files.newBufferedReader(path, cs); try { return br.lines().onClose(asUncheckedRunnable(br)); } catch (Error|RuntimeException e) { try { br.close(); } catch (IOException ex) { try { e.addSuppressed(ex); } catch (Throwable ignore) {} } throw e; } }
源码里实际上也是对BufferedReader进行处理,既然如此我们可以在自己的代码这么用:
UnicodeInputStream uis = new UnicodeInputStream(Files.newInputStream(Paths.get(path)), true);//true表示不读取bom字符 BufferedReader br = new BufferedReader(new InputStreamReader(uis, charset)); br.lines().onClose(asUncheckedRunnable(br)) .skip(this.index) .limit(this.limit) .forEach(line -> { System.out.pinrtln(line); }); uis.close();
asUncheckedRunnable方法直接从源码里面拷出来
private static Runnable asUncheckedRunnable(Closeable c) { return () -> { try { c.close(); } catch (IOException e) { throw new UncheckedIOException(e); } }; }
这样就可以用Files的stream操作读取编码带bom的文件了。
阅读全文
0 0
- 使用Files.lines遇到文件编码带bom的问题
- JAVA输出带BOM的UTF-8编码的文件
- c#文件流读取编码问题(转)新增加一个方法解决不带BOM的问题
- php文件代码采用UTF-8编码的BOM问题
- python读文件时的编码问题(BOM)
- 编码中的BOM遇到的坑
- 当JSP文件和JS文件编码不一致的问题,以及UTF-8的BOM问题
- bom问题,编码问题
- utf8编码文件的bom头
- 使用python 3.0 处理utf8格式的文件BOM问题
- .NET中带BOM字符编码的读写
- 配置文件出现BOM头(文件编码改变)引发的问题
- 文件编码及UTF-8、BOM、0XFEFF相关问题
- 网页中遇到的网页文件编码问题的解决办法
- Python解析xml文件遇到的编码解析的问题
- 提问:用for each语句访问文件集合files元素遇到的问题
- Fragment使用带参数的构造函数遇到的问题
- volley框架的使用post带参数遇到的问题
- Spring in Action : MVC 配置(JAVA方式)
- 文章标题
- 梦禾茹
- Android列表ListView的分割线添加边距
- js设置颜色闪烁的两种方法
- 使用Files.lines遇到文件编码带bom的问题
- 2017 icpc 北京赛区 I.Minimum(线段树)
- 幼儿园门口摆个考勤机 家长接孩子得打卡
- 第四周项目1---建立单链表
- 2017.9.23 Count on a tree 思考记录
- 高复用的面向接口编程接口设计(以用户开发过程为例)
- 近期遇到的UBUNTU lamp配置问题及总结
- 深入理解Java虚拟机读书笔记--第七章 虚拟机类加载机制
- 欢迎使用CSDN-markdown编辑器