I/O流笔记

2019-07-14  本文已影响0人  白桦树97

一: 万物皆字节

//若追加,则构造方法第二个参数为true
 FileOutputStream fos = new FileOutputStream("/Users/haogege/Desktop/a.txt",true);
//写入a
 fos.write(97);
//写入abcd
 byte[] b = {97,98,99,100};
 fos.write(b);
//写入bc
fos.write(b,1,2);
//写入换行符
fos.write("\r\n".getBytes());
//写入我爱你
byte[] b = "我爱你".getBytes();
fos.write(b);
//关闭流
fos.close();

三:读文件 (读比较神奇,读完指针会向后移动一位)

  1. 一次读出一个字节,若没有则返回-1
 FileInputStream fis = new FileInputStream("/Users/haogege/Desktop/a.txt");
        int len = fis.read();
        System.out.println(len);
        len = fis.read();
       //将一个字节转化为char
        System.out.println((char)len);
        len = fis.read();
        System.out.println(len);
  1. 循环一次读出一个
 int len = 0;
 while((len = fis.read())!=-1){
         System.out.println(len);
  }

注意:若存入一个汉字“我”,则会读出多个字节 230 136 145 (GBK编码 2个字节,utf-8 三个字节)

  1. 一次读取多个 (指针一次移动多位)
FileInputStream fis = new FileInputStream("/Users/haogege/Desktop/a.txt");
        byte[] b = new byte[2];
        int len = fis.read(b);
        System.out.println(Arrays.toString(b));
       //骚操作
        System.out.println(new String(b));

注意:读取多个到b缓冲区. 这里的len指的是读了几个字节
4.最佳方案。

        byte[] b = new byte[1024]; 
        int len = 0;
        while((len= fis.read(b))!=-1){
//如果不加 0 和len 也没毛病,就是byte数组后面会有一堆空的
            System.out.println(new String(b,0,len));
        }

5.复制文件。

FileInputStream fis = new FileInputStream("/Users/haogege/Desktop/a.txt");
        FileOutputStream fos = new FileOutputStream("/Users/haogege/Desktop/b.txt");
        byte[] b = new byte[2];
        int len = 0;
        while((len= fis.read(b))!=-1){
            fos.write(b,0,len);
        }
       fis.close();
       fos.close();

6.使用字节流存在的小问题。

 FileInputStream fis = new FileInputStream("/Users/haogege/Desktop/a.txt");
        int len = 0;
        while((len= fis.read())!=-1){
            System.out.println((char)(fis.read()));
        }
        fis.close();

7.使用字符流。(以字符的形式读写)

抽象类 Writer和Reader 使用子类 File,

FileWriter fis = new FileWriter("/Users/haogege/Desktop/a.txt");
        fis.write(97);
        fis.flush();
        fis.write(88);
        fis.close();

注:flush和close()的区别。
- 均可将数据从缓冲区刷到硬盘
- close使用后流不可以再使用。

  1. 写入char数组,和字符串
        char[] a = {'a','b','c'};
        fis.write(a);
        fis.flush();
        fis.write("我爱你");
        fis.close();

未完待续。。 properties加载和buffer

上一篇 下一篇

猜你喜欢

热点阅读