#IO流
Input 输入,用于读取
Output 输出,用于写入
Stream (数据)流
InputStream 输入流(只读),文件-》内存, 相对内存而言的
OutputStream 输出流(只写),内存-》文件, 相对内存而言的
InputStream/OutputStream 抽象类(字节流的超类),以字节为单位进行操作的流
##1.1 字节流
是"低级流",创建不需要依赖其他流。是对文件进行读写操作的流。常用方法和RandomAccessFile基本一样。
FileInputStream fis = null;
try {
fis = new FileInputStream(YourFileName);
byte[] b = new byte[10];
int a = fis.read(b);
System.out.println(Arrays.toString(b));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
fis.close();
}
FileOutputStream fos = null;
FileOutputStream fos1 = null;
try {
fos = new FileOutputStream(yourFileName);
fos1 = new FileOutputStream(yourFileName);
byte[] b = {97,98,99,100};
byte[] c = {101,102,103,104};
fos.write(b);
fos1.write(c);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
fos.close();
fos1.close();
}
FileOutputStream 若使用一个参数的构造则为覆盖操作。
若使用双参构造,第二个参数(boolean)表示是否以追加方式写入
2. DataInputStream/DataOutputStream
是高级流。创建需要依赖低级流
提供更多类型的读写操作比如:readInt/double/char.....
writeInt/double/char
DataInputStream dis = new DataInputStream(new FileInputStream(yourFileName));
byte[] b = new byte[1024];
int len = dis.read(b );
//int readInt = dis.readInt();
System.out.println(new String(b,0,len,"UTF-8"));
3.BufferdInputStream/BufferdOutputStream
高级流,提供了缓存功能字节流
Buffer的InputStream在通过read方法读取一个字节,并不是只读取一个字节,而是一次性读取若干个字节,存入到BIS(简写)内部维护的缓存区缓冲区(字节数组),将数组的第一个字节返回。这样的好处在于:当再执行read读取一个字节的时候,不是读取文件,而是直接读取缓冲区再返回下一个字节,提高读取效率。
BufferOutputStream在通过write方法写一个字节,并不是立刻写出,而是现将数据写入缓冲区,只有当这个缓冲区满了,才真正的写出一次。
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(youFileName),50);
bos.write("呦呦切克闹,煎饼果子来一套".getBytes());
//bos.flush();
bos.close();
bos.flush()方法,会强制清空缓冲区(强制写入文件)
bos.close()方法,会自动调用flush()来完成清空的操作
该类线程安全的
(1).看API文档研究使用方法
(2).看看源码
(3).练习使用,操作文件(复制,创建一个空文件,写入一段内容)。
4.ByteArrayInputStream、ByteArrayOutputStream
是低级流,目标是内存字节数组,操作的是内存(缓冲区)
(com.yulin.IO.Demo07)
(com.yulin.IO.Demo08)
5.ObjectInputStream/ObjectOutputStream
是高级流,将java对象转换为字节数组
(com.yulin.IO.Demo09)
序列化:将现有对象转换成一组字节的过程
反序列化:将一组字节转换成对象的过程
持久化:将数据写入到文件中的过程
(com.yulin.IO.Demo10)
InputStream/OutputStream 字节流的父类,抽象类
FileInputStream/FileOutputStream 目标是操作文件
ByteArrayInputStream/ByteArrayOutputStream 目标是内存数组
DateInputStream/DateOutputStream 高级流,提供更多类型的操作
BufferedInputStream/BufferedOutputStream 高级流,带缓存的、线程安全的
ObjectInputStream/ObjectOutputStream 高级流,操作对象的(什么是序列化、反序列化、持久化。如何序列化、反序列化需要注意什么问题)
##1.2 字符流
字符流,以字符为单位进行读写操作。
字符流都是高级流,底层依然是以字节为单位的操作。
字符流用于一般的文本型文件的操作。
字符流的父类是Writer/Reader,属于抽象类。
InputStreamReader/OutputStreamWriter
将字节转换成字符流,
(com.yulin.IO.Demo11)
(com.yulin.IO.Demo12)
(com.yulin.IO.Demo13)
BufferedWriter/BufferedReader
带缓存的Writer/Reader
readLine();读一行字符串,遇到换行符或者回车换行读,读到文件末尾返回null
(com.yulin.IO.Demo14)
PrintWriter
是BufferedWriter的升级版,带自动刷新和换行写
(com.yulin.IO.Demo15)
RandomAccessFile 随机访问一个文件,读写的功能,当对文件某个部分进行操作的时候使用RAF;
I/O流不能对文件进行随机访问,当对文件进行整体操作的时候使用I/O流。