2022Java学习笔记四十八(IO流概念、字节流读取文件内容,字节流一次性读取全部字节文件(解决读取中文乱码问题))
一、IO流的概念
I表示input,是数据从硬盘文件读入到内存的过程,称之为输入,负责度
O表示output,是内存程序的数据从内存到写出到硬盘文件的过程,称之为输出,负责写
二、IO流的分类
字节流:适合读取任何文件
字符流:适合读取文件
字节流更适合读取英式文件
总结流的四大类:
1、字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流称为字节输入流
2、字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网站中去的流称为字节输出流
3、字符输入流:以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流称为字符输入流
4、字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流称为字符输出流
三、文件字节输入流 FilelnputStream
作用:以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去
实例代码
package com.zcl.d3_byte_stream;
import java.io.*;
public class FilelnputStreamDemo {
public static void main(String[] args) throws IOException {
// 多态创建
// InputStream is = new FileInputStream(new File("file-io-app\\src\\abs.text"));
// 简写
InputStream is = new FileInputStream("file-io-app\\src\\abs.text");
// 读取一个字节返回
/*int s = is.read();
System.out.println(s); // 97
System.out.println((char) s); // a
int s1 = is.read();
System.out.println(s1); // 98
System.out.println((char) s1); // b
int s2 = is.read();
System.out.println(s2); // 99
System.out.println((char) s2); // c
int s3 = is.read();
System.out.println(s3); // -1
System.out.println((char) s3);*/
// 循环遍历字节内容(提高效率)
// 弊端:无法避免中文乱码问题
int b;
while ((b = is.read()) != -1){
System.out.print((char) b);
}
}
}
四、文件字节输入流,每次读取一个字节数组
实例代码
package com.zcl.d3_byte_stream;
/*
目标:使用文件字节输入流,每次读取一个字节数组的数据
*/
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class FilelnputStreamDemo2 {
public static void main(String[] args) throws Exception {
// 多态创建 字节输入流管道与源文件接通
InputStream is = new FileInputStream("file-io-app\\src\\demo2.text");
/*// 2、定义一个字节数组,读取字节数据
byte[] buffer = new byte[3]; // 3B
int read = is.read(buffer); // 返回个数
System.out.println("读取了几个字符:"+read);
// 3、解码
String s = new String(buffer);
System.out.println("解码数组:"+s);
int read2 = is.read(buffer); // 返回个数
System.out.println("读取了几个字符:"+read2);
// 3、解码
String s2 = new String(buffer);
System.out.println("解码数组:"+s2);
// (重点)指定具体的读取字节数量
int read3 = is.read(buffer); // 返回个数
System.out.println("读取了几个字符:"+read3);
// 3、解码
String s3 = new String(buffer,0,read3);
System.out.println("解码数组:"+s3);*/
// 循环输出
// 2、定义一个字节数组,读取字节数据
byte[] buffer = new byte[3];
int len;
while ((len=is.read(buffer))!=-1){
// (重点)指定具体的读取字节数量
System.out.print(new String(buffer,0,len)); // abcdasha
}
}
}
五、文件字节输入流,一次读取完全部字节(解决中文乱码)
方式一:
自己定义一个字节数组与文件大小一样大,然后使用读取字节数组的方法,一次性读取完成
方法二:readAllBytes()API就可以完成,思路与方法一一样
使用官方给的
public int read(byte[] buffer)
// 无可读取数据返回-1
实例代码
package com.zcl.d3_byte_stream;
/*
目标:使用字节流一次读取完全部字节,可以解决乱码问题
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class FilelnputStreamDemo3 {
public static void main(String[] args) throws Exception {
File file = new File("file-io-app\\src\\1225asas.text");
// 多态创建 字节输入流管道与源文件接通
InputStream is = new FileInputStream(file);
// 定义一个字节数组与文件大小一样大
/*byte[] bufter = new byte[(int) file.length()]; // 需要强转
int read = is.read(bufter);
System.out.println("读取了多少个文件字节:"+read);
System.out.println("文件的大小是:"+file.length());
System.out.println(new String(bufter));*/
// API自带的读取全部字节数据
byte[] bytes = is.readAllBytes();
System.out.println(new String(bytes));
}
}
弊端:如果文件过大也会导致内存溢出,一般不会存在
六、文件字节输入流,写字节数据到文件