java基础复习十三(IO流)

作用:实现两个设备之间数据的传递。

设备:磁盘,内存,键盘,文件,网络,控制台。

网络:当前主机之外的网上资源。

分类

根据操作的方式分:输入流和输出流

根据数据的类型分:字节流和字符流

1.字节流:

  • 字节输入流:InputStream
  • 字节输出流:OutputStream

传输的是字节,可以操作任意类型的数据 -----------音频,视频,文件等。

2.字符流

字符流的两个父类

  • 字符读入流(将数据输入内存):Reader
  • 字符写出流(将数据从内存取出):Writer

传输的是字节,不同点是在传输的过程中加入了编码的操作,让操作更加方便。---------文本。

FileReader
  • read():一个字符一个字符的读,每次读出一个字符
  • read(数组):一次可以读出多个字符 ,数组的作用:每次会将读出的字符临时放到这个数组中
  • read(数组):一次可以读出多个字符 ,数组的作用:每次会将读出的字符临时放到这个数组中 数组是临时存放数据的地方,我们会将读到的字符放到临时数组中,数组的大小决定了我们一次可以读到的字符个数.
    * 一般这个数组的大小<=1kB
* 返回值代表本次读到的真实的字符个数,如果返回值是-1代表读完了.

  ```java
  char[] arr = new char[2];
  		int num = 0;
  		
  		while ((num = fileReader.read(arr)) != -1) {
  			System.out.println(new String(arr,0,num)+"     num:"+num);
  		}

相对路径与绝对路径

  • 相对路径:从路径中间的某个部位开始一直到当前的文件
  • 绝对路径:一个文件的完整路径,从根目录开始到当前的文件
  • 补充知识:
  • \代表转义字符 \t:制表符 \n换行符 \:表示普通的\
  • 在代表路径的时候,\与/是一个意思.

将Demo1的东西复制到Demo1copy.java

package test;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class demo3 {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("D:\\Files\\big-java\\8.3\\src\\test\\demo1.java");
        FileWriter fileWriter = new FileWriter("democopy.java");
        int num = 0;
        char[] arr = new char[10];
        while((num = fileReader.read(arr))!=-1)
        {
            fileWriter.write(arr,0,num);
            fileWriter.flush();
        }
        fileReader.close();
        fileWriter.close();
    }
}

字符缓冲流(字符缓冲区)

定义:为了提高读写的能力,本身没有读写的能力,要想进行读写就必须借助于字符流实现。

可以将缓冲流类比于催化剂或者高速小车。

字符缓冲流分类:

  • 字符缓冲读入流:BufferedReader 没有读的能力
  • 字符缓冲写出流:BufferedWriter 没有写的能力
BufferedWritter bufferedWritter = new BufferedWritter(new FileWritter("text3.txt"))

装饰设计模式与适配器设计模式

通常可以变相的将适配器设计模式理解成装饰设计模式

  • 装饰设计模式:基于已经实现的功能,提供增强的功能.
  • 装饰设计模式的由来就来自于对缓冲流的实现.
  1. 使流原来的继承体更加的简单
  2. 提高了效率
  3. 是在原有的基础上提高增强的功能,所以他还要属于原来的体系。
* 实例:要求在子类中只使用play方法
 *
 * 分析:Dog是继承了ZiMidel类,ZiMidel类实现了Inter接口
 * 当Dog类想要实现Inter接口的一个方法的时候,如果直接实现Inter接口,就必须将所有的方法都实现,
 * 如果在Dog类与Inter接口之间插入一个类,让这个类去实现Inter接口的所有方法,作为这个类的子类只需要实现自己需要的方法
 * 
 * 我们将中间的这个类就可以成为适配器类
 interface Inter{
	public void play();
	public void song();
	public void run();
	public void eat();
	public void jump();
}
//适配器类
class ZiMidel implements Inter{

	@Override
	public void play() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void song() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void eat() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void jump() {
		// TODO Auto-generated method stub
		
	}
	
}


//创建狗类,我只想让她实现play方法?
class Dog extends ZiMidel{
	public void play() {
		// TODO Auto-generated method stub
		
	}
}

class Cat extends ZiMidel{
	public void song() {
		
	}
}

LineNumberReader

是BufferedReader的子类,不能读.但是可以提高效率,特有功能:设置行号,获取行号

字节流与字符流共用

/*
 * 字符流:----传输的是字符,只能传输字符
 * 		字符写出流   Writer
 * 			write()  write(字符数组) write(字符串)
 * 		字符读入流   Reader
 * 			read()  read(数组)
 * 		字符缓冲写出流   BufferedWriter
 * 			newline()  跨平台换行
 * 		字符缓冲读入流   BufferedReader
 * 			readLine() 读一行
 * 字节流:---传输的是字节,可以传输任何类型的数据
 * 		字节输出流     OutputStream
 * 		字节输入流     InputStream
 * 		字节缓冲输出流     BufferedOutputStream
 * 		字节缓冲输入流     BufferedInputStream
 */
public class Demo11 {
	public static void main(String[] args) throws IOException {
		//写入数据
		write();
		//读1
		read1();
		//读2
		read2();
		//读3
		read3();
	}
	//将数据写入磁盘
	public static void write() throws IOException {
		//1.创建字节输出流并关联文件
		FileOutputStream fileOutputStream = new FileOutputStream("test1.txt");
		//2.写--这里只能写字节
		fileOutputStream.write("bingbing".getBytes());
		//3.关闭资源
		fileOutputStream.close();
	}
	//读1 一次读一个字节
	public static void read1() throws IOException {
		//1.创建字节输入流并关联文件
		FileInputStream fileInputStream = new FileInputStream("test1.txt");
		//2.读
		int num = 0;
		while ((num = fileInputStream.read()) != -1) {
			System.out.print((char)num);
		}
		//3.关闭资源
		fileInputStream.close();
	}
	//读2   一次读多个字节
	public static void read2() throws IOException {
		//1.创建字节输入流并关联文件
		FileInputStream fileInputStream = new FileInputStream("test1.txt");
		//2.读
		int num = 0;
		byte[] bytes = new byte[5];
		while ((num = fileInputStream.read(bytes)) != -1) {
			System.out.print(new String(bytes,0,num));
		}
		//3.关闭资源
		fileInputStream.close();
	}
	//读3  一次全部读完
	public static void read3() throws IOException {
		//1.创建字节输入流并关联文件
		FileInputStream fileInputStream = new FileInputStream("test1.txt");
		//获取文件的字节个数
		//注意:这种方式适合文件的字节数比较小的时候,大概是几kb之内.
		int num1 = fileInputStream.available();
		//2.读
		byte[] bytes = new byte[num1];
		fileInputStream.read(bytes);
		System.out.println(new String(bytes));
		//3.关闭资源
		fileInputStream.close();
	}
}

使用字节流实现图片的复制

package com.test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo12 {
	public static void main(String[] args) throws IOException {
		/*
		 * 使用字节流实现图片的复制
		 */
		//1.创建字节输入流
		FileInputStream fileInputStream = new FileInputStream("D:\\workspace\\BigData1923N20\\100.jpg");
		//2.创建字节输出流
		FileOutputStream fileOutputStream  = new FileOutputStream("D:\\workspace\\BigData1923N20\\100copy.jpg");
		//3.进行读写
		int num = 0;
		while ((num = fileInputStream.read()) != -1) {
			fileOutputStream.write(num);
		}
		fileInputStream.close();
		fileOutputStream.close();
	}
}