java笔记33,IO流,缓冲流,复制文件,字符流

复制图片

磁盘——>内存——>输入流——>输出流——>输入流复制到输出流——>从内存写入磁盘
也就是说,需要读取磁盘到内存,在内存中复制,复制完了,写入磁盘

// 复制图片
// 一般来讲,人可以读明白的,使用字符流读写
//         人无法直接阅读的,使用字节流读写
public class test1 {
    public static void main(String[] args) throws IOException {
        // 先创建文件Newsky.jpg
        File nf=new File("D:\\Newsky.jpg");
        nf.createNewFile();

        // 再把文件读取到输出流
        FileOutputStream fos=new FileOutputStream(nf);

        // 创建输入流
        // 文件——>输入流——>内存——>复制到输出流——>输出流——>写入存储
        byte[] b1=new byte[1];
        FileInputStream fis=new FileInputStream("D:\\sky.jpg");

        // read方法如果读取失败,读取到尾部,返回-1
        while (fis.read(b1)!=-1)
        {
            fos.write(b1);
        }
        fis.close();
        fos.close();
    }
}

缓冲流

BufferedInputStream
BufferedOutputStream
缓冲流,我们在使用输入输出流的时候会发现
FileInputStream是对磁盘直接进行读写。如果我要把多个文件同时写到一个文件中呢?那就得写多次,每次追加,对磁盘的读写太频繁了。
缓冲流的作用是:对输入输出流进行读写,也就是在内存中读写输入输出流,有点指针那味。
读写IO流,把规整好的IO流一次性写入磁盘,比多次读写磁盘要快的多,(一个是内存读写,一个是磁盘读写,内存比磁盘快得多)

字符流:

汉字无论采用何种编码方式,第一个字节必定是负数
所以使用字符流就可以识别到汉字,并且对照字符表转换显示汉字
GB系列:又称为全角字符,把英文字母也重写编写成两个字节占一位
半角字符:原ASCII中大小一个字节占的字符

UTF-8和Unicode使用的并非固定字节大小,根据字符类型,而变换
UTF-8:英文字母一字节,拉丁文2字节,中文3字节,复杂不常用字符4字节
UTF-8是互联网的常用首选编码

字符流读写
InputStreamReader
OutputStreamWriter

// 字符流
public class test1 {
    public static void main(String[] args) throws IOException {
        // 打开文件
        FileOutputStream fos=new FileOutputStream("test2.txt");
        FileInputStream fis=new FileInputStream("test2.txt");

        // 创建字符流,还可以指定字符集
        // 指定字符集后,必须也用相应字符集的方式打开文件,才可以显现
        OutputStreamWriter osw=new OutputStreamWriter(fos,"GBK");
        osw.write("直接写字符,非常方便,不需要担心字符编码啥的");
        osw.close();
        fos.close();

        // 通过指定编码打开文件
        InputStreamReader isr=new InputStreamReader(fis,"GBK");
        // 一个int占四个字节,用来存储中文2-4字节是足够的
        int c;
        // 逐字符读取,也可以读取到数组
        while ((c=isr.read())!=-1)
        {
            // 再把四字节的数值转换成char
            System.out.print((char) c);
        }
        
        /* 用数组读取
         char[]t=new char[100];
        if(isr.read(t)!=-1)
            // 需要限制字符长度,否则就输出整个数组了
        System.out.println(t);
        */
        isr.close();
        fis.close();
    }
}

FileOutputStream fos=new FileOutputStream(“test2.txt”);
OutputStreamWriter osw=new OutputStreamWriter(fos,“GBK”);
等同于以下一句
FileWriter osw=new FileWriter (“test2.txt”)
有Writer同样也有reader,同样也有缓冲区方式

字符流有五种读写方式:单字符,char数组,char数组截取,string,string截取

getByte()转字节码,flush()刷新缓冲

可以有参,也可以无参,无参以平台默认编码方式,有参则按照指定参数转为字节码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值