(43)Java学习笔记——IO流 / 字符流 / 编码表

字符流=字节流+编码表

编码表

ASCII码表

ISO-8859-1 拉丁码表

gb2312  简体中文表

gbk  中文编码表升级

gb18030  GBK的取代版本

BIG-5   繁体字编码方案

Unicode  国际编码表/所有文字都用两个字节来表示,java使用的就是Unicode

UFT-8  最多用三个字节来表示一个字符


字符串的编码和解码

String(byte[] bytes, String charsetName)   //通过制定的字符集解码字节数组

byte[ ] getBytes(String charsetName)  //使用制定的字符集合把字符串编码为字节数组

编码:把看得懂的变成看不懂的   String---->byte[ ]

解码:把看不懂的变成看得懂的   byte[ ] ---->String

package cn.itcast_01;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

/*
 * String(byte[] bytes, String charsetName)   //通过制定的字符集解码字节数组
byte[ ] getBytes(String charsetName)  //使用制定的字符集合把字符串编码为字节数组
编码:把看得懂的变成看不懂的   String---->byte[ ]
解码:把看不懂的变成看得懂的   byte[ ] ---->String
 */
public class StringDemo {
	public static void main(String[] args) throws UnsupportedEncodingException {
		String s = "你好";
		
		// String---->byte[ ]
		byte[] bys = s.getBytes();
		byte[] bys2 = s.getBytes("GBK");
		byte[] bys3 = s.getBytes("UTF-8");
		
		System.out.println(Arrays.toString(bys));	//[-60, -29, -70, -61]
		System.out.println(Arrays.toString(bys2));	//[-60, -29, -70, -61]
		System.out.println(Arrays.toString(bys3));	//[-28, -67, -96, -27, -91, -67]
		
		//byte[ ] ---->String
		String ss = new String(bys);
		String ss2 = new String(bys,"gbk");
		String ss3 = new String(bys,"UTF-8");
		
		System.out.println(ss);     //你好
		System.out.println(ss2);	//你好
		System.out.println(ss3);	//???
		
		byte[] bys31 = s.getBytes("UTF-8");
		String ss31 = new String(bys31,"UTF-8");
		System.out.println(ss31);		//你好
		
	}
}


IO流中的编码解码

类 OutputStreamWriter

字符流=字节流+编码表
构造方法:
OutputStreamWriter(OutputStream out)  //默认编码表
OutputStreamWriter(OutputStream out, String charsetName) //指定编码表
范例
package cn.itcast_02;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

/*
 * OutputStreamWriter(OutputStream out)  //默认编码表
 * OutputStreamWriter(OutputStream out, String charsetName) //指定编码表
 * 把字节流转换为字符流
 * 字符流=字节流+编码表
 */
public class OutputStreamWriterDemo {
	public static void main(String[] args) throws IOException {
		//创建对象
		OutputStreamWriter osw = new OutputStreamWriter(
				new FileOutputStream("osw.txt"));		//默认GBK
		
		OutputStreamWriter osw2 = new OutputStreamWriter(
				new FileOutputStream("osw2.txt"),"GBK");		//指定GBK
		
		//写数据
		osw.write("中国");
		osw2.write("中国");
		
		//释放
		osw.close();
		osw2.close();
	}
}

类 OutputStreamReader

构造方法:
OutputStreamReader(OutputStream out)  //默认编码表读取数据
OutputStreamReader(OutputStream out, String charsetName) //指定编码表读取数据
范例
package cn.itcast_02;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

/*
 * 类 OutputStreamReader

构造方法:
OutputStreamReader(OutputStream out)  //默认编码表读取数据
OutputStreamReader(OutputStream out, String charsetName) //指定编码表读取数据
 */
