IO流在方向上可以分为输入流和输出流,而在传输方式上又可分为:字符流、字节流。
什么是字符,什么是字节呢?
1个汉字就是一个字符,为2字节,类似的包括全角标点、全角英文字母、日语假名之类的。
1个英文字母也是一个字符,为1字节,类似的包括英文标点之类的。
简单来说,1字节就是1字节,而1字符可以是1字节可以是2字节可以是4字节
字节是ASCII值多少的单位,1个字节等于8位二进制数。
字符是我们可以辨认出的字、符号的单位。
知道什么是字符、字节了,那我们来看看字符流和字节流吧,
字符流包括:java.io.FileWriter,java.io.FileReader等。
它们只能读取写入文本文件,如果用它们读取写入视频、音频、图片的话,会把原先一字节一字节的编码误以为是字符,就把文件破坏掉了。
字节流包括:java.io.FileInputStream,java.io.FileOutputStream等。
它们可以读取写入任何文件,但是无法识别其中的文本,因为这些流无法把字节识别为字符,所以使用它们可以读取写入任何文件,但是无法识别其中的内容。
字节流和字符流的区别在于,字节流效率慢、字符流效率稍微快一点点,字符流只能读取写入识别文本文件,字节流可以读取写入任何文件,但无法识别。简单来说:文本用字符流,其它用字节流。
关于字符流可以参考另一个例子:字符流的使用
下面写一个小例子理解一下字节流:利用字节输出流,和字节输入流,把D:\Demo.gif 复制到E盘根目录下并改名字为DemoCopy.gif(可以修改代码复制任意文件),代码如下:
import java.io.FileInputStream;大家可以用字符流(FileWriter和FileReader)替换掉上面的字节流(FileInputStream和FileOutputStream),用字符流进行复制,结果文件是损坏的
import java.io.FileOutputStream;
import java.io.IOException;
public class IOStream {
public static void main(String[] args) throws IOException {//异常可以用try/cache处理,这里我们直接扔出来
/**
* 建立一个输入字节流(in)和一个输出字节流(out)
* 并指定in的读取路径和out的写入路径
* in负责读取硬盘上的文件到内存,相当于Windows里的复制
* out负责从内存上写入到硬盘,相当于windows里的粘贴
* */
FileInputStream in=new FileInputStream("D:/Demo.gif");//要复制的文件路径,必须要存在,否则出现找不到文件的异常
FileOutputStream out=new FileOutputStream("E:/DemoCopy.gif");//要粘贴的文件路径,最好不存在,如果存在会被覆盖
/**
* 在while循环中,用一个整形变量aa一个一个接收read方法读取到的ASCII值
* 并用输出流将aa写入新文件,直到ASCII值为-1(即什么都没有的时候,文件尾)
* */
int aa=in.read();//将第一个读取的ASCII值存入内存
while (aa!=-1) {
out.write(aa);
aa = in.read();
}
out.flush();//将最后一个读取的ASCII值从内存缓冲区写入硬盘
/**
* 关闭两个流
* */
in.close();
out.close();
System.out.println("复制成功!!");//这个Dome没有用try/cache处理异常,所以不成功会直接出现异常
}
}