首页 > 其他分享 >00022.09 用字节流读写文件:FileInputStream和FileOutputStream

00022.09 用字节流读写文件:FileInputStream和FileOutputStream

时间:2023-02-20 12:37:01浏览次数:46  
标签:00022.09 读取 int void len FileOutputStream FileInputStream byte 字节


用文件字节流读写文件 目录

文章目录

  • ​​用文件字节流读写文件 目录​​
  • ​​前言​​
  • ​​一、InputStream​​
  • ​​二、使用字节流,来读取纯文本文件 步骤​​
  • ​​三、复制任意类型的文件功能​​
  • ​​总结​​

前言

我们之前讲了 读取/写入一个纯文本的文件步骤
(1)选择IO流,创建IO对象
(2)读/写操作
(3)关闭IO流,释放资源
我们这一节,选取字节流
字节流的优点就是什么数据都可以写(可以用于处理所有类型的文件),而字符流的话,写纯文本文件会更快

一、InputStream

InputStream 读取

(1)int read() :一次读取一个字节,返回本次读取的字节的值

(2)int read(byte[] b) :一次读取多个字节,返回本次实际读取字节数,读取的字节存到b数组中,从[0]开始存储,一次最多读取b.length个字节

(3)int read(byte[] b, int off, int len) :一次读取多个字节,返回本次实际读取字节数,读取的字节存到b数组中,从[off]开始存储,一次最多读取len个字节

(4)close()

如果到达流末尾,返回-1

跟之前的对比,基本上差不多,就是类型变了 是字节类型

00022.09 用字节流读写文件:FileInputStream和FileOutputStream_java


00022.09 用字节流读写文件:FileInputStream和FileOutputStream_java_02


解决办法跟以前也是一样的

00022.09 用字节流读写文件:FileInputStream和FileOutputStream_java_03


这里乱码,我们可以判断不是因为编码不一致造成的,因为没有全部乱码,这里是字节数组设置小了,字节被拆开了有一个注意点

00022.09 用字节流读写文件:FileInputStream和FileOutputStream_字节流_04


我们的相对路径是相对项目的根目录,不是相对src

00022.09 用字节流读写文件:FileInputStream和FileOutputStream_字节流_05


00022.09 用字节流读写文件:FileInputStream和FileOutputStream_java_06


显示是乱码

00022.09 用字节流读写文件:FileInputStream和FileOutputStream_字节流_07


所以是没办法再控制台显示的,控制台只能显示纯文本

代码

package com.atguigu.test06;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
public class Test07FileInputStream {
public static void main(String[] args) throws IOException {
//(1)选择IO流
//这里故意选取字节流,因为字节流可以用于处理所有类型的问题
FileInputStream fis = new FileInputStream("单身狗.jpg");

//(2)读
byte[] arr = new byte[10];
int len;
while((len = fis.read(arr)) != -1){
// System.out.println(Arrays.toString(arr));

//字节数组-->字符串 new String(byte[],off,len)
System.out.println(new String(arr,0,len));//乱码,因为图片无法在控制台显示
}
// (3)关闭
fis.close();
}
}

二、使用字节流,来读取纯文本文件 步骤

(1)选择IO流
(2)读/写
(3)关闭

三、复制任意类型的文件功能

复制任意类型的文件,只能选择字节流

前面说了字节流读取,现在归纳一下写入

OutputStream:

(1)void write(int b) :写一个字节

(2)void write(byte[] b) :写一个字节数组的所有

(3)void write(byte[] b, int off, int len) :写一个字节数组的部分

(4) void close()

(5)void flush()

00022.09 用字节流读写文件:FileInputStream和FileOutputStream_java_08


00022.09 用字节流读写文件:FileInputStream和FileOutputStream_字节流_09


纯文本文件也可以复制,并且不会乱码

没有乱码的原因是,10个字节10个字节 自己拼接了

代码

package com.atguigu.test06;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.junit.Test;
public class TestCopy {
@Test
public void test02() throws IOException{
copy("单身狗.jpg", "2.jpg");
}

@Test
public void test01() throws IOException{
copy("1.txt", "3.txt");
/*
* 这里没有乱码,把1.txt的所有字节,全部复制到3.txt中,然后一起显示,没有缺字节
* 而且1.txt和3.txt的编码是一致的
*/
}

//复制任意类型的文件的功能
//任意类型的文件,只能选择字节流
public void copy(String srcFilename , String destFilename) throws IOException{
FileInputStream fis = new FileInputStream(srcFilename);
FileOutputStream fos = new FileOutputStream(destFilename);

byte[] arr = new byte[10];
int len;
//数据: srcFilename --> fis --> arr --> fos --> destFilename
while((len = fis.read(arr)) !=-1){
fos.write(arr, 0, len);
}

fis.close();
fos.close();
}
}

总结


标签:00022.09,读取,int,void,len,FileOutputStream,FileInputStream,byte,字节
From: https://blog.51cto.com/u_15800767/6068286

相关文章