java_关于File类型,递归思想及IO流(文件字节流,缓冲流,数据字节流,对象流,字符流和其子类中的转换流,字符流的缓冲流,System)

一.File类型
java.io.file类型,可以对硬盘上的文件以及目录进行操作,如查看文件/目录的属性信息,创建,删除文件/目录,此类型不能查看,修改文件里的内容,若需要修改,应该使用输入/输出流

二.常用构造器:

File(String pathname) 
    指定一个路径,创建一个File对象
File(File parent, String child)
    在指定parent路径下创建一个child的File对象
File(String parent, String child)
    在指定parent路径下创建一个child的File对象

路径:
    (1)文件的路径,写到文件的扩展名
    (2)目录的路径,写到当前目录的名称

绝对路径与相对路径:
    绝对路径:是从根目录开始写的
        window:从盘符开始    例:D:\a\f1.txt
        Linux:  /home/scott/f1.txt
    相对路径:相对某一文件或目录的路径
        reg:f2.txt相对于a目录的路径
            window: b\f2.txt
            Linux:  b/f2.txt
        reg:f3.txt相对于f2.txt的路径
            window: ..\c\f3.txt

三.常用方法:

boolean exists();
    判断指定路径的对象是否存在
boolean isFile()
    判断是否是普通文件
boolean isDirectory()
    判断是否是目录
String getName()
    获取文件/目录名
long lastModified()
    返回最后修改时间距离纪元毫秒数
boolean isAbsolute()
    是否是绝对路径
String getAbsolutePath()
    获取绝对路径(字符串形式)
String getParent()
    获取父目录路径
long length()
    查看文件内大小(字节数)
boolean createNewFile()
    创建一个空的文件
boolean mkdir()
    创建由此抽象路径名命名的目录。
boolean mkdirs()
    创建由此抽象路径名命名的多级目录。
boolean delete()
    删除文件,目录,删除目录时,目录下不能有文件或子目录
File[] listFiles()
    返回目录下的File对象

递归:
递归思想:分成递与归.一层层递进,一层层归
两种递归:
(1)方法自己调用自己
(2)方法A调用方法B,方法B调用了方法A

=================================================
IO流:(input/output)
我们在做项目时,处理自定义的一些数据外,还可能需要从外界引入数据或将数据导出到外界,这时,我们需要I/O操作

外界:指的可能是 键盘,显示器,硬盘,另外一个程序

输入:读入
数据从外界流向程序
输出:写出
数据从程序流向外界

流:
就是数据序列,一经创建成功,就会打开一个通道,所以使用完应该进行关闭操作

IO流的分类:
(1)按流向分类:
输入流
输出流
(2)按处理的数据单位分类
字节流
字符流
(3)按功能分类:
节点流:直接连接两个设备的流对象
处理流:对节点流再次封装与处理的流类型

=================================================
字节流:
抽象父类:InputStream/OutputStream

文件字节流:
FileInputStream/FileOutputStream

构造器:

    FileInputStream(File file) 
        创建一个指定路径的File对象的文件输入流对象 
    FileInputStream(String name) 
        创建一个用于指定路径的字符串的文件输入流对象

