1.字节缓冲流(了解,一般不会用)
构造方法:
方法名 | 说明 |
---|---|
BufferedOutputStream(OutputStream out) | 创建字节缓冲输出流对象 |
BufferedInputStream(InputStream in) | 创建字节缓冲输入流对象 |
-
示例代码
public class BufferStreamDemo { public static void main(String[] args) throws IOException { //字节缓冲输出流:BufferedOutputStream(OutputStream out) BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("myByteStream\\bos.txt")); //写数据 bos.write("hello\r\n".getBytes()); bos.write("world\r\n".getBytes()); //释放资源 bos.close(); //字节缓冲输入流:BufferedInputStream(InputStream in) BufferedInputStream bis = new BufferedInputStream(new FileInputStream("myByteStream\\bos.txt")); //一次读取一个字节数据 // int by; // while ((by=bis.read())!=-1) { // System.out.print((char)by); // } //一次读取一个字节数组数据 byte[] bys = new byte[1024]; int len; while ((len=bis.read(bys))!=-1) { System.out.print(new String(bys,0,len)); } //释放资源 bis.close(); } }
2.编码表
电脑只认识字节数据(二进制数据)
*ASCII:一个字节代表一个字符
*GBK:最常用的中文码表。一个中文使用俩个字节编码。
*UTF-8:一个中文使用三个字节。
*现在用的最多的是UTF-8
3.String的常用方法
String----> byte[] arr:编码的过程
byte[] getByte();采用平台默认的编码;
byte[] getByte (String 编码名称);
byte------> String :解码的过程;
String(byte[] arr);------->将字节数组变成字符串,采用的是平台默认的码表;
String(byte[] arr,String charsetName);------->通过指定的字符集解码指定的字节数组来创建字符串
*编码和解码使用的码表必须是同一个否则会出现乱码现象
如:编码使用GBK,解码就必须使用GBK。
String ----> char[] :
char[] toCharArray();
char[] ----> String :
String(char[] value) --->可以通过String的构造将字符数组变成字符串
4. 字符流
4.1
Reader(抽象类)
Writer (抽象类)
字符流=字节流+编码表
| 方法名 | 说明 |
| --------------------------------------------------- | -------------------------------------------- |
字符输入流:| InputStreamReader(InputStream in) | 使用默认字符编码创建InputStreamReader对象 |
| InputStreamReader(InputStream in,String chatset) | 使用指定的字符编码创建InputStreamReader对象 |
字符输出流:| OutputStreamWriter(OutputStream out) | 使用默认字符编码创建OutputStreamWriter对象 |
| OutputStreamWriter(OutputStream out,String charset) | 使用指定的字符编码创建OutputStreamWriter对象 |
close(); ----->清空缓冲区的数据到硬盘上并关闭资源。
**注意:在close();后面不能再输入数据,否则会报错
flush();------>清空缓冲区的数据到硬盘上
flush();后面可以在输入数据
代码演示
public class ConversionStreamDemo {
public static void main(String[] args) throws IOException {
//OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("myCharStream\\osw.txt"));
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("myCharStream\\osw.txt"),"GBK");
osw.write("中国");
osw.close();
//InputStreamReader isr = new InputStreamReader(new FileInputStream("myCharStream\\osw.txt"));
InputStreamReader isr = new InputStreamReader(new FileInputStream("myCharStream\\osw.txt"),"GBK");
//一次读取一个字符数据
int ch;
while ((ch=isr.read())!=-1) {
System.out.print((char)ch);
}
isr.close();
}
}
##4.2 字符流读数据的2种方式【应用】
- 方法介绍
| 方法名 | 说明 |
| --------------------- | ---------------------- |
| int read() | 一次读一个字符数据 |
| int read(char[] cbuf) | 一次读一个字符数组数据 |
## 4.3 写方法的方式
方法介绍
| 方法名 | 说明 |
| ----------------------------------------- | -------------------- |
| void write(int c) | 写一个字符 |
| void write(char[] cbuf) | 写入一个字符数组 |
| void write(char[] cbuf, int off, int len) | 写入字符数组的一部分 |
| void write(String str) | 写一个字符串 |
| void write(String str, int off, int len) | 写一个字符串的一部分 |
**前三种方式不好用,基本用不到
**最后俩种用到最多
中文的字节存储方式
用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文的呢?
汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数
### 5. 字符缓冲流:(重点)
BufferedReader(Reader r)
int read();// 一次读一个字符
int read(char[] arr); //一次读一个字符数组的数据
*String readLine(); //一次读一行, 不读取换行符号!!!!!!!!!!!!!!!!!!!!!!
close();
BufferedWriter(Writer w)
write(int ch); //一次写一个字符
write(char[] arr);//一次写一个字符数组
write(char[] arr,int start,int length); //一次写一个字符数组的一部分
write(String str); //直接写一个字符串
*write(String str,int start,int length); //直接写一个字符串
flush(); ---->将缓冲区中的数据刷新到硬盘上
*newLine() ----> 他可以根据操作系统,来写出一个换行符!!!!!!!!!!!!!!!!!!!!!!!!!!
*close(); ---->关闭资源,而且在关闭资源前检查缓冲区,如果有数据写到硬盘上