有趣的Java 8

来源:互联网 发布:夏普网络扫描仪工具 编辑:程序博客网 时间:2024/06/10 00:07

1. 读取文件


我新建了一个文本文档,内容如下:
abcabc

然后运行这段代码:
        String filePath = "C:\\Users\\Administrator\\Desktop\\新建文本文档.txt";        try (FileInputStream fileInputStream = new FileInputStream(filePath)) {            while (true) {                int result = fileInputStream.read();                System.out.println(result);                if (result == -1) {                    break;                }            }        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            System.out.println("读入或关闭流时发生IO异常,谁知道怎么处理吗?");        }

输出值:
9798991310979899-1

分别打印了 a b c 对应的 ASCII 值, 13 和 10 是回车键和换行键,-1 应该就是末尾标识。


2. 单字节读取和多字节读取


我把文本文档中数据,经过无数次复制粘贴后,通过单字节读取的方式,完全读入花费约 21 秒的时间。
然后将代码稍作改动:
   byte[] buffer = new byte[20];   while (true) {       int result = fileInputStream.read(buffer);       if (result == -1) {            break;       }   }
结果只花费了 1 秒左右。
我有做了几个测试,缓存区 10字节 花费 2 秒左右,缓冲区 200字节 花费 0.1 秒左右。

这说明了,对底层来说,单字节读取和多字节读取耗时是差不多的。
所以使用缓冲区是个好主意。


3. 多字节读取


将文本文档内容改为:
abcdefg

将代码改为:
 byte[] buffer = new byte[10];            while (true) {                int result = fileInputStream.read(buffer);                if (result == -1) {                    break;                } else {                    System.out.println("读取 " + result + "字节");                }                for (byte b : buffer) {                    System.out.println(b);                }            }

打印如下:
读取 10字节97989913101001011021310读取 1字节103989913101001011021310

第二次读取一个字节,覆盖了 buffer[0],其他不变。


4. FileReader 和 BufferReader


FileReader 用于多 char 读入,或者说字符流。
BufferReader 做了二级的缓存,具体不知,1G 以内数据读取中也没看出效率上的优势。
补充阅读:
http://www.cnblogs.com/skywang12345/p/io_23.html































0 0