JAVA NIO 学习总结(上)

最近看到《java核心技术》的io部分,学习如何访问文件,如何以二进制格式以及文本格式来读写文件,以及jdk后续更新的nio新特性,这里主要总结nio的新内容。

demo文件在:https://github.com/lovejj1994/IO

1.Charset类统一了字符集的管理
我们知道在java中,英文还好,如果碰到中文,很可能就会碰到乱码问题,例如一个中文字符如果以UTF-8编码成二进制字节,那就必须要以UTF-8重新解码成字符,如果用了GBK来解码,就会出现乱码。下面是Charset的一个应用场景

    /**
     * 编码
     */
    public static byte[] encode(String str,String charset){
        Charset charset1 = Charset.forName(charset);
        ByteBuffer encode = charset1.encode(str);
        return encode.array();
    }
    /**
     * 解码
     */
    public static String decode(byte[] bytes,String charset){
        Charset charset1 = Charset.forName(charset);
        ByteBuffer wrap = ByteBuffer.wrap(bytes);
        CharBuffer decode = charset1.decode(wrap);
        return decode.toString();
    }

2.Path类抽象了目录的概念,规范了文件目录的操作,可以无需关心你使用windows还是linux。

Path类常见操作如下:

//当前工程的目录
String baseDir = System.getProperty("user.dir");

Path path = Paths.get(baseDir);
System.out.println("path: "+path.toString());

// 1.如果参数是绝对路径  则返回绝对路径
// 2.否则 则在path后面加上 参数
Path resolve = path.resolve("resolve");
System.out.println("resolve: "+resolve.toString());

//解析path的父路径
Path resolveSibling = path.resolveSibling("resolveSibling");
System.out.println("resolveSibling: "+resolveSibling.toString());

//resolve 的对立面是 relativize  前面是往后加 后者是往前减
Path relativize = resolve.relativize(path);
System.out.println("relativize: "+relativize.toString());

//清除路径冗余
Path path1 = Paths.get("a","..","b",".","c");
System.out.println("path1: "+path1.toString());
Path normalize = path1.normalize();
System.out.println("normalize: "+normalize.toString());

//获取绝对路径
Path absolutePath = path1.toAbsolutePath();
System.out.println("absolutePath: "+absolutePath.toString());

输出如下:

path: C:\eclipseMars2\git\IO
resolve: C:\eclipseMars2\git\IO\resolve
resolveSibling: C:\eclipseMars2\git\resolveSibling
relativize: ..
path1: a\..\b\.\c
normalize: b\c
absolutePath: C:\eclipseMars2\git\IO\a\..\b\.\c

更多path的用法在实际中碰到需要自行翻阅api

3.Files类使得文件操作更加便捷,如果是jdk1.7以下的api,要读取一个文本文件需要以下操作

InputStreamReader reader = null;
try {
    reader = new InputStreamReader(new FileInputStream(file),Charset.forName("UTF-8"));
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

BufferedReader reader1 = new BufferedReader(reader);

String str = null;
try {
    while((str=reader1.readLine())!=null)
    System.out.println(str);
} catch (IOException e) {
    e.printStackTrace();
}

然后是用File类操作:

//读取文本文件,只需传入文件的Path路径和解码格式即可
List<String> strings = Files.readAllLines(path, Charset.forName("UTF-8"));
System.out.println("字符:");
for(String s : strings){
    System.out.println(s);
}

File类方便读写文件的一个小demo

 Path path = Paths.get("IOTest_1.txt");
if(path.toFile().exists()){
//读取字节
byte[] bytes = Files.readAllBytes(path);
System.out.println("字节:"+bytes);

//读取字符串
List<String> strings = Files.readAllLines(path, Charset.forName("UTF-8"));
System.out.println("字符:");
for(String s : strings){
    System.out.println(s);
}

//写文件
String userDir = System.getProperty("user.dir");
Path Files_1 = Paths.get(userDir).resolve("Files_1.txt");
Files.write(Files_1, "明天去玩".getBytes(Charset.forName("UTF-8")));
//追加
Files.write(Files_1, ",因为有事".getBytes(Charset.forName("UTF-8")), StandardOpenOption.APPEND);
}

File类还可以方便的创建inputstream,outputstream,reader,writer对象,以前写 读写文件感觉很复杂,流的组合写起来特别麻烦

以前写的代码

BufferedReader read = new BufferedReader(new InputStreamReader(System.in, Charset.forName("UTF-8")));

File:

BufferedReader read = Files.newBufferedReader(Path path, Charset cs)

代码就简洁了很多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值