流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出。
一.几个概念
目的:读写文件中的内容
流:一连串流动的数据,先进先出的方式传输信息,管道
数据源 目的地–>以程序为中心划分读入写出
二.流的分类
1)按照流向分:
输入流
输出流
2)按操作单元分:
字节流
字符流
3) 按功能分:
节点流
功能流
分类之间是相辅相承的,互不冲突
字节流:是万能的 功能:节点流
InputStream :字节输入流 此抽象类是表示字节输入流的所有类的超类。
FileInputStream :从文件系统中的某个文件中获得输入字节。
OutputStream 字节输出流
package com.shsxt.file01;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class IODemo02 {
public static void main(String[] args) throws IOException {
//FileInputStream(File file)
//1.建立联系
File file=new File("D:/AAA/haha.txt");
//2.选择流 55
InputStream is=new FileInputStream(file);
//3.读入
//每次读取一个字节数据,如果已达到末尾返回-1
int num=is.read();
//4.处理数据
System.out.println((char)num);
System.out.println((char)(is.read()));
System.out.println((char)(is.read()));
System.out.println((char)(is.read()));
System.out.println((char)(is.read()));
System.out.println((char)(is.read()));
System.out.println(is.read()); //-1
//5.关闭
is.close();
}
}
每次读取一个字节数据太慢 ,因此用下面的方法一次性读完
package com.shsxt.file01;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
/*
* 每次读取一个字节长度,效率低,一卡车一卡车的读
* 1.准备卡车(容器,存储多个数据)
*/
public class IODemo04 {
public static void main(String[] args){
//FileInputStream(File file)
//1.建立联系
File file=new File("D:/AAA/haha.txt");
//2.选择流
InputStream is=null;5555
try {
is = new FileInputStream(file);
//3.准备卡车
byte[] car=new byte[1024]; //一般使用1024的整数倍
int len=-1;
//int read(byte[] b) 返回值:返回读取到是数组b中的数据个数,没有读到返回-1
//int len=is.read(car);
while((len=is.read(car))!=-1){
System.out.println(new String(car,0,6));
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//5.关闭
try {
if(is!=null){
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
三.字节输出流
字节输出流 OutputStream 此抽象类是表示输出字节流的所有类的超类
FileOutputStream文件输出流是用于将数据写入 File
public class IODemo05 {
public static void main(String[] args){
//1.建立联系
//File dest=new File("D:/test.txt");
//2.选择流
OutputStream out=null;
try {
out=new FileOutputStream("D:/test.txt",true); //第二个参数默认false不追加,true追加
//3.准备数据
int num=99;
byte[] car="告白气球".getBytes();
//4.写出
//每次只写一个字节
/*out.write(num);
out.write(101);*/
//每次写出多个0
out.write(car);
//5.刷出
out.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
//6.关闭
try {
if(out!=null){
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
四.文件的拷贝
package com.shsxt.file01;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/*
* 文件的拷贝
数据源 程序 目的地
关闭流:先打开的后关闭,后打开的先关闭
课后作业:把文件拷贝封装成为工具类方便使用,
过滤条件
1.不能把文件拷贝到原文件所在路径下
*/
public class CopyFile06 {
public static void main(String[] args) {
//1.建立联系
File src=new File("D:/test.txt");
File dest=new File("E:/test.txt");
//2.选择流
InputStream is=null;
OutputStream out=null;
try {
is=new FileInputStream(src);
out=new FileOutputStream(dest);
//3.操作
byte[] car=new byte[1024];
int len=-1;
while((len=is.read(car))!=-1){
out.write(car, 0, len);
}
//4.刷出
out.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
//5.关闭
if(out!=null){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
五.字符流
package com.shsxt.chario02;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
/*
* 字符流 :只能读写纯文本内容 功能分:节点流
* Reader 字符输入流 FileReader 文件字符输入流
* Writer 字符输出流 FileWriter
*
* 图片的拷贝:
*/
public class CharDemo01 {
public static void main(String[] args) throws IOException {
//1.选择流
Reader read=new FileReader("D:/test.txt");
Writer write=new FileWriter("E:/hehe.txt");
//2.读取
char[] car=new char[1024];
int len;
/*int num=read.read();
System.out.println((char)num);
System.out.println((char)read.read());*/
while((len=read.read(car))!=-1){
write.write(car, 0, len);
}
//3.刷出
write.flush();
//3.关闭
write.close();
read.close();
}
}
六.缓冲流
package com.shsxt.others03;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/*
* 字符流 字节流 -->节点流
* 包裹节点流,在节点流之上-->功能流|处理流
* 处理流:增强功能,提高性能的作用,在节点流之外才能使用,不能代替节点流
*
* 缓冲流:提高性能
* 字节缓冲流 BufferedInputStream BufferedOutputStream 无新增方法
*/
public class BufferedDemo01 {
public static void main(String[] args) {
//1.建立联系
File src=new File("D:/test.txt");
File dest=new File("E:/test2.txt");
//2.选择流
InputStream is=null;
OutputStream out=null;
try {
is=new BufferedInputStream(new FileInputStream(src));
out=new BufferedOutputStream(new FileOutputStream(dest));
//3.操作
byte[] car=new byte[1024];
int len=-1;
while((len=is.read(car))!=-1){
out.write(car, 0, len);
}
//4.刷出
out.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
//5.关闭
if(out!=null){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
字符缓冲流
package com.shsxt.others03;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
/*
* 字符缓冲流 不能发生多态,因为存在新增方法
* BufferedReader 字符输入缓冲流 新增方法 readLine() 读取一行
* BufferedWriter 字符输出缓冲流 新增方法 newLine() 写出换行符
*/
public class BufferedDemo02 {
public static void main(String[] args) throws IOException {
//1.选择流
BufferedReader read=new BufferedReader(new FileReader("D:/test.txt"));
BufferedWriter write=new BufferedWriter(new FileWriter("E:/hehe.txt"));
//2.读取
// String str=read.readLine();
String s=null;
while((s=read.readLine())!=null){
write.write(s);
write.newLine();
}
//3.刷出
write.flush();
//3.关闭
write.close();
read.close();
}
}