IO流

前言:本文将介绍IO流中的基本流


IO 流:用于 设备之间数据传输,分为 输入流(读数据)输出流(写数据)

  • 输入流:文件 → 程序
  • 输出流:程序 → 文件

按操作单位分为:

  • 字节流:操作所有类型文件(图片、视频、音频、文本等)
  • 字符流只操作纯文本文件(.txt、.java、.md 等)

基本流

输出流:是指从程序输出数据到指定的文件去。

输入流:是指将指定文件的内容读到程序里来。

字节输出流

创建对象:

//1.直接将路径传入字节输出流的构造里
FileOutputStream fos=new FileOutputStream("路径");
//2.先创建文本对象再将文本对象传入构造中
File fos=new File("路径");
FileOutputStream fos=new FileOutputStream(fos);

写入数据的三种函数

void write(int b)            一次写一个字节数据
void write(byte[] b)         一次写一个字节数组数据
void write(byte[] b, int off, int len) 一次写一个字节数组的部分数据
    //off:从几索引开始  len:写多少个
    最后要记得释放资源
    fos.close();

换行续写

在输出流中,如果不开启续写开关,则在创建流的时候关联文件会被清空。

如果开启续写开关则不会被清空。

//换行
String str="\r\n";
byte[] bytes=str.getbyte();
fos.write(bytes);
//续写  在创建对象的时候传入true,表示要续写不是覆盖
FileOutputStream fos=new FileOutputStream("路径",true);

字节输入流

创建对象

//1.直接创建
FileInputStream fis =new FileInputStream("路径")
//2.先创建文档
File fis =new File("路径");
FileInputStream fis =new FileInputStream(fis);

读取数据

read()这个函数就像一个指针一样,读取一个字节就向前加1,直到没有字节为止
int read()
1.它读取返回的是文档中文字的ASCLL2.如果读到最后,它会返回-1
    
1.单字节读取
FileInputStream fis =new FileInputStream("路径")   
int b1=fis.read();
如果想返回文字要手动转型为char
System.out.println((char)b1);

fis.close();
2.循环读取
 FileInputStream fis =new FileInputStream("路径")
    int b;
	while((b=fis.read())!= -1)
    {
        System.out.println(b);
    }

	fis.close();

文件拷贝

FileInputStream fis =new FileInputStream("路径")
FileOutputStream fos=new FileOutputStream("路径");
int b
while((b=fis.read()) !=-1)
{
    fos.write(b);
}

先开的后关
fos.close();
fis.close();

但是上面这种方法一次只能拷贝一个字节,太慢了,于是有了一次拷贝一个数组的方法

FileInputStream fis =new FileInputStream("路径")
FileOutputStream fos=new FileOutputStream("路径");
int len;
byte[] bytes=new byte[1024*1024*5];
len是读取到的字节数
while((len=fis.read(byte)) !=-1)
{0开始,一直写到len个字节为止
    fos.write(byte,0,len);
}
先开的后关
fos.close();
fis.close();

编码解码

String str="Eng中文";
//编码
//UTF-8
byte[] byte1=str.getBytes();

System.out.println(Arrays.toString(byte1));
//GBK
byte[] byte2=str.getBytes("GBK");
System.out.println(Arrays.toString(byte2));

//解码
String str2=new String(byte1);UTF-8解码
System.out.println(str2);GBK解码
String str3=new String(byte1,"GBK");
System.out.println(str3);
String str4=new String(byte2,"GBK");
System.out.println(str4);


结果
[69, 110, 103, -28, -72, -83, -26, -106, -121]
[69, 110, 103, -42, -48, -50, -60]
Eng中文
Eng涓枃
Eng中文

在UTF-8中,英文是1个字节,中文是3个字节,在GBK中,英文还是一个字节,而中文是2个字节,所以在转换的时候,如果编码字集不同,就会出现乱码

为了解决这个乱码问题,java里面有另外一组输入输出流,叫字符流,它是字节流+编码集,可以自动识别中英文并且用通一的编码集来进行解码


以上就是 Java 基础字节 IO 流的全部内容。我们学习了字节输入、输出流的创建、读写、文件拷贝,也了解了编码与乱码产生的原因。字节流可以处理任意类型文件,是 IO 流体系的基础。

更多推荐