按照数据类型划分:
- 字节流 InputStream / OutputStream
字节流以byte(字节)为单位,进行输入或输出操作
InputStream字节输入流:读取数据。抽象类,是所有输入流的父类。定义了所有输入流都具有的共同特征。
OutputStream字节输出流:写出数据。抽象类,是所有输出流的父类。定义了所有输出流都具有的共同特征。
- 字符流 Reader / Writer
字符流以字符为单位,根据ASCII码表映射字符
Reader字符输入流:读取数据,抽象类
Writer字符输出流:写出数据,抽象类
什么时候使用字节流,什么时候使用字符流?
只要是处理纯文本数据,就优先考虑使用字符流。 除此之外都使用字节流。
文本文件,视频图片等在计算机中的存储方式都是字节,因此可以用windows自带的记事本打开需要上传或者下载的数据文件,如果里面的内容可以看懂,那么就用字符流。看不懂就用字节流。
字节输入流FileInputStream
FileInputStream是InputStream的子类,可以从文件流中读取数据。
这是jdk文档中对FileInputStream的作用的描述
构造方法:
FileInputStream(File file)
FileInputStream(String name)
读取方式:
- int read()
从该输入流读取一个字节的数据。
读取输入流的下一个字节,并返回字节表示的int值(0~255)。一个字节是八位,二进制的11111111转为十进制是255
- int read(byte[] b)
从该输入流读取最多 b.length个字节的数据为字节数组。
文件里面的内容是a,读取的结果是97,因为字节流的单位是字节byte,是一组二进制的数据,传输的实际内容是对应的ASCII码值。如果想查看具体是哪个字符,可以用char类型做强制转换
package review.IO;
import java.io.FileInputStream;
import java.io.IOException;
public class Demo1 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream(“a.txt”);
System.out.println(fis.read()); //97
System.out.println((char)fis.read()); //b,已经读取过的字节a不会被反复读取,因此是b
//像上面这样读取太慢,用while循环改进
//当读到末尾时,fis.read()语句返回-1
int n = 0;
while((n=fis.read())!=-1){
System.out.print((char)n); //cdefg
}
//关闭流
fis.close();
}
}
package review.IO;
import java.io.FileInputStream;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream(“a.txt”);
//数组长度用1024,这样比较合适,不会太长浪费资源,也不会太短
byte[] bytes = new byte[1024];
int len;
//用len接收fis.read(byte[] b)实际读取的字节长度
//读到文件末尾时返回-1
//(len =fis.read(bytes)注意这里用括号括住
//这里不会读取一个字节就打印s,因为是一次性读取一个字节数组
while((len =fis.read(bytes))!=-1){
//这里的长