public class InputStreamReaderDemo {
	public static void main(String[] args) throws IOException {
		//创建对象
		InputStreamReader isr = new InputStreamReader(
				new FileInputStream("osw.txt"));
		
		//读取
		int ch =0;
		while((ch=isr.read())!= -1){
			System.out.print((char)ch);
			
		}
		
		//释放
		isr.close();
	}
}
字符流的5种写数据的方式:
 * OutputStreamWriter写数据的方法
 * OutputStreamWriter写数据的方法
 * public void write(int c) //写入单个字符
 * public void write(char[] cbuf) //写入字符数组
 * public void write(char[] cbuf,int off, int len) //写入字符数组的一部分
 * public void write(String str) //写入字符串
 * public void write(String str,int off,int len) //写入字符串的一部分
范例:
package cn.itcast_03;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

/*
 * OutputStreamWriter写数据的方法
 * public void write(int c)		//写入单个字符	
 * public void write(char[] cbuf)	//写入字符数组
 * public void write(char[] cbuf,int off, int len)		//写入字符数组的一部分
 * public void write(String str)	//写入字符串
 * public void write(String str,int off,int len)	//写入字符串的一部分
 */
public class OutputStreamWriterDemo {
	public static void main(String[] args) throws IOException {
		//创建字符流对象
		OutputStreamWriter osw = new OutputStreamWriter( 
				new FileOutputStream("osw3.txt"));
		
		//写数据
		osw.write('a');
		osw.write(97);
		
		//public void write(char[] cbuf)	//写入字符数组
		char[] chs = {'a','b','c','d'};
		osw.write(chs);
		
		// public void write(char[] cbuf,int off, int len)		//写入字符数组的一部分
		osw.write(chs, 0, 2);
		
		//public void write(String str)	//写入字符串
		osw.write("中国你好");
		
		//public void write(String str,int off,int len)	//写入字符串的一部分
		String str = "helloworld";
		osw.write(str, 0, 6);
		
		//刷新缓冲区
		osw.flush(); 	//写入数据时,数据只存在缓冲区,还没到文件,所以要刷新后写入文件
		
		//释放资源
		osw.close();
	}
}
字符流的2种读数据的方式:

 * InputStreamReader的方法
 * int read() 一次读取一个字符
 * int read(char[] chs)   一次读取一个字符数组

package cn.itcast_03;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

/*
 * InputStreamReader的方法
 * int read() 一次读取一个字符
 * int read(char[] chs)   一次读取一个字符数组
 */
public class InputStreamReaderDemo {
	public static void main(String[] args) throws IOException {
		//创建字符流对象
		InputStreamReader isr = new InputStreamReader(
				new FileInputStream("osw3.txt"));
		
		//读出数据
		//一次读取一个字符
		int ch = 0;
		while((ch = isr.read())!=-1){
			System.out.print((char)ch);
		}
		
		//一次读取一个字符数组
		char[] chs = new char[1024];
		int len = 0;
		while((len=isr.read(chs))!=-1){
			System.out.println(new String(chs,0,len));
		}
		
		//释放资源
		isr.close();
		
		
	}
}


练习01:复制文本文件

package cn.itcast_04;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/*
 * 练习:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
 */
public class CopyFileTest_01 {
	public static void main(String[] args) throws IOException {
		//创建字符流对象
		InputStreamReader  isr = new InputStreamReader(
				new FileInputStream("a.txt"));
		OutputStreamWriter osw = new OutputStreamWriter(
				new FileOutputStream("b.txt"));
		
		//读取写出数据
		char[] chs = new char[1024];
		int len = 0;
		while((len = isr.read(chs))!=-1){
			osw.write(chs, 0, len);
		}
		
		//刷新缓冲区
		osw.flush();
		
		//释放资源
		isr.close();
		osw.close();
		
	}
}
————————————————————————————————————

字符缓冲流

BufferedWriter 字符缓冲输出刘

将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 

构造方法:

BufferedWriter(Writer out)

范例:

package cn.itcast_05;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;

/*
 * BufferedWriter
 * 
 */
