NIO2简单读取文件,java8字符串拼接和集合的改变

文件操作

我们知道在JDK6甚至之前的时候,我们想要读取一个文本文件也是非常麻烦的一件事,而现在他们都变得简单了, 这要归功于NIO2,我们先看看之前的做法:

读取一个文本文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
BufferedReader br = null;
try{
    newBufferedReader(newFileReader("file.txt"));
    StringBuilder sb = newStringBuilder();
    String line      = br.readLine();
    while(line != null) {
        sb.append(line);
        sb.append(System.lineSeparator());
        line = br.readLine();
    }
    String everything = sb.toString();
}catch(Exception e){
    e.printStackTrace();
}finally{
    try{
        br.close();
    }catch(IOException e) {
        e.printStackTrace();
    }
}

大家对这样的一段代码一定不陌生,但这样太繁琐了,我只想读取一个文本文件,要写这么多代码还要 处理让人头大的一堆异常,怪不得别人吐槽Java臃肿,是在下输了。。。

下面我要介绍在JDK7中是如何改善这些问题的。

Path

Path用于来表示文件路径和文件,和File对象类似,Path对象并不一定要对应一个实际存在的文件, 它只是一个路径的抽象序列。

要创建一个Path对象有多种方法,首先是final类Paths的两个static方法,如何从一个路径字符串来构造Path对象:

1
2
3
4
Path path1   = Paths.get("/home/biezhi","a.txt");
Path path2   = Paths.get("/home/biezhi/a.txt");
URI  u       = URI.create("file:home/biezhi/a.txt");
Path pathURI = Paths.get(u);

通过FileSystems构造

1
Path filePath = FileSystems.getDefault().getPath("/home/biezhi","a.txt");

Path、URI、File之间的转换

1
2
3
4
File file  = newFile("/home/biezhi/a.txt");
Path p1    = file.toPath();
p1.toFile();
file.toURI();

读写文件

你可以使用Files类快速实现文件操作,例如读取文件内容:

1
2
byte[] data    = Files.readAllBytes(Paths.get("/home/biezhi/a.txt"));
String content = newString(data, StandardCharsets.UTF_8);

如果希望按照行读取文件,可以调用

1
List<String> lines = Files.readAllLines(Paths.get("/home/biezhi/a.txt"));

反之你想将字符串写入到文件可以调用

1
Files.write(Paths.get("/home/biezhi/b.txt"),"Hello JDK7!".getBytes());

你也可以按照行写入文件,Files.write方法的参数中支持传递一个实现Iterable接口的类实例。 将内容追加到指定文件可以使用write方法的第三个参数OpenOption:

1
2
Files.write(Paths.get("/home/biezhi/b.txt"),"Hello JDK7!".getBytes(),
 StandardOpenOption.APPEND);

默认情况Files类中的所有方法都会使用UTF-8编码进行操作,当你不愿意这么干的时候可以传递Charset参数进去变更。

当然Files还有一些其他的常用方法:

1
2
3
4
InputStream ins = Files.newInputStream(path);
OutputStream ops = Files.newOutputStream(path);
Reader reader = Files.newBufferedReader(path);
Writer writer = Files.newBufferedWriter(path);

创建、移动、删除

创建文件、目录

1
2
3
4
if(!Files.exists(path)) {
    Files.createFile(path);
    Files.createDirectory(path);
}

Files还提供了一些方法让我们创建临时文件/临时目录:

1
2
3
4
Files.createTempFile(dir, prefix, suffix);
Files.createTempFile(prefix, suffix);
Files.createTempDirectory(dir, prefix);
Files.createTempDirectory(prefix);

这里的dir是一个Path对象,并且字符串prefix和suffix都可能为null。 例如调用Files.createTempFile(null, “.txt”)会返回一个类似/tmp/21238719283331124678.txt

读取一个目录下的文件请使用Files.list和Files.walk方法

复制、移动一个文件内容到某个路径

1
2
Files.copy(in, path);
Files.move(path, path);

删除一个文件

1
Files.delete(path);

小的改进

Java8是一个较大改变的版本,包含了API和库方面的修正,它还对我们常用的API进行很多微小的调整, 下面我会带你了解字符串、集合、注解等新方法。

字符串

使用过JavaScript语言的人可能会知道当我们将一个数组中的元素组合起来变成字符串有一个方法join, 例如我们经常用到将数组中的字符串拼接成用逗号分隔的一长串,这在Java中是要写for循环来完成的。

Java8种添加了join方法帮你搞定这一切:

1
String str = String.join(",","a","b","c");

第一个参数是分隔符,后面接收一个CharSequence类型的可变参数数组或一个Iterable。

集合

集合改变中最大的当属前面章节中提到的Stream API,除此之外还有一些小的改动。

  • Map中的很多方法对并发访问十分重要,我们将在后面的章节中介绍
  • Iterator提供forEachRemaining将剩余的元素传递给一个函数
  • BitSet可以产生一个Stream对象

通用目标类型判断

Java8对泛型参数的推断进行了增强。相信你对Java8之前版本中的类型推断已经比较熟悉了。 比如,Collections中的方法emptyList方法定义如下:

1
static<T> List<T> emptyList();

emptyList方法使用了类型参数T进行参数化。 你可以像下面这样为该类型参数提供一个显式的类型进行函数调用:

1
List<Person> persons = Collections.<Person>emptyList();

不过编译器也可以推断泛型参数的类型,上面的代码和下面这段代码是等价的:

1
List<Person> persons = Collections.emptyList();

我还是习惯于这样书写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值