输入输出流

1. 字节流

特点:最小操作单位为字节(byte)

1.1. InputStream抽象类

方法:

int read()从输入流读取下一个字节,返回0~255的值
int read(byte[] b)从输入流读取一堆字节,存储在b中,返回值为数组的长度。
int read(byte[] b, int off, int len)off为开始存储字节的数组下标,len为读到的字节个数。
void close()关闭流
int available() 可以从输入流中读取的剩余字节长度。while(dis.available()>0)

BufferedInputStream类

构造方法: BufferedInputStream(InputStream in)

FileInputStream类

构造方法:FileInputStream(File file) FileInputStream(String pathname)

SequenceInputStream类

特点:按顺序合并若干个流。 构造函数:

SequenceInputStream( Enumeration<? extends InputStream> e)
SequenceInputStream(InputStream s1,InputSteam s2)

ObjectInputStream类

构造方法:ObjectInputStream(InputStream in)

PipedInputStream类

特点:配合PipedOutputStream使用,避免两者在同一线程,会死锁。 构造方法:PipedInputStream(PipedOutputStream src) 方法: void connect(PipedOutputStream src) 联系两者

DataInputStream类

特点:写入基本数据类型 构造方法: DataInputStream(InputStream in) 方法:String readUTF() 修改版UTF-8格式读取

1.2. OutputStream抽象类

方法:

void write(int c)
void write(byte[] buf)
void write(byte[] b, int of, int len)
void close()
void flush()强制把缓冲区的数据写到输出流中,写入得时候只是把数据写入到当前流类的缓冲区内,而没有写入到流所指向的文件或者其他流中,所以需要flush以写入到目标源

FileOutputStream类

构造方法:

FileOutputStream(File file)
FileOutputStream(String name)
FileOutputStream(String name, boolean append)

前两种构造方法在向文件写数据的时将覆盖文件中原有的内容,FileOutputStream实例时, 如果文件不存在,则自动生成一个空的文件。如果路径不存在则报异常

PrintStream类

特点:永远不会抛出IOException 构造函数:

PrintStream(File file)
PrintStream(OutputStream out)
PrintStream(String fileName)

方法:

void print(基础数据类型)     
// 包括:boolean,char,char[],double,float,int,long,String,Object,保持数据的表现形式。
void write(int b)     //写入字节码为b的值,只保留int的后8位。

BufferedOutputStream类

构造方法: BufferedOutputStream(OutputStream out) 方法: void flush()

ObjectOutputStream类

构造:ObjectOutputStream(OutputStream) 方法:void writeObject(Object obj) 对象必须实现Serializable接口

PipedOutputStraem类

构造方法:PipedOutputStream(PipedInputStream snk) 方法: void connect(PipedInputStream snk)

DataOutputStream类

构造方法:DataOutputStream(OutputStream out) 方法:void writeUTF(String str) 修改版UTF-8格式写入

2. 字符流

特点:最小处理单元为2个字节的Unicode字符。有缓冲区。处理文字意外的数据会出错。

2.1. Writer抽象类

方法:

abstract void flush()     刷新流,把缓冲区的内容写入到目标文件
abstract void close()     关闭流,会先执行flush后关闭流。
void writer(char[] cbuf)
void write(char[] cbuf, int off, int len)      off为起始位置,len为长度。
void write(int c)     写入编号为c的字符。
void write(String str)
void write(String str, int off, int len)     写入字符串,off为起始下标,len为长度。

BufferedWriter类

构造函数:BufferedWriter(Write out) 创建一个缓冲输入流,效率高 方法:

void newLine()     新建一个依据系统的换行
void close()     Writer也会被关闭

OutputStreamWriter类

构造方法:

OutputStreamWriter(OutputStream out)
OutputStreamReader(OutputStream in, Charset cs)     Charset为编码表,"GBK","gbk","utf-8"

FileWriter类

构造方法:

FileWriter(File file)
FileWriter(String fileName)     如果不存在则自动创建,如果存在则会被覆盖。
FileWriter(String fileName, boolean append)     append为true时,可以续写。

PrintWriter类

构造方法:

PrintWriter(File file)
PrintWriter(OutputStream out)     可选项boolean autoFlush.printf,println,format方法将自动刷新
PrintWriter(String fileName)
PrintWriter(Writer out)     可选项boolean autoFlush.printf,println,format方法将自动刷新

2.2. reader抽象类

方法:

int read() 返回一个字符的号码0~65535,当到达末尾时返回-1
int read(char[] cbuf)     返回读取的个数,没有读取到或末尾则返回-1
// 例:条件:文件为"abcde",buf为char[3].
int num = fr.read(buf);
System.out.println(num + ":"+new String(buf)):      //输出3:abc   读取了三个字符,分别写入buf数组
int num1 = fr.read(buf);
System.out.println(num1 + ":"+new String(buf)):  //输出2:dec 读取了两个字符,覆盖了buf[0]和buf[1]
int num2 = fr.read(buf);
System.out.println(num2 + ":"+new String(buf)):     //输出-1:dec  没读取到字符,返回-1

BufferedReader类

构造函数: BufferedReader(Reader in) 方法: String readLine()读取一行文本,不包括换行符。没有下一行返回null,若没有换行符则会阻塞

InputStreamReader类

构造函数:

InputStreamReader(InputStream in)
InputStreamReader(InputStream in, Charset cs)     Charset为编码表,"GBK","gbk","utf-8"

FileReader类

构造方法:

FileReader(File file)     如果不存在,抛出异常
FileReader(String fileName)

LineNumberReader类

构造方法: LineNumberReader(Reader in) 方法:

int getLineNumber()     获取行号++
void setLineNumber(int lineNumber)     设置行号
String readLine()     读一行

3. Serializable接口

默认会计算出一个序号用以判断序列化反序列化时对象是否有改变。 建议显式声明一个Static final long的序列号,以避免默认生成高敏感性带来的问题。

3.1. 序列化和反序列化

把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。

4. RandomAccessFile类

特点:只能对文件进行操作。综合了输入和输出流。如果文件不存在,则创建,如果存在,不创建,使用原文件。用于多线程输出。 构造方法:

RandomAccessFile(File file,String mode) mode为r只读,rw读写
RandomAccessFile(String name ,String mode) 以name为路径的文件名

方法:

long getFilePointer()     返回当前指针的位置
void seek(long pos)     设置指针的位置

5. 装饰设计思想

BufferedWriter就是一种装饰类,运用的是装饰设计,与继承的差别在于,对于同一个功能的拓展,继承需要对每个子类都进行继承,会使体系越来越臃肿。而装饰只需要对父类或接口进行关联,就可以应用于所有子类,更灵活。 总结:装饰类比继承灵活。装饰类和被装饰类都必须所属同一个接口或父类。 阻塞式方法:必须等待输入数据可用或者检测到输入结束或者抛出异常,否则程序会一直停留在该语句上,不会执行下面的语句。

5.1. 将Iterator和Enumeration转换

ArrayList<FileInputStream> a1 = new ArrayList<FileInputStream>();
Iterator it<FileInputStream> = a1.iterator();
//匿名类重写方法。用Iterator的方法来实现。
Enumeration<FileInputStream> = new Enumeration<FileInputStream>(){
    public boolean hasMoreElements(){
        return it.hasNext();
    }
    public FileInputStream nextElement(){
        return it.next(); 
    }
} ;

Java 8更加智能:如果局部变量被匿名内部类访问,那么该局部变量相当于自动使用了final修饰。 流的read方法都是阻塞的:即流内没有内容时会一直等待.

results matching ""

    No results matching ""