一: 万物皆字节
- 一切文本、图片、视频都是以二进制进行储存,都是一个个字节,所以字节流可以传输任何文件。
- 文本编辑器: 都是将二进制查表,将字节转化成字符 ,其中0-127查ASCII表,其它查GBK表。
- InputStream 和 OutputStream 都是抽象类,不可以创建,所以要选取其子类这里使用File子类
二:写文件
//若追加,则构造方法第二个参数为true
FileOutputStream fos = new FileOutputStream("/Users/haogege/Desktop/a.txt",true);
//写入a
fos.write(97);
//写入abcd
byte[] b = {97,98,99,100};
fos.write(b);
//写入bc
fos.write(b,1,2);
//写入换行符
fos.write("\r\n".getBytes());
//写入我爱你
byte[] b = "我爱你".getBytes();
fos.write(b);
//关闭流
fos.close();
三:读文件 (读比较神奇,读完指针会向后移动一位)
- 一次读出一个字节,若没有则返回-1
FileInputStream fis = new FileInputStream("/Users/haogege/Desktop/a.txt");
int len = fis.read();
System.out.println(len);
len = fis.read();
//将一个字节转化为char
System.out.println((char)len);
len = fis.read();
System.out.println(len);
- 循环一次读出一个
int len = 0;
while((len = fis.read())!=-1){
System.out.println(len);
}
注意:若存入一个汉字“我”,则会读出多个字节 230 136 145 (GBK编码 2个字节,utf-8 三个字节)
- 一次读取多个 (指针一次移动多位)
FileInputStream fis = new FileInputStream("/Users/haogege/Desktop/a.txt");
byte[] b = new byte[2];
int len = fis.read(b);
System.out.println(Arrays.toString(b));
//骚操作
System.out.println(new String(b));
注意:读取多个到b缓冲区. 这里的len指的是读了几个字节
4.最佳方案。
byte[] b = new byte[1024];
int len = 0;
while((len= fis.read(b))!=-1){
//如果不加 0 和len 也没毛病,就是byte数组后面会有一堆空的
System.out.println(new String(b,0,len));
}
5.复制文件。
FileInputStream fis = new FileInputStream("/Users/haogege/Desktop/a.txt");
FileOutputStream fos = new FileOutputStream("/Users/haogege/Desktop/b.txt");
byte[] b = new byte[2];
int len = 0;
while((len= fis.read(b))!=-1){
fos.write(b,0,len);
}
fis.close();
fos.close();
6.使用字节流存在的小问题。
FileInputStream fis = new FileInputStream("/Users/haogege/Desktop/a.txt");
int len = 0;
while((len= fis.read())!=-1){
System.out.println((char)(fis.read()));
}
fis.close();
7.使用字符流。(以字符的形式读写)
抽象类 Writer和Reader 使用子类 File,
- 与字节流不太一样的是会将数据先写到缓冲区。
FileWriter fis = new FileWriter("/Users/haogege/Desktop/a.txt");
fis.write(97);
fis.flush();
fis.write(88);
fis.close();
注:flush和close()的区别。
- 均可将数据从缓冲区刷到硬盘
- close使用后流不可以再使用。
- 写入char数组,和字符串
char[] a = {'a','b','c'};
fis.write(a);
fis.flush();
fis.write("我爱你");
fis.close();
网友评论