1.什么时候使用输出流?什么时候使用输入流?
?输入和输出是站在内存(开发者)的角度而言的
A.硬盘–>内存:输入流
B.内存–>硬盘:输出流
?2.输入和输出的底层原理
将字符/字符串转成二进制进行存储,用记事本打开时,将8位的二进制(一个字节)转成字符,如果该字节对应的是(0,127),那么查找ASCII对应的码表,大于127的话查找系统对应的码表(GBK、UTF-8是不确定的)
3.一次性写多个字节?追加写?换行写
//写多个字节,就是将字符串转成字节数组
FileOutputStream fos=new FileOutputStream(String url);
fos.write(s.getBytes());//s是字符串类型
//追加写
FileOutputStream fos=new FileOutputStream(String url);
fos.write(s.getBytes(),true);//write的第二个参数是追加的含义
//换行写
FileOutputStream fos=new FileOutputStream(String url);
for(int i=0;i<3;i++)
{
fos.write(s.getBytes(),true);
fos.write("/r".getBytes());//windows、linux、mac是不一样的,所以要上网查询
}
4.一次读取多个字节
bytes arr[]=new bytes[1024];
FileInputStream fis=new FileInputStream();
int len=0;
//?1.fis.read()中传递的arr是可以接受字节的数量,设置成1024就是一次性可以读取1024个字节,下一次就会将数组中结果覆盖了,但可能不会覆盖1024个字节,这也就是为什么有2.关len的问题
//?2.返回的len是成功读取了多少个字节
//3.使用new String输出,由于len是成功读取了多少个字节,所以就输出len的长度;可以将new String 和 getBytes看成一对互逆的方法
while((len=fis.read(arr))!=-1)
System.out.print(new String(arr,o,len));
5.为什么引入字符流?
在使用输入流进行读取数据时, 如果一次性就读取一个字节,再进行char(fis.read()),这个时候就会出错,因为GBK中的中文是2个字节,UTF-8中的中文是3个字节,仅截取一个字节的话会出现乱码,所以引入字符流,字符流就是不论什么编码方式,每次都读取一个字符出来