IO流
概念
I ---- in – 输入(将外界的数据传入到程序中)
O – out – 输出(将程序中的数据传出到外界)
流 – 一点点的传输
注意:站在程序的角度理解输入输出
分类
按照方向分:输入流、输出流
按照单位分:字节流、字符流
按照功能分:节点流/基础流、处理流
注意:处理流往往是包含着节点流,让流的功能更加强大 – new 处理流(new 基础流);
存储单位进制
1024byte = 1Kb
1024Kb = 1Mb
1024Mb = 1Gb
1024G = 1Tb
1024Tb = 1Pb
注意:每年10月24日是程序员节
学习路线及经验
- 按照流的发展历史学习
- 关注继承关系
- 举一反三
字节流
abstract class InputStream – 字节输入流(字节流的基类)
abstract class OutputStream – 字节输出流(字节流的基类)
class FileInputStream extends InputStream – 文件字节输入流
class FileOutputStream extends OutputStream – 文件字节输出流
class FilterInputStream extends InputStream - 过滤器字节输入流
class FilterOutputStream extends OutputStream - 过滤器字节输出流
class BufferedInputStream extends FilterInputStream - 带缓冲区的字节输入流
class BufferedOutputStream extends FilterOutputStream - 带缓冲区的字节输出流
缓冲区大小:8192字节
1、使用
1、文件的写入
package com.xx.io01;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test01 {
/**
*
* 1)不处理异常的方式
* 2)文件存在的情况
*/
public static void main(String[] args) throws IOException {
//1.创建流对象
FileOutputStream fos = new FileOutputStream("xx.txt");
//2.写入数据
//fos.write(97);//写入Unicode码
//fos.write("123abc".getBytes());//写入字节数组
fos.write("123abc".getBytes(), 1, 3);//写入字节数组,偏移量,写入长度
//3.关闭资源
fos.close();
}
}
2、处理异常的情况
package com.xx.io01;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test02 {
/**
*
* 1)不处理异常的方式
* 2)文件存在的情况
* 3)在末尾追加
* 经验:考虑基础流的构造方法
* 4)文件不存在的情况
* 经验:所有的输出流,当文件不存在时都会先创建该文件,再写入数据
* 5)处理异常的方式
*/
public static void main(String[] args) {
FileOutputStream fos = null;
try {
//1.创建流对象
fos = new FileOutputStream("xx.txt",true);
//2.写入数据
fos.write("123abc".getBytes());//写入字节数组
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//3.关闭资源
if(fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3、读取数据-复杂版
package com.xx.io01;
import java.io.FileInputStream;
import java.io.IOException;
public class Test03 {
/**
* 知识点:利用 文件字节输入流 读取文件里的数据
*
* 1)不处理异常的方式
* 2)文件存在的情况
*/
public static void main(String[] args) throws IOException {
//1.创建流对象
FileInputStream fis = new FileInputStream("xx.txt");
//2.读取数据
//read():读取一个字节,读取到文件末尾返回-1
int read = fis.read();
System.out.println((char)read);
read = fis.read();
System.out.println((char)read);
read = fis.read();
System.out.println((char)read);
read = fis.read();
System.out.println((char)read);
read = fis.read();
System.out.println((char)read);
read = fis.read();
System.out.println((char)read);
read = fis.read();
System.out.println(read);
//3.关闭资源
fis.close();
}
}
4、读取数据-简化版
package com.xx.io01;
import java.io.FileInputStream;
import java.io.IOException;
public class Test04 {
/**
*
* 1)不处理异常的方式
* 2)文件存在的情况
*/
public static void main(String[] args) throws IOException {
//1.创建流对象
FileInputStream fis = new FileInputStream("xx.txt");
//2.读取数据
//read():读取一个字节,读取到文件末尾返回-1
int read;
while((read = fis.read()) != -1){
System.out.println((char)read);
}
//3.关闭资源
fis.close();
}
}
5、将数据存入数组,返回读取到的有效字节
package com.xx.io01;
import java.io.FileInputStream;
import java.io.IOException;
public class Test05 {
/**
* 知识点:利用 文件字节输入流 读取文件里的数据
*
* 1)不处理异常的方式
* 2)文件存在的情况
*/
public static void main(String[] args) throws IOException {
//1.创建流对象
FileInputStream fis = new FileInputStream("xx.txt");
//2.读取数据
//read(bs):读取bs数组长度的数据并把数据存入数组中,返回读取到的有效字节数。如果读取到文件末尾,则返回-1
byte[] bs = new byte[1024];//[0,0,0,0,0,0,....]
int len;
len = fis.read(bs);
System.out.println(new String(bs, 0, len));
//3.关闭资源
fis.close();
}
}
6、try-catch处理文件
package com.xx.io01;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Test06 {
/**
* 知识点:利用 文件字节输入流 读取文件里的数据
*
* 1)不处理异常的方式
* 2)文件存在的情况
* 3)文件不存在的情况
* 经验:
* 所有的输出流,当文件不存在时都会先创建该文件,再写入数据
* 所有的输入流,当文件不存在时都会报错 - FileNotFoundException
* 4)处理异常的方式
*/
public static void main(String[] args) {
FileInputStream fis = null;
try {
//1.创建流对象
fis = new FileInputStream("hhy.txt");
//2.读取数据
//read(bs):读取bs数组长度的数据并把数据存入数组中,返回读取到的有效字节数。如果读取到文件末尾,则返回-1
byte[] bs = new byte[1024];//[0,0,0,0,0,0,....]
int len;
while((len = fis.read(bs)) != -1){
System.out.println(new String(bs, 0,len));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
//3.关闭资源
if(fis != null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
7、利用 带缓冲区的字节输入流 读取文件里的数据
package com.xx.io02;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class Test02 {
/**
* 知识点:利用 带缓冲区的字节输入流 读取文件里的数据
*
* 1)不处理异常的方式
* 2)文件存在的情况
* 3)文件不存在的情况
* 经验:
* 所有的输出流,当文件不存在时都会先创建该文件,再写入数据
* 所有的输入流,当文件不存在时都会报错 - FileNotFoundException
* 4)处理异常的方式
*/
public static void main(String[] args) throws IOException {
//1.创建流对象
//BufferedInputStream fis = new BufferedInputStream(new FileInputStream("hhy.txt"));
//1.创建流对象 + 自定义缓冲区大小
BufferedInputStream fis = new BufferedInputStream(new FileInputStream("hhy.txt"),2048);
//2.读取数据
byte[] bs = new byte[1024];
int len;
while((len = fis.read(bs)) != -1){
System.out.println(new String(bs, 0, len));
}
//3.关闭资源
fis.close();
}
}
8、利用 带缓冲区的字节输出流 向文件写入数据
package com.xx.io02;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test01 {
/**
* 知识点:利用 带缓冲区的字节输出流 向文件写入数据
*
* 1)不处理异常的方式
* 2)文件存在的情况
* 3)在末尾追加
* 经验:考虑基础流的构造方法
* 4)文件不存在的情况
* 经验:所有的输出流,当文件不存在时都会先创建该文件,再写入数据
* 5)处理异常的方式
*/
public static void main(String[] args) throws IOException{
//1.创建流对象
//BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("hhy.txt"));
//1.创建流对象 + 末尾追加
//BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("hhy.txt",true));
//1.创建流对象 + 自定义长度
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("hhy.txt"),2048);
//2.写入数据
bos.write("123abc".getBytes());
bos.write("123abc".getBytes());
//3.关闭资源
bos.close();
}
}
9、文件的下载
1、读取源文件,写入目标文件
package com.xx.io01;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Copy01 {
/**
* 知识点:拷贝文件
*
* 思路:读取源文件,写入目标文件
*/
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("源文件.mp4");
FileOutputStream fos = new FileOutputStream("copy.mp4");
int read;
while((read = fis.read()) != -1){
fos.write(read);
}
fis.close();
fos.close();
}
}
2、进阶版
package com.qf.io02;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Copy {
public static void main(String[] args) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("源文件.mp4"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.mp4"));
byte[] bs = new byte[1024];
int len;
while((len = bis.read(bs)) != -1){
bos.write(bs, 0, len);
}
bis.close();
bos.close();
}
}