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"))
装饰设计模式与适配器设计模式
通常可以变相的将适配器设计模式理解成装饰设计模式
- 装饰设计模式:基于已经实现的功能,提供增强的功能.
- 装饰设计模式的由来就来自于对缓冲流的实现.
- 使流原来的继承体更加的简单
- 提高了效率
- 是在原有的基础上提高增强的功能,所以他还要属于原来的体系。
* 实例:要求在子类中只使用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();
}
}