IO流
一.转换流
转换流是为了解决编码问题.
1.OutputStreamWriter 字符输出转换流
构造方法
- OutputStreamWriter(OutputStream out) 创建使用默认字符编码的 OutputStreamWriter。
- OutputStreamWriter(OutputStream out, Charset cs) 创建使用给定字符集的 OutputStreamWriter。
- OutputStreamWriter(OutputStream out, CharsetEncoder enc) 创建使用给定字符集编码器的 OutputStreamWriter。
- OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的 OutputStreamWriter。
- 常用方法与Writer类类似.
基本步骤 :
- 创建字节输出流
- 创建转换流,将字节流包进去
- 使用转换流进行输出
- 关闭资源
//字符转字节 输出
@Test
void charobyte() {
//目标文件
File file = new File("out.txt");
//创建字节输出流
try {
FileOutputStream fos=new FileOutputStream(file,true);//追加写出
//创建转换流,将字节包进去
//设置转换时使用的编码格式
//OutputStreamWriter( , )第一个参数为转换的字节输出流,第二个参数为转换后使用的编码
OutputStreamWriter osw=new OutputStreamWriter(fos,"utf-8");
//使用转换流进行输出
osw.write("这是使用转换流进行输出的");
//关闭资源
osw.flush();
osw.close();
fos.close();
System.out.println("写出成功");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2.InputStreamReader
2.1构造方法
- InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader。
- InputStreamReader(InputStream in, Charset cs) 创建使用给定字符集的 InputStreamReader。
- InputStreamReader(InputStream in, CharsetDecoder dec) 创建使用给定字符集解码器的 InputStreamReader。
- InputStreamReader(InputStream in, String charsetName) 创建使用指定字符集的 InputStreamReader。
2.2常用方法
- void
close() 关闭该流。 - String
getEncoding() 返回此流使用的字符编码的名称。 - int
read() 读取单个字符。 - int
read(char[] cbuf, int offset, int length) 将字符读入数组中的某一部分。 - boolean
ready() 告知是否准备读取此流。
//读取操作
@Test
void reader() {
try {
FileReader fr=new FileReader(new File("out.txt"));
int c=-1;
while((c=fr.read())!=-1) {
System.out.print((char)c);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Test
void reader01() {
//字节输出流,交给字符输出流
try {
FileInputStream fileInputStream=new FileInputStream(new File("out.txt"));
//使用文件所有编码读取到内存中
InputStreamReader isr=new InputStreamReader(fileInputStream,"utf-8");
//获取当前所用编码
System.out.println(isr.getEncoding());
int c=-1;
while((c=isr.read())!=-1) {
System.out.print((char)c);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
二.缓冲流
- 缓冲流主要是提高读写速度.
- 缓冲流的默认缓冲区大小是8kb,是8192个字节
1.字节缓冲流
1.1BufferedInputStream
1.1.1构造方法
- BufferedInputStream(InputStream in) 创建 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
- BufferedInputStream(InputStream in, int size) 创建具有指定缓冲区大小的 BufferedInputStream,并保存其参数,即输入流 in,以便将来使用。
基本操作
- 创建字节输入流
- 字节输入缓冲流
- 读取内容
- 关闭资源
//字节输入缓冲流
@Test
void readbyte() {
//字节输入流
try {
FileInputStream fis=new FileInputStream(new File("bufferio.txt"));
//缓冲流
BufferedInputStream bis=new BufferedInputStream(fis);
//存入数组中
byte[] bytes=new byte[fis.available()];
bis.read(bytes);
System.out.println(new String(bytes));
bis.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
1.2BufferedOutputStream
1.2.1构造方法
- BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的基础输出流。
- BufferedOutputStream(OutputStream out, int size) 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的基础输出流。
基本步骤
- 创建字节输出流
- 字节输出缓冲流
- 使用缓冲流写
- 关闭资源
//字节输出缓冲流
@Test
void byteout() {
//创建输出缓冲流
try {
FileOutputStream fos=new FileOutputStream(new File("bufferio.java"));
//字节输出缓冲流
BufferedOutputStream bos=new BufferedOutputStream(fos);
//使用缓冲流写
bos.write("这是缓冲流的操作".getBytes());
//关闭资源
bos.flush();
bos.close();
fos.close();
System.out.println("操作成功");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2.字符缓冲流
2.1BufferedWriter
2.1.1构造方法
- BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。
- BufferedWriter(Writer out, int sz) 创建一个使用指定大小输出缓冲区的新缓冲字符输出流。
2.2BufferedReader
2.2.1构造方法
- BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。
- BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流。
@Test
void IO02() {
//字符缓冲流
File file=new File("D:\\123\\hello.txt");
try {
Reader read=new FileReader(file);
//缓冲流字符对象
BufferedReader br=new BufferedReader(read);
char[] c=new char[10];
//循环读出写出
int len=0;
while((len = br.read(c))!=-1) {
System.out.println(c);
}
//关闭资源
br.close();
read.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//字符输入缓冲流
@Test
void readbyte() {
//源文件
File file = new File("bufferio.txt");
try {
//字节输入流
FileInputStream fis=new FileInputStream(file);
//转换流
InputStreamReader isr=new InputStreamReader(fis,"GBK");
//字符输入缓冲流
BufferedReader br=new BufferedReader(isr,1024);
//读取文件
char[] c=new char[fis.available()];
br.read();
//关闭资源
br.close();
isr.close();
fis.close();
System.out.println("操作成功");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
- 相同的写法
@Test
void readbyte01() {
try {
//字符输入缓冲流
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(new File("bufferio.txt")),"GBK"),1024);
//读取文件
char[] c=new char[10];
br.read();
//关闭资源
br.close();
System.out.println("操作成功");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}