文章目录
转换流
使用场景:读写文件时,中文乱码的问题
为什么产生中文乱码问题?编码和解码时使用的码表不一致
编码:符号——>码值
解码:码值——>符号
输出字符流:OutputStreamWriter
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节。它的作用的就是,将字符串按照指定的编码表转成字节,在使用字节流将这些字节写出去。
public class Demo{
public static void main(String[] args) throws IOException {
FileOutputStream fos=new FileOutputStream("UTF-8_1.txt");//OutputStreamWriter需要字节输出流
OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8");
osw.write("你好");
osw.close();
}
}
OutputStreamWriter流对象,它到底如何把字符转成字节输出的呢?
其实在OutputStreamWriter流中维护自己的缓冲区,当我们调用OutputStreamWriter对象的write方法时,会拿着字符到指定的码表中进行查询,把查到的字符编码值转成字节数存放到OutputStreamWriter缓冲区中。然后再调用刷新功能,或者关闭流,或者缓冲区存满后会把缓冲区中的字节数据使用字节流写到指定的文件中。
输入字符流:InputStreamReader
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的字符编码表读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
public class Demo {
public static void main(String[] args) throws IOException{
FileInputStream fis=new FileInputStream("UTF-8_2.txt");
InputStreamReader isr=new InputStreamReader(fis,"UTF-8");
int ch;
while((ch=isr.read())!=-1){
System.out.println((char)ch);
}
isr.close();
}
}
缓冲流
Java中提高了一套缓冲流,它的存在,可提高IO流的读写速度
缓冲流,根据流的分类分类为字节缓冲流与字符缓冲流。
字节缓冲流
字节缓冲流根据流的方向,共有2个
-
写入数据到流中,字节缓冲输出流 BufferedOutputStream
-
读取流中的数据,字节缓冲输入流 BufferedInputStream
它们的内部都包含了一个缓冲区,通过缓冲区读写,就可以提高了IO流的读写速度
字节缓冲输出流BufferedOutputStream
通过字节缓冲流,进行文件的读写操作 写数据到文件的操作
- 构造方法
public BufferedOutputStream(OutputStream out)创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*高效字节流
* 高效字节输出流
* OutputStream
* BufferedOutputStream
* 构造方法:
* BufferedOutputStream(OutputStream out)
成员方法:
void write(int b)
void write(byte[] b)
void write(byte[] b, int off, int len)
BufferedOutputStream原理:
底层使用了一个长度为8192的字节数组,我们再利用write写数据的时候都会写到
底层的字节数组中,我们可以通过手动刷新(将字节数组中的内容刷到文件)或者关流
(关流包含:先刷新在关流)
*/
public class Demo {
public static void main(String[] args)throws IOException{
//method01();
// method02();
FileOutputStream fos=new FileOutputStream("buffer.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] bArr={
98,99,100,101,102};
bos.write(bArr, 2, 2);
bos.close();
}
private static void method01() throws FileNotFoundException, IOException {
//1.需要创建一个字节流对象关联文件
FileOutputStream fos=new FileOutputStream("buffer.txt");
//2.对FileOutputStream进行高效
BufferedOutputStream bos = new BufferedOutputStream(fos);
//3.向buffer.txt中写内容
bos.write(97);
bos.flush();
//4.关流释放资源
bos.close();
}
private static void method02() throws FileNotFoundException, IOException {
FileOutputStream fos=new FileOutputStream("buffer.txt");
BufferedOutputStream bos