java基础_IO流学习总结

java基础_IO:


一、什么是流?
流就是字节序列的抽象概念,能被连续读取数据的数据源和能被连续写入数据的接收端就是流,流机制是Java及C++中的一个重要机制,通过流我们可以自由地控制文件、内存、IO设备等数据的流向。而IO流就是用于处理设备上的数据,如:硬盘、内存、键盘录入等。


二、IO流的分类
根据处理数据类型的不同分为:字符流和字节流
根据数据流向不同分为:输入流和输出流


IO包的核心:输入输出流
InputStream
OutputStream
Reader
Writer
InputStream和Reader 是输入流,输入是站在程序的角度而言。
例:程序从文件读取数据。
OutputStream和Writer是输出流,输出也是站在程序的角度。
例:程序将当前状态保存到文件。
FileInputStream
文件输入流。
FileOutputStream
文件输出流


三.Flie类
File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。  
构造方法摘要:
File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 
File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 
File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 
File(URI uri) 通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。
File的重要方法:
createNewFile() ,如果我们这个文件不存在,那么创建一个到本地系统。
exists(),获取此文件是否存在。存在返回true,否则为false。
delete() ,删除此File对象所映射的真实文件。
getAbsolutePath() ,获取此对象的绝对路径。
isDirectory() ,判断该File对象,是不是目录(文件夹)。
isFile(),判断该File对象,是不是文件(不是文件夹)。
File(目录)的方法:
mkdir() ;创建目录,但是如果父目录不存在,就无法创建
mkdirs() ;创建目录,如果没有父目录,就连父目录一起创建


list(),listFile(); 获取出子文件。


四、字节流(以字节为单位往外读)
1.输入字节流InputStream
InputStream 是所有的输入字节流的父类,它是一个抽象类。
ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。
ObjectInputStream 和所有FilterInputStream 的子类都是装饰流(装饰器模式的主角)。
 
2.输出字节流OutputStream
OutputStream 是所有的输出字节流的父类,它是一个抽象类。
ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。PipedOutputStream 是向与其它线程共用的管道中写入数据,
ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流。


五、字符流 
-- Reader(读)
read():这个read方法将给予我们以char为单位的数据读取能力。
skip():跳过。
close():关闭流。
-- Writer(写)
append():添加字符
write():以字符为单位写入数据。
flush(),close():输出流在关闭前,记得flush。
a.Reader:
--InputStreamReader
--FileReader:用于处理文件的字符读取流对象 Writer
Reader中常见的方法:
--int read()  读取一个字符,并返回读到的这个字符,读到流的末尾则返回-1。
--int read(char[])  将读到的字符存入指定的数组中,返回的是读到的字符个数,读到流的末尾则返回-1。
--close()  读取字符其实用的是window系统的功能,就希望使用完毕后,进行资源的释放。
FileReader除了自己的构造函数外没有特有的方法:
--用于读取文本文件的流对象。
--用于关联文本文件。
--构造函数FileReader(String fileName) 
注:在读取流对象初始化时,必须要指定一个被读取的文件, 如果该文件不存在则会发生FileNotFoundException异常。
b.Writer:
--OutputStreamWriter
--FileWriter:用于处理文件的字符写入流对象
Writer中常见的方法:
--write()  将一个字符写入到流中。
--write(char[])  将一个字符数组写入到流中。
--writer(String) 将一个字符写入到流中。
--flush()  刷新流,将流中的数据刷新到目的地中,流还存在。
--close()  关闭资源,在关闭钱会先调用flush(),刷新流中的数据到目的地。
FileWriter,除了自己的构造函数外没有特有的方法:
--该类的特点:1.用于处理文本文件。2.没有默认的编码表。3.有临时缓冲。4.构造函数,在写入流对象初始化时,必须要有一个存储数据的目的地。
FileWriter(String fileName),该构造器是干什么用的呢?
--调用系统资源 
--在指定位置创建一个文件,如果该文件已经存在则被覆盖。 
--FileWriter(String filename,Boolean append),这构造器的作用是当传入的boolean类型的值为true时,会在指定文件末尾处进行数据的续写。 
其实很容易就可以看出来,IO体系中的子类名后缀绝大部分是父类名称,而前缀则是体现子类特有功能的名称。


