1、流的分类及注意事项
-
乱码问题就是字节数据没有选择正确的编码方式来显示成字符。
-
从本质上来讲,写数据(即输出)的时候,字节也好,字符也好,本质上都是没有标识符的,需要去指定编码方式。
-
什么是字节流?
字节流–传输过程中,传输数据的最基本单位是字节的流。
什么是字符流?
字符流–传输过程中,传输数据的最基本单位是字符的流。
字节:8 bit,图片等非文本一般都使用字节流方式
字符:(16bit)UTF-8方式编码的字符,一个英文字符需要一个字节,一个中文需要三个字节。
2、图表理解输入输出流
3、IO 流体系
4、读一个文件的代码
读写文件分4步
1、实例化File对象,指明要操作的文件
2、提供具体的流
3、数据读入
4、流的关闭
package test;
import org.junit.Test;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
/**一、流的分类
* 1、操作数据单位:字节流、字符流
* 2、数据流向:输入流、输出流
* 3、流的角色:节点流、处理流
*二、体系结构
*抽象类 节点流(或文件流) 缓冲流(处理流的一种)
* InputStream FileInputStream BufferedInputStream
* OutPutStream FileOutPutStream BufferedOutPutStream
* Reader FileReader BufferedReader
* Writer FileWriter BufferedFileWriter
*/
public class TestReaderWriter {
@Test
/**
* 将文件内容读入程序中,并输出到控制台1.0
* 实现
* 读文件分4步
* 1、实例化File对象,指明要操作的文件
* 2、提供具体的流
* 3、数据读入
* 4、流的关闭
*/
public void test1() throws IOException {
//相对于当前Module
//1、实例化File对象,指明要操作的文件
File file = new File("hello.txt");
//ystem.out.println(file.getPath());
//2、提供具体的流
FileReader fileReader = new FileReader(file);
//3、数据读入
System.out.println("1.0文件输出内容:");
int data = fileReader.read();
while (data != -1){
System.out.print((char)data);
data =fileReader.read();
}
//4、流的关闭
fileReader.close();
}
@Test
/**
*将文件内容读入程序中,并输出到控制台2.0
* 优化
* 说明:
* 1、read() 的理解:返回读入的一个字符。如果达到文件尾,返回-1
* 2、异常处理:为保证流资源一定可以执行流关闭操作。需要try-catch-finally 处理
* 3、读入的文件一定要存在,否则会报错
*/
public void test2() {
System.out.println();
System.out.println("============================");
FileReader fileReader = null;
try {
//相对于当前Module
//1、实例化File对象,指明要操作的文件
File file = new File("hello.txt");
//ystem.out.println(file.getPath());
//2、提供具体的流
fileReader = new FileReader(file);
//3、数据读入
System.out.println("2.0文件输出内容:");
int data = fileReader.read();
while (data != -1){
System.out.print((char)data);
data =fileReader.read();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//4、流的关闭
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Test
/**
* 将文件内容读入程序中,并输出到控制台3.0
* 优化
* 使用一个数组,一个可读多个字符
* 使用了for循环
*/
public void test3(){
FileReader fileReader = null;
try {
//1、 File 类的实例化
File file = new File("hello.txt");
//2、FileReader 流的实例化
fileReader = new FileReader(file);
//3、读入的操作
System.out.println("4.0文件输出内容:");
char[] cbuf =new char[5];
int len;
while((len = fileReader.read(cbuf)) != -1){
for (int i = 0; i < len; i++) {
System.out.print(cbuf[i]);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//4、流的关闭
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Test
/**
* 将文件内容读入程序中,并输出到控制台4.0
* 优化
* 使用一个数组,一个可读多个字符
* 使用数组方式是
*/
public void test4(){
FileReader fileReader = null;
try {
//1、 File 类的实例化
File file = new File("hello.txt");
//2、FileReader 流的实例化
fileReader = new FileReader(file);
//3、读入的操作
System.out.println("4.0文件输出内容:");
char[] cbuf =new char[5];
int len;
while((len = fileReader.read(cbuf)) != -1){
//使用数组方式
String str = new String(cbuf,0,len);
System.out.print(str);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//4、流的关闭
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行结果:
1.0文件输出内容:
hello Master
love
============================
2.0文件输出内容:
hello Master
love
4.0文件输出内容:
hello Master
love
4.0文件输出内容:
hello Master
love