java ——流

OutputStreamWriter(字符流通向字节流的桥梁)

1.程序中的字符 先使用转换流 根据转换流想查询码表

格式去查询

2.如果查的是GBK格式 那么一个中文字符

就查到两个字节的 字节编码

3.这个字节最后给到了 构建转换流是传入的字节流

4.通过这个字节流 按字节写入到文件中

转换流:可以查询对应编码表


默认UTF-8格式写文件 拿到Windows系统上读取

windows会默认使用GBK格式来读取文件 乱码

转换流可以根据你想要的编码格式进行读写

读写时可以设置编码格式


构造方法(不传编码格式 默认使用的系统的编码格式)

1.需要字节输出流

2.编码格式的名字(UTF-8 ,GBK 不区分大小写)


InputStreamReader(读取文件 字节流通向字符流的桥梁)

1.按字节读取文件 将字节编码给到转换流

2.如果是UTF-8需要3个字节

3.使用字符流读取到程序中

public static void main(String[] args) throws IOException {
		// 测试
		// getUTF8();
		// GBK();
		
//		readUTF8();
		readGBK();
	}
	// 按操作系统默认格式(UTF-8)写一个文件
	public static void getUTF8() throws IOException {
		// 创建一个字节输出流
		FileOutputStream fos = new FileOutputStream("/Users/lanou/Desktop/test/UTF8.txt");
		// 创建一个转换流
		OutputStreamWriter osw = new OutputStreamWriter(fos);
		// 写文件
		osw.write("嘻嘻");
		// 注意:
		// 1.一般只关外层 的流就可以
		// 2.自己创建的流自己关 获取系统的流 不用关
		osw.close();
	}
	
	// 按GBK格式写入文件 
	public static void GBK() throws IOException {
		FileOutputStream fos = new FileOutputStream("/Users/lanou/Desktop/test/GBK.txt");
		OutputStreamWriter osw = new OutputStreamWriter(fos,"GBK");
		osw.write("嘻嘻");
		osw.close();
	}
	
	// 按默认UTF8格式读文件
	public static void readUTF8() throws IOException {
		FileInputStream fis = new FileInputStream("/Users/lanou/Desktop/test/UTF8.txt");
		InputStreamReader isr = new InputStreamReader(fis);
		int len = 0;
		char[] c =new char[1024];
		while ((len = isr.read(c)) != -1) {
			System.out.println(new String(c,0,len));
		}
		isr.close();
	}
	
	// 按GBK格式读文件
	public static void readGBK() throws IOException {
		FileInputStream fis = new FileInputStream("/Users/lanou/Desktop/test/GBK.txt");
		InputStreamReader isr = new InputStreamReader(fis,"GBK");
		int len = 0;
		char[] c =new char[1024];
		while ((len = isr.read(c)) != -1) {
			System.out.println(new String(c,0,len));
		}
		isr.close();
	}
	

基本的编码格式

 * Mac 默认所有UTF-8格式(通用编码格式)

 * 一个中文字符 占3个字节

 * Windows 默认使用GBK格式(简体中文格式)

 * 一个中文字符 占2个字节

 * 

 * 字符流

 * Writer (写文件) 字符输出流

 * Reader (读文件) 字符输入流                       

 * 上面两个类 是所有字符流的父类(抽象类)

public static void main(String[] args) throws IOException {
		// 创建一个文件字符输出流
		File file = new File("/Users/lanou/Desktop/test/ee.txt");
		FileWriter fw = new FileWriter(file);
		// 写
		fw.write(65);
		// 刷新
		// 相当于 写入的时候 有一个缓冲区
		// 写的字符实际上 是先写入到缓冲区
		// 刷新的时候 才会将写的字符全部 写入到文件中
		// 建议:写一次刷新一次
		 fw.flush();
		 
		 // 利用字符数组写入
		 char[] c = {'x','x','f'};
		fw.write(c);
		fw.flush();
		// 利用字符串写入
		fw.write("汉皇重色思倾国,御宇多年求不得。\n" + 
				"杨家有女初长成,养在深闺人未识。\n" + 
				"天生丽质难自弃,一朝选在君王侧。\n" + 
				"回眸一笑百媚生,六宫粉黛无颜色。\n" + 
				"春寒赐浴华清池,温泉水滑洗凝脂。\n" + 
				"侍儿扶起娇无力,始是新承恩泽时。\n" + 
				"云鬓花颜金步摇,芙蓉帐暖度春宵。\n" + 
				"春宵苦短日高起,从此君王不早朝。\n" + 
				"\n" + 
				"承欢侍宴无闲暇,春从春游夜专夜。\n" + 
				"后宫佳丽三千人,三千宠爱在一身。\n" + 
				"金屋妆成娇侍夜,玉楼宴罢醉和春。\n" + 
				"姊妹弟兄皆列土,可怜光彩生门户。\n" + 
				"遂令天下父母心,不重生男重生女。\n" + 
				"骊宫高处入青云,仙乐风飘处处闻。\n" + 
				"缓歌慢舞凝丝竹,尽日君王看不足。\n" + 
				"渔阳鼙鼓动地来,惊破霓裳羽衣曲。\n" + 
				"\n" + 
				"九重城阙烟尘生,千乘万骑西南行。\n" + 
				"翠华摇摇行复止,西出都门百余里。\n" + 
				"六军不发无奈何,宛转蛾眉马前死。\n" + 
				"花钿委地无人收,翠翘金雀玉搔头。\n" + 
				"君王掩面救不得,回看血泪相和流。\n" + 
				"黄埃散漫风萧索,云栈萦纡登剑阁。\n" + 
				"峨嵋山下少人行,旌旗无光日色薄。\n" + 
				"蜀江水碧蜀山青,圣主朝朝暮暮情。\n" + 
				"\n" + 
				"行宫见月伤心色,夜雨闻铃肠断声。\n" + 
				"天旋地转回龙驭,到此踌躇不能去。\n" + 
				"马嵬坡下泥土中,不见玉颜空死处。\n" + 
				"君臣相顾尽沾衣,东望都门信马归。\n" + 
				"归来池苑皆依旧,太液芙蓉未央柳。\n" + 
				"芙蓉如面柳如眉,对此如何不泪垂。\n" + 
				"春风桃李花开日,秋雨梧桐叶落时。");
		fw.flush();
		
		// 关闭流资源
		// 关闭流资源之前会自动刷新缓冲区
		fw.close();
	}

缓冲流

 * 内部自带缓冲区(字节数组)

 * BufferedOutputStream(写文件) 缓冲字节输出流

 * BufferedInputStream(读文件)  缓冲字节输入流

public static void main(String[] args) throws IOException {
		// fun1();
		FileInputStream fis = new FileInputStream("/Users/lanou/Desktop/test/feng.txt");
		// 读
		BufferedInputStream bis = new BufferedInputStream(fis);
		
		int len = 0;
		byte[] b = new byte[1024];
		while ((len = bis.read(b)) != -1) {
			System.out.println(new String(b,0,len));
		}
		bis.close();
	}

	private static void fun1() throws FileNotFoundException, IOException {
		FileOutputStream fos = new FileOutputStream("/Users/lanou/Desktop/test/feng.txt");
		// 构建一个缓冲流写文件
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		// 写
		bos.write("feng".getBytes());
		// 关闭资源
		bos.close();
	}



你可能感兴趣的:(流,缓冲流,字符流)