流按操作类型分为两种: 字节流与字符流。字节流可以操作任何数据,字符流只能操作纯字符数据,比较方便;
字节流: 基本操作与字符流相同, 字节流可以操作任意类型数据;
- 字节流和字符流的区别:
<1>字节流用来读取字节数据;
<2>字符流用来读取字符数据;
<3>由于计算机中存储和传输数据是以字节的形式,所以字节流可以操作任意类型数据;
<4>在所有字节都对应字符的时候,使用字符流操作更方便;
代码示例
File inFile = new File("F:\\A\\1.mp3");
File outFile = new File("E:\\ABC.mp3");
//建立数据通道
FileInputStream fileInputStream = new FileInputStream(inFile);
FileOutputStream fileOutputStream = new FileOutputStream(outFile);
//建立缓冲字节数组,边读边写
byte[] buf = new byte[1024];
int length = 0 ; //用于记录每次读取的字节个数
while((length=fileInputStream.read(buf))!=-1){
fileOutputStream.write(buf,0,length);
}
//关闭资源
fileOutputStream.close();
fileInputStream.close();
字节流与字符流的区别
字节流和字符流使用是非常相似的,那么除了操作代码的不同之外,还有哪些不同呢?
字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的
字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容
字符输入流:Reader
Reader是使用字符的方式从文件中取出数据,Reader类的定义如下:
public abstract class Reader extends Objects implements Readable,Closeable
Reader本身也是抽象类,如果现在要从文件中读取内容,则可以直接使用FileReader子类。
FileReader的构造方法定义如下:
public FileReader(File file)throws FileNotFoundException
以字符数组的形式读取出数据:
public class Test {
public static void main(String[] args) throws IOException {
File f = new File("d:\\test.txt");
Reader in=new FileReader(f);
char[] c=new char[1024];
int len=input.read(c);
input.close();
System.out.println(new String(c,0,len));
}
}
字符输出流:Writer
public class Test16 {
public static void main(String[] args) throws IOException {
File f = new File("d:\\test.txt");
Writer out=new FileWriter(f);
String str="Hello World";
out.write(str);
out.close();
}
}
字节输入流:InputStream
public class Test12 {
public static void main(String[] args) throws IOException {
File f = new File("d:\\test.txt");
InputStream in=new FileInputStream(f);
byte[] b=new byte[1024];
int len=in.read(b);
in.close();
System.out.println(new String(b,0,len));
}
}