Java基础IO流的简单总结

Java基础IO流的简单总结

刚好初级部分讲到了IO流这一块,所以就来个小小的总结,这份总结没有任何实例代码,单纯是总结,想要试验一下的可以自己拿代码来做实验,毕竟“实践是检验真理的唯一标准”,希望可以对大家有小小的帮助。红色字体是我们经常要用到,大家多练习一下。
********************正文开始***********************************
一 IO流的三种分类方式:

1.按照流向来分:

输入流:只能从中读取字节数据,不能向其写出数据

输出流:只能向其写入字节数据,不能从中读取数据



2.按照流所处理的数据类型划分:可分为:

字节流:用于处理字节数据。

字符流:用于处理Unicode字符数据。



3.按照格式可以分为:

节点流(低级流):可以从/向一个特定的IO设备(如磁盘,网络)读/写数据的流。

处理流(高级流):可以对一个已存在的流的连接和封装,通过所封装的流的功能实现数据读写功能的流。

二 IO流的四大抽象类:

1.常见InputStream类(读数据)

-低级

InputStream

FileInputStream

ByteArrayInputStream

PipedInputStream

-高级

DataInputStream

BufferedInputStream



2.常见OutputStream(写数据)

-低级

OutputStream

FileOutputStream

ByteArrayOutputStream

PipedOutputStream

-高级

DataOutputStream

BufferedOutputStream



3.常见的Reader类

-低级

CharArrayReader

StringReader

PipedReader

FileReader

-高级

BufferedReader

InputStreamReader

LineNumberReader



4.常见的Writer相关类

-低级

CharArrayWriter

StringWriter

PipedWriter

FileWriter

-高级

BufferedWriter

OutputStreamWriter

PrintWriter



注意:所有高级流都不能直接IO设备(磁盘或网络等)进行直接的交互,必须建立在低级流的基础之上。



三 缓冲流:

BufferedReader ->Reader

BufferedWriter

BufferedInputStream ->InputStream

BufferedOutputStream



缓冲流输入流 支持其父类的mark()和reset()方法。

mark()方法用于“标记”当前位置,就像加入了一个书签,可以使reset()方法返回这个标记重新读取数据。



BufferedReader -readLine() --以\r或\n分隔

BufferedWriter -newLine() --写入一个行分隔符



BufferInputStream和BufferedOutputStream平时很少用到。



四 InputStream的基本方法

1.int read() throws IOException 读取一个字节以整数形式返回,如果返回-1证明读到文件的末尾。

int read(byte[] buffer) throws IOException 将数据读入一个字节数组,同时返回读取的字节数。

int read(byte[] buffer,int offset,int length) throws IOException 将数据读入一个字节数组,放到数组的offset指定的位置开始,并用length来制定读取的最大字节数。

2.void close() throws IOException 关闭流释放内存资源

3.int available()返回可以ong种读取的字节数。

4.long skip(long n)在输入流中跳过n个字节,将实际跳过的字节数返回

5.boolean markSupported() 判断流是否支持标记功能。

6.void mark(int readlimit)在支持标记的输入流的当前位置设置一个标记。

7.void reset() 返回到流的上一个标记。注意必须支持标记功能。



五 OutputStream的基本方法

1.viod write(int b)throws IOException向输出流写入一个字节数据。

void write(byte[] buffer)

void write(byte[] buffer,int offset,int length)

2.viod flush() 将输出流中缓冲的数据全部写出到目的地。

3.void close() 关闭流



六 Writer的基本方法

1.void write(int c) throws IOException 向输出流中写入一个字符数据。

void write(char[] buffer) 将字符数组buffer中的字符写入到流中

void write(char[] buffer,int offset,int length) 将字符数组buffer中从offset开始的length个字符写入到流中

void write(String str) throws IOException 将一个字符串中的字符写入到输出流

void write(String str,int offset,int length)将一个字符串从offset开始的length个字符写入到输出流

4.void flush() 将输出流中缓冲的数据全部写出到目的地。



七 Reader的基本方法

1.int read() 读取一个字符以整数形式返回,如果返回-1证明已到流的末尾。

