流: 在Java中所有的数据都是使用流读写的。流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质就是数据传输,根据数据传输特性将流抽象为各种类。
①按照流向分:输入流,输出流
②按照处理数据的单位分:字节流(8位的字节);字符流(16位的字节)
输入就是将数据从各种输入设备(文件,键盘等)中读取到内存中
输出正好相反,是将数据写入到各种输出设备(文件,显示器,磁盘等)
键盘就是一个标准的输入设备,而显示器就是一个标准的输出设备,但是文件既可以作为输入设备,又可以作为输出设备
File类不支持文件内容处理,如果要处理文件内容,就必须要通过流的操作模式来完成
在java.io包中,流分为两种:字节流和字符流
①字节流:数据流中最小的数据单元是字节。InputStream,OutputStream
②字符流:数据流中最小的数据单元是字符,Java中的字符是Unicode编码,一个字符占用两个字节。Reader,Writer
public class FileInputStream extends InputStream{}
·FileInputStream从文件系统中的某个文件中获得输入字节
·FileInputStream用于读取诸如图像数据之类的原始字节流
方法 | 解释 |
---|---|
FileInputStream(File file) | 通过打开与实际文件的连接创建一个FileInputStream,该文件由文件系统中的File对象file命名 |
FileInputStream(String name) | 通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径命name命名 |
public class FileOutputStream extends OutputStream{}
·文件输出流是用于将数据写入到输出流File或一个FileDescriptor。文件是否可用或可能被创建取决于底层平台
·某些平台允许一次只能打开一个文件来写入一个FileOutputStream(或其他文件写入对象)。在这种情况下,如果涉及到的文件已经打开,则此类中的构造函数将失败
方法 | 解释 |
---|---|
FileOutputStream(File file) | 创建文件输出流以写入由指定的File对象表示的文件 |
FileOutputStream(String name) | 创建文件输出流以指定的名称写入文件 |
复制图片代码示例:
package com.bit;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class JavaIo {
public static void main(String[] args) throws IOException {
FileInputStream fin=new FileInputStream("E:\\icons\\icons\\wode1.png");
FileOutputStream fout=new FileOutputStream("E:\\icons\\wode1.png");
int len=0;
byte[] buff=new byte[1024];
//从此输入流中将最多buff.length个字节的数据读入一个buff字节数组中
while((len=fin.read(buff))!=-1){
fout.write(buff,0,len); //将指定字节数组buff中从偏移量0开始的len个字节写入此文件输出流
}
//关闭流
fin.close();
fout.close();
}
}
为什么要有缓冲流?
当使用read()读取文件时,每读一个字节,访问一次硬盘,效率很低。当文件过大时,操作起来也不是很方便。因此要用到buffer缓冲流,当创建buffer对象时,会创建一个缓冲区数组。读一个文件时,先从硬盘中读到缓冲区,然后直接从缓冲区输出,效率更高
public class BufferedInputStream extends FilterInputStream
·BufferedInputStream为另一个输入流添加了功能,即缓冲输入和支持mark和reset方法的功能。当创建BufferedInputStream时,将创建一个内部缓冲区数组
方法 | 解释 |
---|---|
BufferedInputStream(InputStream in) | 创建一个BufferedInputStream并保存其参数,输入流in,供以后使用 |
BufferedInputStream(InputStream in,int size) | 创建BufferedInputtream具有指定缓冲区大小,并保存其参数,输入流in,供以后使用 |
public class BufferedOutputStream extends FilterOutputStream
方法 | 解释 |
---|---|
BufferedOutputStream(OutputStream out) | 创建一个新的缓冲输出流,以将数据写入指定的底层输出流 |
BufferedOutputStream(OutputStream out,int size) | 创建一个新的缓冲输出流,以便以指定的缓冲区大小将数据写入指定的底层输出流 |
文件拷贝代码示例:
package com.bit;
import java.io.*;
public class BufferedStream {
public static void main(String[] args) throws IOException {
File file=new File("bit.txt");
if(!file.isFile()){
return;
}
BufferedInputStream bfis=new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bfos=new BufferedOutputStream(new FileOutputStream("src\\"+file.getName()));
byte[] bytes=new byte[1024];
int tmp=0;
while((tmp=bfis.read(bytes))!=-1){
bfos.write(bytes,0,tmp);
}
bfos.flush();
bfos.close();
bfis.close();
System.out.println("copy成功!");
}
}
package com.bit;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class BufferRate {
public static void main(String[] args) throws IOException {
File file=new File("bit.txt");
//缓冲流
BufferedInputStream bfis=new BufferedInputStream(new FileInputStream(file));
int tmp=0;
long time=System.currentTimeMillis();
while((tmp=bfis.read())!=-1){
//System.out.println((char)tmp);
}
time=System.currentTimeMillis()-time;
bfis.close();
System.out.println("缓冲流读取:"+time+"ms");
//非缓冲流
FileInputStream fin=new FileInputStream(file);
int tmp1=0;
time=System.currentTimeMillis();
while((tmp1=fin.read())!=-1){
//System.out.println((char)tmp1);
}
time=System.currentTimeMillis()-time;
fin.close();
System.out.println("非缓冲流读取:"+time+"ms");
}
}
public class FileReader extends InputStreamReader
方法 | 解释 |
---|---|
FileReader(File file) | 创建一个新的FileReader,给出File读取 |
FileReader(String fileName) | 创建一个新的FileReader,给定要读取的文件的名称 |
public class FileWriter extends OutputStreamWriter
方法 | 解释 |
---|---|
FileWriter(File file) | 给一个File对象构造一个FileWiter对象 |
FileWriter(String fileName) | 构造一个给定文件名的FileWriter对象 |
复制文件代码示例:
package com.bit;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class CopyDemo {
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("E:\\icons\\icons\\bit.java");
FileWriter fw=new FileWriter("E:\\icons\\bit.java");
int ch;
while((ch=fr.read())!=-1){
fw.write(ch);
}
//释放资源
fw.close();
fr.close();
}
}
为了提高字符流读写的效率,引入了缓冲机制,进行字符批量的读写,提高了单个字符读写的效率。
当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并放满缓冲区,之后使用read()方法,会先从缓冲区中进行读取。如果缓冲区数据不足,再次从文件中读取。
public class BufferedReader extends Reader
方法 | 解释 |
---|---|
BufferedReader(Reader in) | 创建使用默认大小的输入缓冲区的缓冲字符输入流 |
BufferedReader(Reader in,int size) | 创建使用指定大小的输入缓冲区的缓冲字符输入流 |
public class BufferedWriter extends Writer
方法 | 解释 |
---|---|
BufferedWriter(Writer out) | 创建使用默认大小的输出缓冲区的缓冲字符输出流 |
BufferedWriter(Writer out,int size) | 创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区 |
文件拷贝代码示例:
package com.bit;
import java.io.*;
public class CopyDemo {
public static void main(String[] args) throws IOException {
FileReader reader=new FileReader("E:\\icons\\icons\\bit.txt");
BufferedReader breader=new BufferedReader(reader);
FileWriter writer=new FileWriter("E:\\icons\\bit1.txt");
BufferedWriter bwriter=new BufferedWriter(writer);
String content="";
while((content=breader.readLine())!=null){
bwriter.write(content);
}
breader.close();
reader.close();
bwriter.close();
writer.close();
}
}
1.字节流操作的基本单位是字节;字符流操作的基本单位为Unicode码元
2.字节流在操作的时候本身不会用到缓冲区,是与文件本身直接操作的;而字符流在使用的时候使用到缓冲区
3.所有文件的存储都是字节的存储,在磁盘上保留的是字节
4.在使用字节流操作中,即使没有关闭资源,也能输出;而字符流不使用close方法不会输出任何内容
转换的时候要用到OutputStreamWriter和InputStreamReader
InputStreamReader是Reader的子类,将输入的字节流转换成字符流
public class InputStreamReader extends Reader
·InputStreamReader是从字节流到字符流的桥:它读取字节,并使用指定的charset将其解码为字符
方法 | 解释 |
---|---|
InputStreamReader(InputStream in) | 创建一个使用默认字符集的InputStreamReader |
InputStreamReader(InputStream in,Charset cs) | 创建一个使用给定字符集的InputStreamReader |
OutputStreamWriter是Writer的子类,将输出的字符流转换为字节流
public class OutputStreamWriter extends Writer
·OutputStreamWriter是字符流到字节流的桥:向其写入的字符编码成使用指定的字节charset
方法 | 解释 |
---|---|
OutputStreamWriter(OutputStream out) | 创建一个使用默认字符编码的OutputStreamWriter |
OutputStreamWriter(OutputStream out,Charset cs) | 创建一个使用给定字符编集的OutputStreamWriter |