======================================================================
java第十五天 IO流
======================================================================
复习: 写一下老师上午写的代码:
IO流 的分类
(1) 按照数据传输的方向分类
1. 输出流 虚拟机向文件中
2. 输入流 向虚拟机中输入数据.相对虚拟机来说的
I 输入流 JVM ——>数据源 InputXXX
O 输出流 JVM <—— 数据源 OutputXXX
(2) 按照传输的数据单位.
1. 字节流 传播一次传播一个字节.
2. 字符流 传播一次传播一个字符.
(3) 按照流的功能来分. 采用了装饰模式.
1. 节点流 例子: 电线的金属丝/导电 节点流.
2. 过滤流 给节点流增加功能(和节点流组合构成一个复杂的功能) 电线上的塑料套(装饰)
-------------------------------------------------------------------------------------------------------------------
IO 流的逐个讲解
(1) 字节输入流,(向虚拟机中读入数据)
字节流类:
抽象父类: InputStream 字节输入流 xxxInputStream
实现类:
BufferedInputStream 缓冲流——过滤流
ByteArrayInputStream 字节数组流——节点流
DataInputStream 处理Java标准数据流——过滤流
FileInputStream 处理文件IO流——节点流
FilterInputStream 实现过滤流——字节过滤流父类
PipedInputStream 管道流,在两个线程交换数据
PrintStream 包含print() 和 println()
RandomAccessFile 只支持随机访问文件,用于定位的seek()方法。 了解即可
SequenceInputStream 在合并两个文件是较好用(顺序流)
父类是InputStream() 一个类XXXInputStream是字节输入流.
要自己调用in.close()方法把流关掉.
int read() 顺序流,返回字节的ASCII码 如果返回-1说明读完了
int read(byte[] bs) 把字节数组读满,读到的字节装到字节数组里.返回值是读到的字节数.
int read(byte[] bs,off,length) off: 2把读到字节读到 bs[2]中, length 4 尝试读4 个字符.返回实际读入多少个字节.
(2) 字节输出流
如果有FileNotFoundException.创建一个文件.
第一个构造方法: FielOutputStream(String name) throws FileNotFoundException 如果有FileNotFoundException.创建一个文件. 如果没有异常则会创建一个新的文件.
另一个构造方法: F
(3) 过滤流 三个修饰 Buffered Data Object
BufferedInputStream//向缓冲区中传入数据,read() 传输数据有缓冲区,要记的清空缓冲区.
BufferedOutputStream//从缓冲区读出数据.write() 方法.
JVM |
Data Source |
缓冲区 |
在JVM内部开辟一块缓冲区,提高了读写的效率
DataInputStream//为了解决不能输入8种数据类型的矛盾
DataOutputStream//传输8中数据类型,+字符串.writeUTF(String );
ObjectOutputStream /ObjectInputStream :对象输入输出流,如果要输入输出这个对象,则这个对象必须要实现Serializable接口。
(4) 管道流
PipedOutputStream()
PipedInputStrem()
需要注意的要把两个管道对象联接.pin.connect(pout);
(5) 随机访问文件,
seek() 把文件指针任意定义在position位置上. 原来指针在2000处,seek(1000)调到1000的位置. 从起点开始的1000字节数.
(6) 字符流
XXXReader –〉InputStreamReader, BufferedStreamReader(为了提高效率用缓冲流),
XXXWriter-〉OutputStreamReaer, PrintReader(这个类有很多方法,比OutputStreamReaer,好用。呵呵)
和字节流区别的问题,能够解决字符乱码问题.
在任何一个国家都兼容ASCII编码,因此A=65,用英文来说没有乱码.呵呵.
ASCII 一个字符-----1B 任何一种编码均兼容 A<-->65
ISO8855-1 (西欧) 一个字符-----1B
GB-2312 / GBK 一个字符-----2B
Unicode 一个字符-----2B 会增加网络负担 Java中的char是Unicode
UTF-8 变长字节(变长的Unicode方式)
英文-----1B
中文-----3B
(7) 从字节流转成字符输入流 利用桥转换类.
字符流是通过桥转换来构造出来的,构造方法的参数是一个字节流。
u 构造方法的记忆方法:
(1)、代表源的事物,构造方法就加源
例如 FileInputStream File代表源的事物,构造方法就加源
FeInputStreamil
(File file)
(2)、代表功能,构造方法就放InputStream 或 OutputStream
例如 ObjectInputStream Object代表功能,构造方法就放InputStream
DataInputStream Data分为int、byte、char等8种简单类型外加String,
构造方法放InputStream
PushbackInputStream Pushback代表具有缓冲的功能,所以构造方法放InputStream
InputStream, OutputStream为抽象的,子类型不抽象
建议主要记Read / Write 方法即可,其它的掌握规律
比如看到Data就要想到会装不同类型数据: int、byte、char …
InputStream类
所有字节输入流的父类,如:FileInputStream, Ob jectInputStream,PipedInputStrean
三个基本的read()方法
A. int read(): 从流里读出的一个字节或者返回-1;
B. int read(byte[]):将数据读入到字节数组中,并返回所读的字节数;
C. int read(byte[], int p, int len):int参数p表示哪个位置,len表示希望的长度。
FileInputStream类
DataInputStream 类
PipedInputStream类(一般了解)
BuferOutputStream 给流增加一个缓冲的功能,以空间换取时间。 TestBufferedStream.java
JVM |
Data Source |
缓冲区 |
在JVM内部开辟一块缓冲区,提高了读写的效率
根据数据类型选择输入/输出流:
①byte、byte[] InputStream / OutputStream
②int、byte、char DataInputStream / DataOutStream
③char、String Reader / Writer
④Object ObjectInputStream / ObjectOutputStream
若考虑性能会在前试着加Buffered, 在①、③上加; ②则在①的基础上加。
如 FileOutputStream fo=new FileOutputStream(“a.txt”);
BufferedOutputStream out=new BufferedOutputStream(fo);
DataOutputStream dout=new DataOutStream(out);
字符流:
可以解决字符编码问题
每个国家制定编码方式,编码方式、解码方式不同——>乱码问题
ASCII 一个字符-----1B 任何一种编码均兼容 A<-->65
ISO8855-1 (西欧) 一个字符-----1B
GB-2312 / GBK 一个字符-----2B
Unicode 一个字符-----2B 会增加网络负担 Java中的char是Unicode
UTF-8 变长字节(变长的Unicode方式)
英文-----1B
中文-----3B
这里的重点: 字节流——>字符流
InputStreamReader类
OutputStreamWriter类
FileInputSream fi=new FileInputStream(“2.txt”);
InputStreamReader ir=new InputStreamReader(fi,”Big 5” ); //在桥转换时指定编码方式
BufferedReader in=new BufferedReader(ir);
String s;
While((s=in.readLine())!=null){ //readLine()阻塞方法,到换行符为止
System.out.println(s);
}
in.close();
Java EE中用得较多的还是Reader和Writer