java IO总结

1、分类

1.1以读写内容的角度看可以分为:

  • 字节流
  • 字符流

字节流即以字节为单位进行读写操作,字符流即以字符为单位进行读写操作。
注:计算机中的内容都是以字节为单位存储的,包括文本文件也是由一个个字节组成,计算机在打开文本文件时都会指定一种编码,以解析文本文件的内容,比如常见的UTF-8编码。关于字符编码的知识大家可以看这篇博客(http://www.cnblogs.com/o-andy-o/archive/2012/04/11/2441937.html)。

1.2 以读写的方向可以分为

  • 输入流
  • 输出流

这里的输入输出是针对内存而言的,输入流指由其他输入源输入至内存,输出流则是由内存输出到外界。


2、File类

java中使用file类表示文件或者目录。我们使用File类创建文件和目录、删除文件和目录、打印文件夹子文件等操作。常用File类函数如下:

2.1 创建方法

  1. boolean createNewFile() true:文件不存在且创建成功 flase:文件以存在
  2. boolean mkdir() 创建目录,如果父目录不存在,则创建失败
  3. boolean mkdirs() 创建多级目录,如果父目录不存在也创建

2.2 删除方法

  1. boolean delete() 删除文件或文件夹

2.3 查询方法

  1. String getName() 得到文件名
  2. String getPath() 得到文件路径
  3. String getAbsolutePath() 得到文件绝对路径
  4. String getParent() 得到父文件对象
  5. File[] listFiles() 得到文件夹下的所有文件

2.4 判断方法

  1. boolean exists() 判断文件是否存在
  2. boolean isDirectory() 判断文件是否是文件夹
  3. boolean isFile() 判断文件是否是文件
    注:File类仅用于表示文件或文件目录,不具有操作文件的功能。

3、常见字节流类

3.1 InputStream

所有字节输入流的基类,是一个抽象类,该类不能实例化。

3.2 OutputStream

所有字节输出流的基类,是一个抽象类,该类不能实例化。

3.3 FileInputStream

该类提供从文件中读取数据的功能,可以使用如下代码初始化。

try(InputStream inputStream=new FileInputStream("/Users/guest/test.txt")){
        int len;
        byte[]bs=new byte[1024];
        while((len=inputStream.read(bs))!=-1){
            System.out.println(new String(bs,0,len));
        }
}

3.4 FileOutputStream

该类提供写入数据到磁盘文件的功能,可以使用如下代码初始化。

try (OutputStream outputStream = new FileOutputStream("/Users/guest/test.txt")) {
        outputStream.write("hello world".getBytes());
        outputStream.flush();
}

3.5 ByteArrayInputStream

该类可以接受一个字节数组,然后将该字节数组封装成一个字节输入流。

try(InputStream inputStream = new ByteArrayInputStream("hello world".getBytes())){
        int len;
        byte[] bs = new byte[1024];
        while ((len = inputStream.read(bs)) != -1) {
            System.out.println(new String(bs, 0, len));
        }
}

3.6 ByteArrayOutputStream

该类可以将数据输出至一个字节数组

try(ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()){
        byteArrayOutputStream.write("hello world".getBytes());
        byte[] bs = byteArrayOutputStream.toByteArray();
        System.out.println(new String(bs));
}

3.7 BufferedInputStream

该类的使用和普通InputStream一样,不过他在读取数据时会一次性读取多个字节的数据放在buf数组中。

try(InputStream inputStream = new BufferedInputStream(new FileInputStream("/Users/guest/test.txt"))){
        int len;
        byte[] bs = new byte[1024];
        while ((len = inputStream.read(bs)) != -1) {
            System.out.println(new String(bs, 0, len));
        }
}

3.8 BufferedOutputStream

该类的使用和普通OutStream一样,不过他在写数据时会先将数据写入buf数组缓存中,等到缓冲区满时再一次性将缓冲区数据写入磁盘。

try (BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("/Users/hws/Desktop/test.txt"))) {
        outputStream.write("hello world".getBytes());
        outputStream.flush();
}

4、常见字符流

4.1Reader

所有字符输入流的基类,是一个抽象类,该类不能实例化。

4.2 Writer

所有字符输出流的基类,是一个抽象类,该类不能实例化。

4.3 FileReader

该类提供从文件中读取数据的功能,它内部是通过FileInputStream实现。

try (Reader reader = new FileReader("/Users/hws/Desktop/test.txt")) {
        int len;
        char[] chs = new char[1024];
        while ((len = reader.read(chs)) != -1) {
            System.out.println(new String(chs, 0, len));
        }
}

4.4 FileWriter

该类提供写入数据到磁盘文件的功能,可以使用如下代码初始化。

try (Writer writer = new FileWriter("/Users/hws/Desktop/test.txt")) {
        writer.write("hello world".toCharArray());
        writer.flush();
}

4.5 CharArrayReader

该类可以接受一个字符数组,然后将该字符数组封装成一个字符输入流。

try(Reader reader = new CharArrayReader("hello world".toCharArray())){
        int len;
        char[] chs = new char[1024];
        while ((len = reader.read(chs)) != -1) {
            System.out.println(new String(chs, 0, len));
        }
}

4.6 CharArrayWriter

该类可以将数据输出至一个字符数组

try(CharArrayWriter charArrayWriter = new CharArrayWriter()){
        charArrayWriter.write("hello world".toCharArray());
        char[] chs = charArrayWriter.toCharArray();
        System.out.println(new String(chs));
}

4.7 BufferedReader

该类的使用和普通Reader一样,增加了一个readLine函数,可以一次性读取一行文本数据,它在读取数据时会一次性读取多个字符的数据放在cb字符数组中。

try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("/Users/hws/Desktop/test.txt"),"UTF-8"))) {
        String str;
        while ((str = bufferedReader.readLine())!=null){
            System.out.println(str);
        }
}

4.8 BufferedWriter

该类的使用和普通Writer一样,不过他在写数据时会先将数据写入cb字符数组缓存中,等到缓冲区满时再一次性将缓冲区数据写入磁盘。

try (BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("/Users/hws/Desktop/test.txt"),"UTF-8"))) {
        bufferedWriter.write("hello world");
        bufferedWriter.flush();
}

4.9 InputStreamReader

该类继承自Reader,它作为字节输入流到字符输入流转换的一个桥梁,构造函数接收一个InputStream对象,同时可以指定字节流转换成字符流过程中使用的字符编码。我们可以在此指定字符流的编码,它在内部读取流时会自动的帮我们将字节流转换成字符流。如下是以GBK读取磁盘中的文件。

try (InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("/Users/hws/Desktop/test.txt"),"GBK")) {
        int len;
        char[] chs = new char[1024];
        while ((len = inputStreamReader.read(chs)) != -1) {
            System.out.println(new String(chs, 0, len));
        }
}

4.10 OutputStreamWriter

该类继承自Writer,它作为字节输出流到字符输出流转换的一个桥梁,构造函数接收一个OutputStream对象,同时可以指定字符输出转换成字节过程中使用的编码。我们可以在此指定字符流的编码,以GBK编码将数据保存至磁盘中。

try (OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("/Users/hws/Desktop/test.txt"),"GBK")) {
        outputStreamWriter.write("hello world");
        outputStreamWriter.flush();
}

5、管道输入输出流

管道输入输出流一般用于多个线程中数据的传递。有关代码可以在此查看:
https://github.com/linpeng123l/pipedstream

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值