输入输出流学习
一、字节流
输入字节流:
|----------|InputStream 输入字节流的基类,抽象类
|----------------|FileInputStream
|----------------|BufferedInputStream 缓冲输入字节流
输出字节流:
|----------|OutPutStream 输出字节流基类
|----------------|FileInputStream
|----------------|BufferedOutPutStream
什么时候使用字节流: 读取到的数据不需要编码或解码的情况,不如图片数据。
Demo1 以 字节流 形式向文件输入、输出数据
import java.io.*;
public class InOutStream
{
public static void main(String []args)throws IOException{
//向文件写入数据
File file = new File("F://a.txt"); //创建文件对象
String str = "我有一头小毛驴,但我也不骑!";
FileOutputStream fos = new FileOutputStream(file);
//创建文件输出流对象
fos.write(str.getBytes()); //从内存写入文件中(write(byte[]))
FileInputStream fis = new FileInputStream(file);
//创建文件输入流对象
byte []buffer = new byte[1024]; //定义缓冲区
int len = -1;
len = fis.read(buffer);
// read(byte[]b) 从输入流读取一定数量字节,并将其存放到 b 中
//同时,以int形式返回读取的字节数
String fileData = new String(buffer,0,len);//byte[]->string
System.out.println("文件内容:"+fileData);
}
}
使用FileInputStream和FileOutPutStream类向文件写入与读出数据时,都存在一点不足,即这两个类都只提供对字节或字节数组的读取方法。由于汉字在文件中占两个字节,如果使用字节流读取不好可能会出项乱码现象。 此时采用字符流 Reader 和 Writer 即可避免。
二、字符流
字符流 = 字节流 + 编码(解码)
输入字符流:
|---------------| Reader 所有输入字符流的基类,抽象类
|------------------|FileReader 读取文件字符的输入字符流
|------------------|BuferedReader 维护了8192个长度的字符数组
输出字符流:
|---------------| Writer所有输出字符流的基类。
|------------------|FileWriter
|------------------|BufferedWrite
什么情况下使用字符流:读取都是字符流
Demo 2 以 字符流 形式向文件写入、读取数据
import java.io.*;
public class FileWR
{
public static void main(String []args)throws Exception{
File file = new File("F://b.txt");
FileWriter fw = new FileWriter(file);
String str = "梦里一吧杀猪刀!";
fw.write(str);
fw.close();
FileReader fr = new FileReader(file);
char []buffer = new char[1024];
int len = -1;
len = fr.read(buffer);
String fileData = new String(buffer,0,len);
System.out.println("文件内容: "+ fileData);
fr.close();
}
}
三、转化流
输入字节流转换流
InputStreamReader
输出字节转换流
OutputStreamWriter
转换流的作用:
1、可以把对应的字节流转换成字符流使用
2、指定编码类型
Demo3 转换流的作用
import java.io.*;
public class ChangeStream
{
public static void main(String []args)throws IOException{
// Test_1();
Test_2();
}
public static void Test_1()throws IOException{
InputStream input = System.in;// 标准输入流
int str = input.read();//一个字节一个字节的读
//当输入: abc 时,只能输出 97(a) 。
System.out.println(""+str);
}
public static void Test_2()throws IOException{
InputStream input = System.in;
InputStreamReader isr = new InputStreamReader(input);//字符转化流,将标准输入 流转变为字符,此处可以指定字符集
BufferedReader br = new BufferedReader(isr);//
String str = br.readLine();// 行读取数据
System.out.println(""+str);
}
}