IO流

文件输入输出流

1.文件字节类

FileInputStreamFileOutputStream都属于字节流
FileInputStream的父类是InputStream(抽象类)
FileOutputStream的父类是OutputStream(抽象类)
(1)创建流:三种构造方法的重载

```cpp
InputStream fis= new FileInputStream("d:/readme.txt");
        OutputStream fos=new FileOutputStream("d:/readme2.txt");
 File file=new File("d:/readme.txt");
        File file1 =new File("d:/readme2.txt");
        InputStream fis2= new FileInputStream(file);
        OutputStream fos2=new FileOutputStream(file1);
 InputStream fis1= new FileInputStream(new File("d:/readme.txt"));
        OutputStream fos1=new FileOutputStream(new File("d:/readme2.txt"));

(2)使用流
文件的读写操作必须要有一个中转站,不能一步完成读写操作。所以在进行读写操作时要首先创建一个中转站。

int m=fis.read();

这段代码中int m就相当于一个中转站。因为文件是按字节读的,所以fis.read()方法放回的就是读到的字节数。

fos.write(m);

fos.write(m);就会把刚才的读到字节写到你指定的文件中。这样利用循环就可以实现一个文件的读写。

但上面的方法,中转站太小了,对于读取较大文件,效率较低。所以可以换一个较大的中转站。使用下面的方法

byte[] buf=new byte[1024];
        int n=fis.read(buf);
        do{
             fos.write(buf,0,n);
             n=fis.read(buf);
        }while(n!=-1);

这里使用了字节数组,数组的长度时1024。
注意n=fis.read(buf);方法,这也属于read方法的重载,他会把读到的内容放入到buf数组中,并放回读到的字节数。这里的n可以控制最后一次度数据时的长度,防止多读占据空间。

2.文件字符流

FileReaderFileWriter都属于字符流
FileReader父类是Reader(抽象类)
FileWriter父类是Writer(抽象类)
方法与基本字节类的输入输出流的相同。

 Reader fr=new FileReader("d:/readme.txt");
        Writer fw=new FileWriter("d:/readme2.txt",true);

这里解释一下

Writer fw=new FileWriter("d:/readme2.txt",true);

当我们不加后面的true,对就是对文件的覆盖。加上true这个参数时就是文件的追加。如果你的readme2.txt文件中每有字符的话,追加就不会生效。

public static void main(String[] args)  {
        Reader fr=null;
        Writer fw=null;
        try{
            //在业务上有逻辑的代码,可以写在一个try中
             fr=new FileReader("d:/readme.txt");
             fw=new FileWriter("d:/readme2.txt",true);

            char[] cbuf=new char[1024];
            int n=fr.read(cbuf);
            while(n!=-1){
                fw.write(cbuf,0,n);
                n=fr.read(cbuf);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            //关闭流应该分开,写两个try
            try {
                if(fr!=null){
                    fr.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (fw!=null){
                    fw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

1.只有字节流,没有字符流,字符流的底层还是字节流。字符流是对字节流的封装转换,更利于操作。
2.字节流可以处理任何类型的文件,而字符流只能操作文本文件
3.关闭流要分开处理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值