字节流 FileInputStream、FileOutputStream 解析

  • 字节流:顾名思义读取的是字节
  • 常用于处理非文本文件

1. FileInputStream

  • 读取方法read()
int read() // 从输入流中读取数据的1个字节。返回 0 到 255 范围内的 int 字节值。到达流末尾而没有可用的字节则返回值 -1

int read(byte[] b)//将b.length个字节大小的数据读入数组。如果已到达流的末尾,则返回 -1。否则返回本次读取的字符数

int read(byte[] b, int off,int len) //将输入流中最多 len 个数据字节读入 byte 数组。尝试读取 len 个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数。如果因为流位于文件末尾而没有可用的字节,则返回值 -1。
  • 代码示例
//text.txt 文件在跑程序之前已经创建且有内容""HelloWorld123世界"
public void test1() throws IOException
{
    
    
		File file = new File("text.txt"); //1.创建File对象
		FileInputStream fis = new FileInputStream(file); // 2.创建FileInputStream对象
		
		byte[] buf=new byte[5]; 
		int len;
		while((len=fis.read(buf))!=-1) // 3.调用read()
			System.out.print(new String(buf,0,len));
		
		fis.close(); //4. 关闭资源		
}
// HelloWorld123��界
不难发现"HelloWorld23""界"没有乱码,但是"世"乱码了
原因在于我的IDE使用UTF-8编码,在UTF-8"HelloWorld23"1字节,所以每次读取1个或多个字节不会乱码,
但是"世界"占用6(2*3=6)字节,所以每次读取5个字节可能会造成乱码

2. FileOutputStream

  • 构造器
FileOutputStream(File file) 
FileOutputStream(File file, boolean append) 
FileOutputStream(String name) 
FileOutputStream(String name, boolean append)  
  • 写入方法write( )
void write(int b) //将指定的字节写入此输出流。write 的常规协定是:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。 即写入0~255范围的。

void write(byte[] b) //将 b.length 个字节从指定的 byte 数组写入此输出流。write(b) 的常规协定是:应该与调用 write(b, 0, b.length) 的效果完全相同。

void write(byte[] b,int off,int len) //将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
  • 代码示例
//IDE和文本查看器均采用UTF-8编码
File file = new File("text2.txt");
FileOutputStream fos = new FileOutputStream(file,true);
fos.write(97);//将97转2进制截取后8位,并解码为'a'
fos.write(356);//将356转2进制截取后8位01100100,并解码为‘d’
		
String str1="abcdefg";
String str2="世界";
byte[] by1=str1.getBytes();//UTF-8 将英文字母编码为1字节,所以返回的字节数组不乱码
byte[] by2=str2.getBytes();//UTF-8 将中文字母编码为3字节,分开存储后乱码
fos.write(by1);//正确写入
fos.write(by2);//乱码
fos.close();

3. 通过FileInputStream、FileOutputStream实现图片的复制

File Srcfile = new File("text.txt");
File Destfile = new File("C:\\Users\\mwz\\Desktop\\copytxt.txt");
		
FileInputStream fis=new FileInputStream(Srcfile);
FileOutputStream fos = new FileOutputStream(Destfile);
		
byte[] buf=new byte[1024];
int len;
while((len=fis.read(buf))!=-1)
	fos.write(buf,0,len);
fis.close();
fos.close();

猜你喜欢

转载自blog.csdn.net/weixin_43956248/article/details/113898954