Java8读文件仅需一行代码

JDK7中引入了新的文件操作类java.nio.file.File,它包含了很多有用的方法来操作文件,比如检查文件是否为隐藏文件,或者是检查文件是否为只读文件。开发者还可以使用Files.readAllBytes(Path)方法把整个文件读入内存,此方法返回一个字节数组,还可以把结果传递给String的构造器,以便创建字符串输出。

此方法确保了当读入文件的所有字节内容时,文件属性是关闭的,否则就会出现IO异常或其它的未检查异常。这意味着在读文件到最后的块内容后,无需关闭文件。要注意,此方法不适合读取很大的文件,因为可能存在内存空间不足的问题。开发者还应该明确规定文件的字符编码,以避免任异常或解析错误。

如果你想读入文件作为字符串,那么你还可以使用readAllLines(Path path, Charset cs)方法,此方法与之前的方法相似,也是在读完文件后无需关闭文件。但是它返回的不是字节数组,而是字符串数组。而且,Java8重写了此方法,无需指定字符集,直接使用UTF-8编码进行字符串转换。
如果你想一行一行的读入文件作为字符串,那么你可以使用Files.lines()方法,它会从读入的文件中返回字符串流,并使用UTF-8编码把字节转换成字符。使用forEach()方法,可以只用一行Java代码实现把文件的所有内容输出到控制台,如下面第三个代码片段。

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

public class FileReadingTest {
 public static void main(String[] args) throws IOException {
  // Java 7 例子
  // Files.readAllBytes默认以UTF-8编码读入文件,故文件的编码如果不是UTF-8,那么中文内容会出现乱字符
  System.out.println(new String(Files.readAllBytes(Paths.get("D:\\jd.txt"))));
   // Java 8例子
  List<string> lines = Files.readAllLines(Paths.get("D:\\jd.txt"), StandardCharsets.UTF_8);
  StringBuilder sb = new StringBuilder();
  for(String line : lines){
   sb.append(line);
  }
  String fromFile = sb.toString();
        System.out.println(fromFile);

 }
}

如果使用的不是JDK7,而是JDK8,那么一行代码即可完成读文件。

import static java.lang.System.out;
import static java.nio.file.Files.readAllBytes;
import static java.nio.file.Paths.get;

import java.io.IOException;
public class FileIntoString {
 public static void main(String[] args) throws IOException {
  // 一行代码搞定读文件,默认是UTF-8编码
  out.println(new String(readAllBytes(get("d:/jd.txt"))));
 }
}

如果使用JDK8,那么还可以使用流API来读写文件,这样代码更简洁、高效。下面的例子中,lines()方法返回字符串流,字符串使用的是UTF-8编码。如下:

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

public class Java8FileReader {
 public static void main(String[] args) throws IOException {
  // Java8用流的方式读文件,更加高效
  Files.lines(Paths.get("D:\\jd.txt"), StandardCharsets.UTF_8).forEach(System.out::println);
 }
}

上面的例子要注意几点:

1)文件可能很大,可能会超出内存空间,使用前要做评估。

2)要输出日志,记录为什么无法读取文件或者在阅读文件时遇到的任何错误。

3)在把字节转换成字符时,应该指定字符编码。

4)要处理文件不存在的情况。

还要注意,如果读入的文件的编码是ANSI编码,那么上面的例子在读取文件内容时会报java.nio.charset.MalformedInputException: Input length = 1错误。

时间: 2024-11-11 05:52:09

Java8读文件仅需一行代码的相关文章

银行卡验证接口API(仅需一行代码,实现全国银行卡核验)

银行卡确认在互联网越来越普及,在二手.电商.贷款.等主流互联网应用中都有明确的刚需,传统的 银行卡核验方式是用户上传图片,客服后台人肉审核,但问题在于根本无从确认 银行卡的真实性,也不能确认该 银行卡持有人和身份证的契合关系. 今天谈的是对接全国银行进行实时银行卡认证的银行卡核验系统,需要的请求值包括:姓名.身份证号.银行卡号.手机号 代码很简单,向七侠犬服务器发起以下WEB请求: https://api.7xq.com/bandCard?name=姓名&no=身份证号码&mobile=手

【猿团专访】|涂图CEO胡东平:只需一行代码 移动图像开发从未如此简单

