数据流是一组有序,有起点和终点的字节的数据序列,包括输入流和输出流;
流序列中的数据既可以是未经加工的原始二进制数据,也可以是经过编码处理后符合某种格式规定的特定数据,因此Java中的流分为两种:
最小的数据单元是字节;
最小的数据单元是字符;java中字符是Unicode编码,一个字符占两个字节;
File、OutputStream、InputStream、Writer、Reader、Serializable接口;
Java I/O主要包括如下3层次:

以内存的角度来定义是 读入 写出
装饰者模式来实现IO操作:
- public static File file;
- public static void main(String[] args) {
- file=new File("D:/Workspace/CDemo/app/src/testtxt/ioStreamTest.txt");
- outputSteamTest();
- inputSteamTest();
- }
- public static void outputSteamTest(){
- DataOutputStream out;
- try {
- //装饰者模式
- out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
- out.writeByte(80);
- out.writeShort(5);
- out.writeInt(0);
- out.writeLong(1000L);
- out.writeFloat(0.02f);
- out.writeDouble(0.45d);
- out.writeBoolean(true);
- out.writeChar('n');
- out.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static void inputSteamTest(){
- DataInputStream in;
- try {
- in = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
- //读取时要与写的顺序一一对应
- byte mByte = in.readByte();
- short aShort = in.readShort();
- int anInt = in.readInt();
- long aLong = in.readLong();
- float aFloat = in.readFloat();
- double aDouble = in.readDouble();
- boolean bool = in.readBoolean();
- char aChar = in.readChar();
- System.out.println("bool :" +bool +" ,\nmByte :" +mByte +" ,\naShort :" +aShort
- +" ,\nanInt :" +anInt +" ,\naLong :" +aLong +" ,\naChar :" +aChar
- +" ,\naDouble :" +aDouble +" ,\naFloat :" +aFloat);
- in.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- 运行结果
- bool :true ,
- mByte :80 ,
- aShort :5 ,
- anInt :0 ,
- aLong :1000 ,
- aChar :n ,
- aDouble :0.45 ,
- aFloat :0.02
为向文件中写入数据,首先需创建一个FileOutputStream,然后为提升访问效率,可将它发送给具备缓存功能的ButteredOutput-Stream,而为了实现与机器类型无关的java基本类型数据的输出,可将缓存的流传递给DataOutputStream,从上面的关系,我们可看到,其根本目的都是为outputSteam添加额外的功能。



OutputStream -> FileOutputStream/FilterOutputStream ->DataOutputStream->bufffferedOutputStream
应先掌握FilterOutputStream,以及FileOutputStream,这两个类是基类,从继承关系不难发现它们都是对abstract类OutputStream的拓展,是它的子类,然而伴随对stream流的功能的拓展,所以就出现了DataOutputstream,(将java中的基础数据类型写入数据字节输出流中,保存在存储介质中、然后可用DataOutputStream从存储介质中读取到程序中还原成java基础类型),DataOutputstream,FilterOutputStream三个类的关系的这种设计使用了装饰器模式;
为了提升Stream的执行效率,出现了bufferedOutputStream,它在本地添加了一个缓存数组,在使用它之前,每次从磁盘读入数据时,都是需要访问多少byte数据就向磁盘中读多少个byte的数据,而出现bufferedOutputSteam之后,策略就改了,会先读取整个缓存空间相应大小的数据,这样就从磁盘读取了一块比较大的数据,然后缓存起来,从而减少了对磁盘的访问的次数,提升了性能。

Writer -> FilterWriter -> BufferedWriter ->OutputStreamWriter ->FileWriter ->其他 字符有一个readline();

1个字符 = 两个字节, "中文" 1个字符 = 1个字节 "英文" 编码格式 UTF-8 或 GBK格式
- public static void writerAndStream(){ //写出
- try {
- BufferedWriter bfw=new BufferedWriter(
- // new FileWriter(file));//使用它替代下面代码
- new OutputStreamWriter(new FileOutputStream(file),"GBK"));
- bfw.write("我爱你中国");
- bfw.flush();
- bfw.close();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public static void readerAndStream(){//读入
- try {
- BufferedReader bfr = new BufferedReader(
- // new FileReader(file)); //使用它替代下面代码
- new InputStreamReader(new FileInputStream(file),"GBK"));
- String result = bfr.readLine();
- bfr.close();
- System.out.println("readerAndStream--result"+result);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- //输出数据
- readerAndStream--result我爱你中国
面试题:
1.如果只用FileOutputStream fos=new FileOutputStream("D:/text.txt");不是也能输出到"d"/text.txt"吗,
为啥要用其 他两个呢能起到什么作用?
FileOutputStream: 字节流,它是一个字节一个字节的向外发送数据;
OutputStreamWriter:字符流,它是一个字符一个字符的向外送数据; 区别为用字符流可以使中文不乱码;
2.为何使用Buffer缓冲区?
使用Buffer缓冲区可以减少硬盘读取次数, 保护了硬盘;
多线程中分段下载
RandomAccessFile不属于InputStream 和 OutputStream类系 它是一个独立的类,这里包含读写两种操作;
构造方法 RandomAccessFile raf = new RandomAccessFile(File file,String mode);
其中参数mode的值可选 "r": 可读, "w": 可写, "rw": 可读可写;
seek(int index); 可将指针移动到某个位置开始读写;
setLength(long len);给写入文件预留空间;
FileChannel配合者ByteBuffer,将读写的数据缓存到内存中,然后以批量/缓存的方式read/weite,省去非批量操作时的重复中间操作,操纵大文件时可显著提高效率;
Files.exists():检测文件路径是否存在。
Files.createFile():创建文件。
Files.createDirectory():创建文件夹。
Files.delete():删除一个文件或目录。
Files.copy():复制文件。
Files.move():移动文件。
Files.size():查看文件个数。
Files.read():读取文件。
Files.write():写入文件