六、字节流和字符流的区别:
字符流,因为文件编码的不同,就有了对字符进行高效操作的字符流对象,它的原理就是基于字节流读取字节时去查了指定的码表。
它和字节流的区别有两点:
1.在读取数据的时候,字节流读到一个字节就返回一个字节,字符流使用了字节流读到一个或多个字节(一个中文对应的字节数是两个,在UTF-8码表中是3个字节)时,先去查指定的编码表,再将查到的字符返回;
2.字节流可以处理所有类型的数据,如jpg、avi、mp3、wav等等,而字符流只能处理字符数据。所以可以根据处理的文件不同考虑使用字节流还是字符流,如果是纯文本数据可以优先考虑字符流,否则使用字节流。


例1:将文本数据保存到文件中代码   
private static void test1(){ 
    FileWriter fw=null; 
    try { 
        //初始化FileWriter对象,指定文件名已经存储路径 
        fw=new FileWriter("D:/test.txt"); 
        fw.write("将字符串写入流"); 
        //将流中的数据刷新到目的地,流还在 
        fw.flush(); 
        fw.write("将字符串写入流"); 
    } catch (IOException e) { 
        e.printStackTrace(); 
    }finally{ 
        if(fw!=null){ 
            try { 
                fw.close(); 
            } catch (IOException e1) { 
                e1.printStackTrace(); 
            } 
             
        } 
    } 



例2:读取一个已有文本文件,并将文本内容打印出来代码   
private static void test2(){ 
    FileReader fr=null; 
    try { 
        //初始化FileReader对象,指定文件路径 
        fr=new FileReader("D:/test.txt"); 
        int ch=0; 
        while((ch=fr.read())!=-1){ 
            //每次读取一个字符,直到读到末尾-1为止 
            System.out.println((char)ch); 
        } 
    } catch (IOException e) { 
        e.printStackTrace(); 
    }finally{ 
        if(fr!=null){ 
            try { 
                fr.close(); 
            } catch (IOException e1) { 
                e1.printStackTrace(); 
            } 
             
        } 
    } 



七、缓冲流:
BufferedInputStream
BufferedOutputStream
BufferedReader(特有方法newLine(),跨平台的换行符。)
BufferedWriter(特有方法readLine(),一次读一行,到行标记时,将行标记之前的字符数据作为字符串返回,读到末尾返回null。)
当然缓冲字符流中,我们还能看到几个不过的新方法:
1.缓冲标记
标记:mark(int)
回到标记:reset() 
2.整行读取
读取:readLine() 
写入:newLine()


例3:使用缓冲区对文本文件进行拷贝代码   
private static void test4(){ 
    BufferedReader bufr=null; 
    BufferedWriter bufw=null; 
    try { 
         
        bufr=new BufferedReader(new FileReader("D:/a.txt")); 
        bufw=new BufferedWriter(new FileWriter("D:/b.txt")); 
        String line=null; 
        while((line=bufr.readLine())!=null){ 
            bufw.write(line);//每次将一行写入缓冲区 
            bufw.flush();//刷新到目的地 
        } 
    } catch (IOException e) { 
        e.printStackTrace(); 
    }finally{ 
        try {
//关闭流 
            if(bufw!=null){ 
                bufw.close(); 
            } 
            if(bufr!=null){ 
                bufr.close(); 
            } 
        } catch (IOException e1) { 
            e1.printStackTrace(); 
        } 
    } 



八、转换流
--OutputStreamWriter
--InputStreamReader
转换流的特点:
其是字符流和字节流之间的桥梁
可对读取到的字节数据经过指定编码转换成字符
可对读取到的字符数据经过指定编码转换成字节
何时使用转换流?
当字节和字符之间有转换动作时;
流操作的数据需要编码或解码时。
具体的对象体现:
InputStreamReader:字节到字符的桥梁
OutputStreamWriter:字符到字节的桥梁


九、数据流
数据流主要为实现可以存取Java原始数据类型如long,boolean
数据流是字节流
--DataOutputStream
--DataInputStream
DataInputStream需要和InputStream套接
        DataOutputStream需要和OutputStream套接
    DataInputStream方法:
readBoolean() readInt() read……()……
    readUTF():
网络传输常用方法
读一个Unicode字符串
    DataOutputStream方法与DataInputStream基本对应为写的方法


    //此构造函数等于已可以往一个字节数组里输入内容
    ByteArrayOutputStream baos = new ByteArrayOutputStream ();


    //此方法为获取一个字节数组方法返回字节数组
    baos.toByteArray();


    //此方法获取字节数组占了多少字节
    new ByteArrayInputStream(一个字节数组)。


    available()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值