1、字节流:处理除了文本、文字相关所有的流问题
2、字符流:只处理文本、文字相关(处理编码乱码问题)
3、转换流:已经有了字节流,以字符流的方式读取或写出文本相关的数据
4、缓冲流:提高读取和写出效率,以后都用
5、随机访问文件类RandomAccessFile:随机访问、读取文件内容,如:断点续传、多线程上传下载、判断空间是否充足,占用空间
================================================================
字节流
public static void main(String[] args) {
FileOutputStream fileOutputStream = null;//输出流:内存到硬盘
FileInputStream fileInputStream=null;//输入流:硬盘到内存
try {
fileInputStream = new FileInputStream("test.txt");//要复制的文件
fileOutputStream = new FileOutputStream("test2.txt");//复制去的文件
byte[] b=new byte[10];//长度则指定一次读取数据的长度,数组用来装每次读取的数据
int read=1;//保存每一次读取的字节个数,用在条件判断中
while ((read=fileInputStream.read(b)) !=-1) {
fileOutputStream.write(b, 0, read);//边读边写
}
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
IOCloseDutil.close(fileOutputStream, fileInputStream);
}
}
关流:先开后关,
为什么关?:将内存中的数据强制写出,否则会出现只传输部分数据的情况
/**
* 这里用父类关,增强扩展性
*/
public static void close(OutputStream fileOutputStream, InputStream fileInputStream) {
try {
if(fileInputStream !=null)
{
fileInputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if(fileOutputStream !=null)
{
fileOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
================================================================
字符流
public static void main(String[] args) {
try (//关流新方式,jdk7开始,不用再写final代码块
FileReader fr = new FileReader("test.txt");
FileWriter fw = new FileWriter("test3.txt");
){
char[] b=new char[1024];
int read=1;
while ((read=fr.read(b)) !=-1) {
fw.write(b, 0, read);//边读边写
}
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
===============================================================
转换流
学习中目前唯一一个可以设置字符集的流
OutputStreamWriter osw = null;
InputStreamReader isr = null;
try {
isr = new InputStreamReader(is,"UTF-8");//转换流,设置字符集为UTF-8
osw = new OutputStreamWriter(os,"UTF-8");
char[] c=new char[1024];//把字节流转换为了字符流,所以应该是char[]数组,而不是byte[]数组
int read=0;
while ((read=isr.read(c)) != -1) {
osw.write(c, 0, read);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
IOCloseDutil.close(isr, osw);
}
==================================================================
缓冲流
提高读取和写出效率
字符输入缓冲流的特殊方法:readLine(),读一行
字符输出缓冲流的特殊方法:newLine(),换行
public static void main(String[] args) {
try (
//声明一个FileReader对象赋值为null,为了在finally中关闭流
FileReader fr = new FileReader("day021-io笔记.txt");
//声明FileWriter对象,在try赋值创建的对象
FileWriter fw = new FileWriter("copyTxt4.txt");
//创建BufferedReader对象,将fr传入
BufferedReader br = new BufferedReader(fr);
//创建BufferedWriter对象,将fw传入
BufferedWriter bw = new BufferedWriter(fw);
){
//调用BufferedReader中的readLine方法,读取一行数据
String readLine = null;
int count=0;
while ((readLine = br.readLine()) != null) {//每次循环读取的数据,装到readLine,当时null,表示读取结束了
count++;
//先换行,再写出
if (count >1) //第一次不换行,不然复制的文件会比原文件多一行
bw.newLine();//输出一个换行符
bw.write(readLine);//调用BufferedWriter中的write方法,读取一行数据
}
System.out.println("文件复制成功!");
} catch (FileNotFoundException e) {
System.out.println("文件找不到异常!");
e.printStackTrace();
} catch (IOException e) {
System.out.println("IO异常!");
e.printStackTrace();
}
}
===============================================================
随机访问文件类RandomAccessFile
有文件指针概念,从指针开始写
作用:
1.断点续传
2.判断空间是否充足,先占空间
3.多线程上传下载