public class BufferedWriterDemo {
	public static void main(String[] args) throws IOException {
		//创建字符缓冲流对象
/*		BufferedWriter bf = new BufferedWriter(
				new OutputStreamWriter(
						new FileOutputStream("c.txt")));*/
		//简写成
		BufferedWriter bf = new BufferedWriter(
				new FileWriter("c.txt"));
		
		
		//写入数据
		bf.write("hello");
		bf.write("world");
		bf.write("java");
		
		bf.flush();
		bf.close();
		
	}
}

BufferedReader    字符缓冲输入流

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

构造方法:

BufferedReader(Reader in)

范例:

package cn.itcast_05;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/*
 * BufferedReader
 * 构造方法:
BufferedReader(Reader in)
 */
public class BufferedReaderDemo {
	public static void main(String[] args) throws IOException {
		//创建字符流对象
		BufferedReader br = new BufferedReader(
				new FileReader("b.txt"));
		
		//读出数据
		char[] chs = new char[1024];
		int len;
		while((len = br.read(chs))!=-1){
			System.out.println(new String(chs,0,len));
		}
		
		//释放资源
		br.close();
		
		
	}
}
练习01:字符缓冲流复制文本文件

package cn.itcast_06;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/*
 * 字符缓冲流复制文本文件
 */
public class CopyFileTest_01 {
	public static void main(String[] args) throws IOException {
		//创建缓冲流对象
		BufferedReader br = new BufferedReader(
				new FileReader("f:\\a.txt"));
		BufferedWriter bw = new BufferedWriter(
				new FileWriter("g:\\b.txt"));
		
		//读写文件
		char[] chs = new char[1024];
		int len;
		while((len = br.read(chs))!=-1){
			bw.write(chs, 0, len);
		}
		
		//释放资源
		br.close();
		bw.close();
		
	}
}

字符缓冲流的特殊方法:

 * BufferedWrirer
 * public void newLine() : 根据系统来决定换行符

范例:

package cn.itcast_06;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

/*
 * 字符缓冲流的特殊方法
 * BufferedWrirer
 * 		public void newLine() : 根据系统来决定换行符
 * BufferedReader
 * 		public void readLine()  : 一次读取一行
 */
public class BufferedDemo {
	public static void main(String[] args) throws IOException {
		//创建字符缓冲输出流对象
		BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
		
		//输出数据
		for (int x =0;x<10;x++){
			bw.write("hello"+x);
			bw.newLine(); //根据系统来决定换行符,自动识别系统
			bw.flush();
		}
		
		//释放资源
		bw.close();
	}
}


 * BufferedReader
 * public void readLine()  : 一次读取一行(根据换行符来决定)

范例:

package cn.itcast_06;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/*
 * 字符缓冲流的特殊方法
 * BufferedWrirer
 * 		public void newLine() : 根据系统来决定换行符
 * BufferedReader
 * 		public void readLine()  : 一次读取一行
 */
public class BufferedDemo {
	public static void main(String[] args) throws IOException {
		write();
		
		read();
	
		
	}

	private static void read() throws IOException {
		//创建字符缓冲输入流对象
		BufferedReader bf = new BufferedReader(new FileReader("bw.txt"));
		
		//输入数据
/*		//方法一
		char[] chs = new char[1024];
		int len;
		while((len = bf.read(chs))!=-1){
			System.out.println(new String(chs,0,len));
		}*/
		
		//方法二  //一次读取一行
		String line = null;
		while((line = bf.readLine())!=null){
			System.out.println(line);
		}
		
		//释放资源
		bf.close();
		
	}

	private static void write() throws IOException  {
		//创建字符缓冲输出流对象
		BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
		
		//输出数据
		for (int x =0;x<10;x++){
			bw.write("hello"+x);
			bw.newLine(); //根据系统来决定换行符,自动识别系统
			bw.flush();
		}
		
		//释放资源
		bw.close();
		
	}
	
	
}










  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值