常用方法:

        int read()
            读取该流中的字节数据,即8位二进制,返回一个int类型低八位的数据,如果文件返回-1,读至文件末尾
    `
        long skip(long n)
            跳过n个字节
        int read(byte[] b)
            读取字节存取byte数组中,最多b.length个
            返回实际读取的字节个数
        int available()
            返回剩余此输入流中剩余的字节数

输出流
构造器

    FileOutputStream(File file)
    FileOutputStream(File file, boolean append)
    FileOutputStream(String name)
    FileOutputStream(String name, boolean append)
创建一个指定输出流的对象,append表示在文件末尾追加
PS:如果指定的路径不存在,会自动创建

常用方法:

        void write(int b)
            写成参数b的一个字节,int类型的低八位
        void write(byte[] b)
            将字节数组b按字节顺序写出
        void write(byte[] b,int off,int length)

=================================================
缓冲流:
BufferedOutputStream:字节缓冲输出流
在写数据时,若一个一个写,次数多,效率就低
如何提高效率呢?

缓冲输出流的特点:
在流里维护了一个缓冲区,写字节时,先将字节写入缓冲区,当缓冲区满时,在一次性将数据写入文件,这样就降低了写的次数,也就提高了效率

因此缓冲输出流,缺少即时性,可以使用flush方法进行冲刷

常用构造器:

    BufferedOutputStream(OutputStream out)
        创建一个指定字节输出流的缓冲流对象
    BufferedOutputStream(OutputStream out, int size)
        创建一个指定字节输出流的缓冲流对象,并设置缓冲区大小

PS:当一次性写的字节超出缓冲区大小时,不使用缓冲区,直接将字节数组写入文件中

常用方法:

    void flush()
        刷新缓冲输出流。
    void write(byte[] b, int off, int len)
        从指定的字节数组写入len个字节,从off开始到缓冲区。
    void write(int b)
        将指定的字节(int数据的低八位)写入缓冲区。



BufferedInputStream:字节缓冲输入流

在读取字节时,也是一个一个字节读,次数多,效率低,使用缓冲输入流,内部维护了一个缓冲区,先将缓冲区装满,再读取,同时刷新缓冲区,效率高

常用构造器:

    BufferedInputStream(InputStream in) 
    BufferedInputStream(InputStream in, int size)

常用方法

    int read(byte[] b);
        读取缓冲区中的字节,当一次性读取的字节超出缓冲区大小,不使用缓冲区,直接从文件读,一次性读取的数据小于缓冲区时,从缓冲区里读数据,效率高
    int read(byte[] b, int off, int len)

=================================================
数据字节流
与缓冲流一样,父类都是过滤字节流
DataOutputStream/DataInputStream

这两个类提供了几个特殊的方法,可以直接写基本数据类型
DataOutputStream:
数据输出流
构造器:

    DataOutputStream(OutputStream out)
        创建一个指定字节输出流的数据输出流对象

常用方法:

    处理提供些一个字节,数组的方法外,还提供了如下方法
    writeByte(int b)
    writeShort(int s)
    writeInt(int i)
    writeLong(long l)
    writeFloat(float f)
    writeDouble(double d)
    writeChar(int c)
    writeBoolean(boolean b)
    writeBytes(String str):会出现精度损失,不推荐使用
    writeUTF(String s)

DataInputStream:有和DataOutputStream对应的读数据的方法

==============================================================
对象流:
有的时候,我们需要将内存中的对象持久化到硬盘上,或将硬盘中的对象信息读到内存中,这就需要使用对象输入输出流

序列化:是对象转换成一个字节序列的过程(写,输出)
反序列化:一个字节序列转换成对象的过程(读,输入)

ObjectOutputStream
构造器:
protected ObjectOutputStream(OutputStream out)
创建一个指定字节输出流的对象输出流对象

常用方法:
    除了提供了一些基本数据类型的输出方法外,还提供了
    void writeObject(Object obj)
        将内存中的对象持久化到硬盘上

ObjectInputStream
构造器:
protected ObjectInputStream(InputStream in)
创建一个指定字节输入流的对象输入流对象

常用方法:
    除了提供了一些基本数据类型的输入方法外,还提供了
    void readObject()
        将硬盘上的字节序列转换成对象

Serializable:序列化接口
若想将对象序列化,对象类型必须实现此接口,没有就是个序列化标识

serialVersionUID:
每个能被序列化的对象,在被序列化时, 系统会默认给对象的类计算一个序列化版本号,不同的平台默认提供的序列化版本号多数情况下不同反序列时,存储对象的版本号与当前设计的版本号不一致,运行时异常:
java.io.InvalidClassException,不兼容问题

手动提供版本号,以解决该问题

另一种情况:
当序列化过后,可能会修改类型,若使用系统默认提供的版本号,在反序列化时,会有异常,手动提供不会有异常,多出的成员变量,以默认值的形式赋值给反序列化的对象

transient:成员变量的一个修饰词(瘦身)
有的时候,在序列化对象时,我们不需要讲对象的某些成员变量的值持久化到硬盘上(因为不重要),此时,我们可以在,这些成员变量前添加修饰词transient,(保存时,不存储)

=================================================
字符流:
在输出,输入时,以字符为单位进行操作,默认是unicode编码集
字符流的抽象父类
Writer/Reader

Writer提供了字符输出流的常用方法
    void close()
    void write(char[] cbuf) 
        写入一个字符数组。
    void write(char[] cbuf, int off, int len)
        写入字符数组的一部分。
    void write(int c)
        写一个字符
    void write(String str)
        写一个字符串
    void write(String str, int off, int len)
        写一个字符串的一部分。
Reader提供了字符输入流的常用方法
    void close()
    int read()
        读一个字符,存储到int的低16位
    int read(char[] cbuf)
        将字符(数据)读入数组cbuf中。
    int read(char[] cbuf, int off, int len)
        将字符读入数组cbuf的一部分。

=================================================
子类中的转换流:
OutputStreamWriter:
将字符转换成字节写出到硬盘上

    构造器
    OutputStreamWriter(OutputStream out) 
        创建一个指定字节输出流的字符输出流对象,采用系统默认的编码集
    OutputStreamWriter(OutputStream out, Charset cs) 
    OutputStreamWriter(OutputStream out, CharsetEncoder enc) 
    OutputStreamWriter(OutputStream out, String charsetName) 
        创建一个指定字节输出流的字符输出流对象,采用指定编码集

    常用方法:
        void write(int c) 
            写一个字符,当c的低16位被设计成字符时,若2个字节都是有效字节,输出2个;若低16位的有效字节只有一位时,只输出一个

InputStreamReader:
将字节转换成字符读到程序中

    构造器
    InputStreamReader(InputStream in) 
        创建一个使用默认字符集的InputStreamReader。
    InputStreamReader(InputStream in, Charset cs) 
    InputStreamReader(InputStream in, CharsetDecoder dec) 
    InputStreamReader(InputStream in, String charsetName) 
        创建一个使用指定字符集的字符输入流对象

=================================================
缓冲流:

PrintWriter:提供了丰富的方法,比BufferedWriter更常用,提供了自动行刷新的功能

构造器:
PrintWriter(File file) 
PrintWriter(OutputStream out)
PrintWriter(OutputStream out, boolean autoFlush) 
PrintWriter(String fileName) 
PrintWriter(Writer out) 
PrintWriter(Writer out, boolean autoFlush) 

上述构造器有第二个参数的,可以设置为true,行自动刷新;只有一个参数的构造器,相当于两个参数,设置为false的情况,即取消了行自动刷新

常用方法:
void println() 
通过写入行分隔符字符串来终止当前行。  
void println(boolean x) 
打印一个布尔值,然后终止该行。  
void println(char x) 
打印一个字符,然后终止该行。  
void println(char[] x) 
打印字符数组,然后终止行。  
void println(double x) 
打印双精度浮点数,然后终止行。  
void println(float x) 
打印一个浮点数,然后终止该行。  
void println(int x) 
打印一个整数,然后终止该行。  
void println(long x) 
打印一个长整型,然后终止行。  
void println(Object x) 
打印一个对象,然后终止该行。  
void println(String x) 
打印一个字符串,然后终止行。  

BufferedReader:提供了缓冲区

构造器:
BufferedReader(Reader in) 
创建使用默认大小的输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz) 
创建使用指定大小的输入缓冲区的缓冲字符输入流。

常用方法:
    String readLine()
        读一行文字。(读至换行符号为止,读到的数据不包括换行符)
    返回值为null时,读至文件末尾

=================================================
文件字符流:
FileWriter/FileReader

FileWriter:相当于OutputStreamWriter与FileOutputStream合起来的功能,内部也维护了一个缓冲区,但是需要手动flush

构造器:
FileWriter(File file) 
FileWriter(File file, boolean append)
FileWriter(String fileName) 
FileWriter(String fileName, boolean append)

append:表示追加,但是不能设置字符集
常用方法与OutputStreamWriter的差不多


FileReader:相当于InputStreamReader与FileInputStream合起来的功能,内部也维护了一个缓冲区

常用构造器:
FileReader(File file) 
FileReader(String fileName) 

常用方法与InputStreamReader的差不多

=================================================
System是一个final修饰的类型
两个成员变量
out:PrintStream类型,默认的输出目的地是控制台console
in:InputStream类型,默认的数据源是键盘

猜你喜欢

转载自blog.csdn.net/yc_hen/article/details/82082301