IO流总结

IO流概述

可以将数据传输的操作,看作一种数据流动,按照流动的方向分为输入Input和输出Output。

Java中的IO操作主要指的是Java.io包下的一些常用类的使用。这些常用类通常操作的是对数据的读取(输入Input)和写出(输入Output)。

使用总结:只要处理纯文本数据,就优先考虑使用字符流。除此之外都使用字节流。

io.File

操作的是对文件的

创建:creatNewFile()、mkdir()、mkdirs()

删除:delete()

获取大小:length()

获取名称;getName()

获取路径:getAbsolutePath()、

得到文件数组:listFile()

......

IO流的分类

按照流的方向来分

输入流和输出流

按照流动的数据类型来分

字节流和字符流

字节流

           输入流:顶级父类-InputStream

           输出流:顶级父类-OutputStream

字符流

           输入流:顶级父类-Reader

           输出流:顶级父类-Writer

字节流

输出流:顶级父类-OutputStream

将内存中的变量写到文件中

常用方法:

close() : 关闭流

flush():刷新缓冲

write(byte[] b)  :写出一个字节数组的所有内容

write(byte[] b,int off ,int len)  :写出一个字节数组,从off下标开始,写len个

write(int b)  :虽然传的是int,当作字节使用

最常用子类:FileOutputStream,其他所有子类写出的方法都是上面的write(..)方法;

每个FileOutputStream对象就表示向某个文件输出的流管道,可以通过对象向指定文件输出内容

使用方法:

直接创建对象,没有文件自动创建文件:

1.一次写一个字节

FileOutputStream fos = new FileOutputStream("C://a.txt");//new对象

fos.write(65);//写1个字节  字节65对照askII码表对应为'A'
fos.close();//关闭流

2.一次写一个字节数组 

FileOutputStream fos = new FileOutputStream("C://a.txt");//new对象
byte[] b = {65,66,67,68,69}//创建一个字节数组
fos.write(b);//写出1个字节数组
fos.close();//关闭流

3.追加模式写 

FileOutputStream fos = new FileOutputStream("C://a.txt",true);//new对象,追加模式
byte[] b = {65,66,67,68,69}//创建一个字节数组
fos.write(b);//写出1个字节数组
fos.close();//关闭流

没有追加的话(append=true),每次写出都会清空原文件内容

4.一次写一个字节数组的一部分

FileOutputStream fos = new FileOutputStream("C://a.txt");//new对象
byte[] b = "ABCDEFG".getBytes();//创建一个字节数组,这里调用了字符串的getBytes()方法将字符串转换成了字节数组
fos.write(b,1,2);//写出1个字节数组的一部分,从1下标开始写,写两个元素
fos.close();//关闭流

输入流:顶级父类-InputStream

将硬盘中文件的内容读到程序中来

常用方法:

close() : 关闭流

flush():刷新缓冲

read():从文件中读取一个字节数据

read(byte[] b):将文件中的内容读取到字节数组中

最常用子类:FileInputStream

使用方法:

FileInputStream fis = new FileInputStream("C://a.txt");//创建对象,准备从C盘下的a.txt里面读内容,假设a.txt里面内容是 abcde 
byte b = (byte) fis.read();//读取一个字节,返回是int类型需强转
System.out.println(b);//97   与a对应
//可以转成字符再打印
System.out.println((char)b);//a
byte b1 = (byte) fis.read();//再读取一个字节,返回是int类型需强转
System.out.println(b1);//98  与b对应
fis.close();

可以看到每次只能打印1个字节,解决办法,利用循环

FileInputStream fis = new FileInputStream("C://a.txt");//创建对象,准备从C盘下的a.txt里面读内容,假设a.txt里面内容是 abcde 
while(true){
    byte b = (byte)fis.read();
    if(b==-1){//读到空的内容会返回-1
        break;
    }
    System.out.println((char)b);//abcde
}
fis.close();

 一次读一组字节(常用)

FileInputStream fis = new FileInputStream("C://a.txt");//创建对象,准备从C盘下的a.txt里面读内容,假设a.txt里面内容是 abcdefghijklmnopqistuvwxyz 
//按照字节数组的长度进行读取
byte[] b = new byte[10];//创建个长度10的字节数组
//注意:每次读取的字节长度返回为int类型的变量
int len = fis.read(b); //读取10个结果并放到数组中。结果是abcdefghij
System.out.print(new String(byte,0,len));//通过字节数组创建字符串,从0下标,创建len个内容10
len = fis.read(b); //读取10个结果并放到数组中。结果是klmnopqist
System.out.print(new String(byte,0,len));//通过字节数组创建字符串,从0下标,创建len个内容10
len = fis.read(b); //读取6个结果并放到数组中。结果是uvwxyz
System.out.print(new String(byte,0,len));//通过字节数组创建字符串,从0下标,创建len个内容6
fis.close();

字符流

 输入流:顶级父类-Reader

常用方法:

close() : 关闭流

flush():刷新缓冲

read():读取一个字符,读取一组字符,注意:返回值int,返回的是读取的字符个数,如果读到文件尾部时返回-1

最常用子类:FileReader

输出流:顶级父类-Writer

常用方法:

close() : 关闭流

flush():刷新缓冲

write():这个方案可以传的参数有字符、字符数组、字符数组的一部分、字符串、字符串的一部分

append():追加一段文字,可以一直.append

最常用子类:FileWrite

转换流

将字节流转换为(装饰为)字符流:使用了装饰者设计模式

InputStreamReader  :将字节输入流转换为字符输入流

public class InputStreamReaderDemo {
    public static void main(String[] args) throws IOException {
        //将字节流转换为字符流
        FileInputStream fis = new FileInputStream("D://a.txt");//假设这行代码是你从服务器获取到的字节流数据
        InputStreamReader isr = new InputStreamReader(fis,"UTF-8");//参数1:是需要转换的对象,参数2:可以指定编码格式
        while (true){
            int c = isr.read();//read方法返回int类型,代表读取的字符个数,如果为-1,代表已经读完
            if (c == -1){
                break;
            }
            System.out.println((char) c);
        }
    }
}

OutputStreamWrite   :将字节输出流转换为字符输出流

public class OutputStreamWriteDemo {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("D://a.txt");
        OutputStreamWriter osw = new OutputStreamWriter(fos);
        osw.write("床前明月光");
        osw.flush();
        osw.close();
    }
}

方法2:采用打印流转换---PrintWriter

(字符输出)打印流

printStream
PrintStream printStream = new PrintStream("D://a.txt");
        printStream.println("哈哈哈");
        printStream.println("嘿嘿嘿");
PrintWriter----需要flush()刷新缓存
PrintWriter printWrite = new PrintWriter("D://a.txt");
        printWrite.println("哈哈哈哈");
        printWrite.flush();

缓存读取流

将字符输入流 转换为带有缓存 可以一次读取一行的缓存字符读取流

BufferedReader

可以读取一行字符 readLine();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值