前言
字节流:分为字节输入流(InputStream)和字节输出流(OutputStream)字符流:分为字符输入流(InputStreamReader)和字符输出流(OutputStreamWriter)
一、字节流
1.字节输入流(InputStream)
说明:字节输入流是读取外部文件的内容,输入到程序中,所以叫输入流,因为是按照字节为单位读取的所以叫字节输入流。使用方式:创建流对象,并调用流对象的read方法从流中读取数据。
场景1)使用read(byte[] bytes)方法读取中文
/**
* read(byte[] bytes)方式使用:根据设定的字节数组byte[]的长度从文件中读取相应长度字节的数据,并将读取
* 到的字节数据存放到该byte[]数组中,装满为止;不足的部分就空着。
*/
@Test
public void inputStream1() throws IOException {
//创建字节输入流对象并与文件关联,源文件test.txt —> 流对象 —> 流对象.read读取
FileInputStream fileInputStream = new FileInputStream("src/test/resources/test.txt");
/*
* 设定字节数组长度,注意:如果文件全部是英文及字符,则byte[]数组长度不管设置多少,读取后转换都不会出现乱码,
* 但如果文件中有中文汉字,则byte[]数组长度设定不合理,就会出现读取转化后出现乱码的现象。
* 因为在UTF-8编码规则下,1个英文字符对应1个字节,以字节为单位读取自然不会乱码;而1个汉字及中文标点对应3个
* 字节,以字节为单位按照设定的字节数读取时很容易出现乱码
*/
byte[] bytes = new byte[37];
//每次从流中读取37个字节长度的数据,并将读取到的数据以字节形式存放到bytes数组中
int len = fileInputStream.read(bytes);
while (len != -1){
System.out.println("len:"+len);
//将存储到byte[]数组中的字节转换成字符串并打印出来
System.out.println(new String(bytes,0,len));
len = fileInputStream.read(bytes);
}
fileInputStream.close();
}
场景2)使用read()方法读取英文
/**
* 字节输入流(InputStream):read()读取英文字符文件
*/
@Test
public void inputStream2() throws IOException {
FileInputStream fileInputStream = new FileInputStream("src/test/resources/test1.txt");
//每次读取1个字节
int read = fileInputStream.read();
while (read != -1){
//read()方法返回的是ascii码值,通过char转成英文字符