我们常常戏说这是一个靠脸吃饭的时代,继“整容”“化妆”之后,”修图““美颜”成为变好看的又一大神器.于是市场上涌现出越来越多自带美颜.滤镜功能的APP,大众也是用得不亦乐乎,可是移动图像处理开发套件领域出众者却寥寥.涂图(TuSDK)就像是横空杀出的黑马,2015年4月产品上线,6月即获得了浙大科发.华旦天使.立元创投.浙江国智的天使轮投资.截止目前,涂图已经覆盖8亿用户,整体客户超过4000家,并且每个月以四百五百家的量稳定增长,囊括了诸多如熊猫tv.小红书.一起秀. Blued这样的知名客户

只需一行代码!Python中9大时间序列预测模型

在时间序列问题上,机器学习被广泛应用于分类和预测问题.当有预测模型来预测未知变量时,在时间充当独立变量和目标因变量的情况下,时间序列预测就出现了. 预测值可以是潜在雇员的工资或银行账户持有人的信用评分.任何正式引入统计数据的数据科学都会遇到置信区间,这是某个模型确定性的衡量标准. 因此,预测一段时间内某些数据的价值需要特定的技术,并且需要多年的发展. 由于每种都有其特殊用途,必须注意为特定应用选择正确的技术.预测人员在技术选择中发挥作用,他们越了解预测可能性的范围,公司的预测工作就越有可能取得成

file标签之act=read(只需一行代码读出文件内容)

功能: ·        读文件的内容 用法: <file act=read[id=书包名] [enc=文件字符编码] method=str name=名称[start=int] [end=int]>相对路径的文件名</file> ·        act=read:读操作 ·        id:返回的书包名(可选,默认为标签名file) ·        enc:文件内容的字符编码(可选,默认为平台文件存储编码@{sys:file.enc}) ·        method:目

只需一行代码,将已有PC网站转成移动网站

跨屏网 Kuaping.com专注于几百万PC网站的移动化需求,只需在网站加载一行JS代码即可实现快速将网站变成移动端网站的需求. 对于响应式自适应界面,很多人可能还是不是特别清楚,响应式的实现方式在于通过界面技术来实现同一个界面在不同尺寸显示屏可以显示不同的界面.电脑端打开呈现的是电脑端网页的样子,手机下访问则看到的是手机版的样子, 这不是很高深的技术,只是对于html5技术的运用, 而跨屏网推出的一行JS代码快速实现,则是背后通过了更加复杂的分析技术实现. 今天跨屏网聊一聊自适应跨屏网站 跨

一行代码解析复杂JSON文件:利用Android自带的包解析JSON

上周写了一篇关于Android自带的org.JSON与JSONLIB相冲突的文章,今天我想写一下我对org.json使用的小心得 由于学校项目要求解析一个复杂JSON,所以就上网搜了一下,不过Google一搜JSON数据解析,会出现五花八门的结果,JSONLIB, GSON, FASTJSON等等,唯独没有对org.json的使用,其实Android自带的JSON解析包相当好用,其用法与JSONLIB类似,我是先用的JSONLIB,在JRE环境下用得好好的,到了Android下怎么都跑不通(原来

一行代码,快速为UITableView创建Delegate和DataSource

只需一行代码,快速为UITableView创建Delegate和DataSource. 简介CBTableViewDataSource是一个轻量级的用于快速创建UITableView的DataSource和Delegate的框架.它提供了一些方便的API,帮助用户以一种快速和有逻辑的方式创建DataSource和Delegate. 最偷懒的使用方式如下:[_tableView cb_makeSectionWithData:self.viewModel.data andCellClass:[Cus

Bag标签之一行代码实行中文分词

用法: <Bag id=书包名 act=2words[name=key] [gap=字符] [quotes=引号]>中英文混合内容</Bag> 例0: 默认分词(无gap和quotes参数) <bagid=pPage act=2words name=words>我喜欢黄色高领T恤衫</bag> 输出分词结果 <p><b>结果词组: </b>@{pPage:words}</p> 效果: 完整代码 <html

一行代码为UITextField添加收键盘功能

iOS开发中收键盘是十分常用的功能,只需一行代码即可为ViewController添加工具条收键盘功能 更重要的是使用catogory,无代码污染. 代码 // UITextField+keyboard.h // TextFieldKeyBord // // Created by luo.h on 15/10/8. // Copyright © 2015年 l.h. All rights reserved. // #import <UIKit/UIKit.h> @interface UITex