Java基础——IO流(一)

体系

按照流的方向可分为:输入流(读取)和输出流(写出),按照操作文件类型可分为字节流和字符流,如图所示,蓝色方框为抽象类,黄色方框为其子类。

总结:

 

字节输入输出流

FileOutPutStream(字节输出流)

操作本地文件的字节输出流,可以把程序中的数据写到本地文件中

步骤:

1、创建字节输出流对象(使用有参构造方法)

a.参数是字符串表示的路径(自动创建File对象)或者File对象都是可以的

b.如果文件不存在会创建一个新的文件,但要保证父级路径是存在的

c.如果文件已存在,则会清空文件(因为默认续写开关是关闭的)

2、写数据

write方法的参数如果是整数,实际写到本地文件中的是整数在ASCII上对应的字符

3、释放资源

每次使用完流必须释放资源

写数据的三种方式:

续写:打开续写开关,在创建FileOutPutstream对象的第二个参数,默认是false,表示关闭续写,改为true表示打开续写

换行:写入换行符:\r\n

FileInPutStream(字节输入流)

操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来

字节流读取文件时,不要有中文

步骤:

1、创建字节输入流对象

如果文件不存在则直接报错(和输出流不同):因为没有文件,也就没有数据,无法写入

2、读数据

a.一次读一个字节,读出来的是数据在ASCII上对应的数字

b.读到文件末尾,read方法返回-1

3、释放资源

每次使用完流必须释放资源

FileInPutStream循环读取 

public static void main(String[] args) throws IOException {
    FileInputStream fis = new FileInputStream("D:\\Idea Projects\\myio\\a.txt");
    int b;
    while ((b = fis.read()) != -1) {
        System.out.println((char) b);
    }
    fis.close();
}

如果同时打开多个流,则先打开的后关闭

FileInPutStream读取的问题

FileInPutStream一次读取多个字节,返回值为读取的字节数

一次读取一个字节数组(一般为1024的整数倍)的数据,每次读取会尽可能把数组装满

read空参有参方法区别:

1、空参read返回的是字符对应的ASCII码值

2、有参read将读到字符解码再强转(相当于直接把字符放进buffer数组中),返回实际读取的字节数

相同:读到文件末尾都返回-1

try……catch异常处理

JDK7推出AutoCloseable接口,在特定情况下,可以自动释放资源

JDK7方案:

try后面的小括号中写创建对象的代码,只有实现了AutoCloseable接口的类,才能在小括号中创建对象

字符输入输出流

概述

字符流的底层起始就是字节流,字符流=字节流+字符集

特点:输入流:一次读一个字节,遇到中文时,一次读多个字节

           输出流:底层会被数据按照指定的编码方式进行编码,变成字节再写到文件中

使用场景:对于纯文本文件进行读写操作

FileReader(字符输入流)

1、创建字符输入流对象

如果文件不存在,则直接报错

2、读取数据

a.按字节进行读取,遇到中文,一次读多个字节,读取后解码,返回一个整数

b.读到文件末尾了,read方法返回-1

空参read方法细节:

1、默认也是一个字节一个字节读取,如果遇到中文就会一次读取多个,GBK一次读两个字节,UTF-8一次读三个字节

2、在读取之后,方法的底层还会进行解码并转成十进制,最终把这个十进制作为返回值,这个十进制也表示在字符集上的数字

有参read方法细节:

1、读取多个数据,并放到buffer数组中

2、读取数据+解码+强转三步合并,把强转以后的字符放到数组当中(相当于空参构造方法+强制类型转换)

3、返回实际读取的字符数

FileWriter(字符输出流)

构造方法

默认续写开关关闭(false)

成员方法

1、创建字符输出流对象

细节:(同FileOutPutStream字节输出流)

a.参数是字符串表示的路径或者File对象都可以

b.如果文件不存在则会创建一个新的文件,但是要保证父级路径是存在的

c.如果文件已经存在,则会清空文件,如果不想清空可以打开续写开关

2、写数据

细节:(类似FileOutPutStream字节输出流)

如果Write方法的参数是整数,实际上写到本地文件中的是整数在字符集上对应的字符

如果参数是字符或者字符串则会直接写入

3、释放资源

每次使用完流之后都要释放资源

应用 

用字节流拷贝文件,代码实现: 

//拷贝文件
public class test1 {
    private static void copydir(File src, File dest) throws IOException {//把src文件拷贝到dext文件夹
        dest.mkdir();//防止dest不存在
        //1.进入数据源
        File[] files = src.listFiles();
        //2.遍历数组
        for (File file : files) {
            if (file.isFile()) {//如果是文件则直接拷贝
                //3.判断文件,拷贝
                FileInputStream fis = new FileInputStream(file);
                FileOutputStream fos = new FileOutputStream(new File(dest, file.getName()));//在dest文件夹中创建和file同名的文件
                byte[] bytes = new byte[1024];
                int len;
                while ((len = fis.read(bytes)) != -1) {
                    fos.write(bytes, 0, len);
                }
                fos.close();
                fis.close();
            } else {
                //4.如果是文件夹,递归
                copydir(file,new File(dest,file.getName()));
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值