int read(char[] buffer)将从流中读出的字符放到字符数组buffer中,返回读出的字符数。

int read(char[] buffer,int offset,int length) 将读出的字符放到字符数组的指定offset开始的空间,每次最多读出length个字符。

2.void close();

3.skip(long n)

4.void mark(int readlimit)

5.void reset()



八 访问文件类

1.FileInputStream和FileOutputStream继承基类用于向文件中输入输出字节

2.FileReader和FileWriter继承基类用于向文件中输入输出字符。

注意:a.输出流在构造函数第二个参数可以设置true,表示在文件的末尾进行追加写入。

b.此类流会抛出FileNotFoundException异常。



九 转换流:主要作用是将字节流转换为字符流。

1.InputStreamReader需要和InputStream套接

2.OutputStreamWriter需要和OutputStream套接



十 数据流与字节数组流:

1.数据流主要为实现可以存取java原始数据类型,如long,boolean等

数据流是字节流

2.DataInputStream需要和InputStream套接

DataOutputStream需要和OutputStream套接

3.DataInputStream的方法:

-readBoolean();readInt();read...

-readUTF()网络传输常用方法,读一个Unicode字符串

4.DataOutputStream方法与DataInputStream中的方法对应

5.//此构造函数等于已可以往一个字节数组里输入内容

ByteArrayOutputStream baos = new ByteArrayOutputStream();

//此方法为获取一个字节数组方法返回字节数组

baos.toByteArray();

//此方法获取字节数组占了多少字节

new ByteArrayInputStream(byte[]).available()



十一 Print流

1.Print流只有输出流没有输入流,PrintWriter和PrintStream分别针对字符和字节

2.提供print和println方法,用于多种数据类型的输出。

3.输出操作不会抛出异常。

4.PrintWriter和PrintStream可设置自动刷新功能。



十二 Object流

1.序列化,用于直接将Object写入或者读出。

2.static和transient关键字修饰的属性是不能被序列化的。

3.需要序列化的类必须实现Serializable接口或者Externalizable

4.方法:

-writeObject(Object obj)

-Object readObject();

若想得到Object的原始类型,需要通过强制转型。



十三 特殊的文件流(RandomAccessFile)

1.RandomAccessFile是一种特殊的文件流,可以用它在文件的任何地方查找或插入数据

2.RandomAccessFile同时实现了DataInput和DataOutput接口,所以可以用它来读写文件

3.构造器

-RandomAccessFile(File file,String mode)

-RandomAccessFile(String file,String mode)

4.利用RandomAccessFile来追加文件内容:

RandomAccessFile rf1 = new RandomAccessFile("c:\\1.txt","rw");

rf1.seek(rf1.length());

rf1.writeBytes(str + "\n"); //此处若想输入的文本看起来是换行的,需加\n\r

rf1.close();



随机文件这块同学们可以自己试试。

十四 读取文件匹配流

1. FileInputStream/FileOutputStream

2. FileReader/FileWriter

3. BufferedReader/PrintWriter



**************************************

决定使用哪个类,以及构造进程的一般原则是:

1.首先考虑原始的数据格式是什么?

a.二进制格式(只要不能确定是纯文本的): InputStream, OutputStream及其所有带Stream结束的子类

b.纯文本格式(含纯英文与汉字或其他编码方式);Reader, Writer及其子类

2.考虑是输入还是输出?

a.输入:Reader, InputStream类型的子类

b.输出:Writer, OutputStream类型的子类

3.是否需要通过中介?

a.从Stream到Reader,Writer的转换类:InputStreamReader, OutputStreamWriter

b.低级流到高级流的转换

4.数据的来源或者去向是什么?

a.是文件: FileInputStream, FileOutputStream, FileReader, FileWriter

b.是byte[]:ByteArrayInputStream, ByteArrayOutputStream

c.是Char[]: CharArrayReader, CharArrayWriter

d.是String: StringBufferInputStream, StringReader, StringWriter

e.网络数据流:InputStream, OutputStream, Reader, Writer

5.是否要缓冲?

a.若需要就是四种缓冲类:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter

6.是否要格式化输出?

你可能感兴趣的:(Java重要知识点,线程和io流知识点)