`

传智播客风清扬视频-------IO简述之字符流常用实现类

阅读更多
字符编码:

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(); // [-60, -29, -70, -61]
		// byte[] bys = s.getBytes("GBK");// [-60, -29, -70, -61]
		// byte[] bys = s.getBytes("UTF-8");// [-28, -67, -96, -27, -91, -67]
		System.out.println(Arrays.toString(bys));

		// byte[] -- String
		String ss = new String(bys); // 你好
		// String ss = new String(bys, "GBK"); // 你好
		// String ss = new String(bys, "UTF-8"); // ???
		System.out.println(ss);
	}
}


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 osw = new OutputStreamWriter(new FileOutputStream(
		// "osw.txt"), "GBK"); // 指定GBK
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
				"osw.txt"), "UTF-8"); // 指定UTF-8
		// 写数据
		osw.write("中国");

		// 释放资源
		osw.close();
	}
}


InputStreamReader(InputStream is) :用默认字符编码读取数据
InputStreamReader(InputStrea is,String charSetName) :用指定字符编码读取数据

public class InputStreamReaderDemo {
	public static void main(String[] args) throws IOException {
		// 创建对象
		// InputStreamReader isr = new InputStreamReader(new FileInputStream(
		// "osw.txt"));

		// InputStreamReader isr = new InputStreamReader(new FileInputStream(
		// "osw.txt"), "GBK");

		InputStreamReader isr = new InputStreamReader(new FileInputStream(
				"osw.txt"), "UTF-8");

		// 读取数据
		// 一次读取一个字符
		int ch = 0;
		while ((ch = isr.read()) != -1) {
			System.out.print((char) ch);
		}

		// 释放资源
		isr.close();
	}
}



OutputStreamWriter 的write()方法:
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):写一个字符串的一部分

close()和flush()的区别?
  A: cloase()关闭流对象,但是先刷新一次缓冲区。关闭之后,流对象不可以再使用。
  B:flush()仅仅刷新缓冲区,刷新之后,流对象还可以继续使用。

public class OutputStreamWriterDemo {
	public static void main(String[] args) throws IOException {
		// 创建对象
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
				"osw2.txt"));

		// 写数据
		// public void write(int c):写一个字符
		// osw.write('a');
		// osw.write(97);
		// 为什么数据没有进去呢?
		// 原因是:字符 = 2字节
		// 文件中数据存储的基本单位是字节。
		// void flush()

		// public void write(char[] cbuf):写一个字符数组
		// char[] chs = {'a','b','c','d','e'};
		// osw.write(chs);

		// public void write(char[] cbuf,int off,int len):写一个字符数组的一部分
		// osw.write(chs,1,3);

		// public void write(String str):写一个字符串
		// osw.write("我爱林青霞");

		// public void write(String str,int off,int len):写一个字符串的一部分
		osw.write("我爱林青霞", 2, 3);

		// 刷新缓冲区
		osw.flush();
		// osw.write("我爱林青霞", 2, 3);

		// 释放资源
		osw.close();
		// java.io.IOException: Stream closed
		// osw.write("我爱林青霞", 2, 3);
	}
}



InputStreamReader的read()方法:
  int read() : 一次读取一个字符
  int read(char[] chs) : 一次读取一个字符数组
public class InputStreamReaderDemo {
	public static void main(String[] args) throws IOException {
		// 创建对象
		InputStreamReader isr = new InputStreamReader(new FileInputStream(
				"StringDemo.java"));

		// 一次读取一个字符
		// 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.print(new String(chs, 0, len));
		}

		// 释放资源
		isr.close();
	}
}



案例:复制文件

/*
 * 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
 * 
 * 数据源:
 * 		a.txt -- 读取数据 -- 字符转换流 -- InputStreamReader
 * 目的地:
 * 		b.txt -- 写出数据 -- 字符转换流 -- OutputStreamWriter
 */
public class CopyFileDemo {
	public static void main(String[] args) throws IOException {
		// 封装数据源
		InputStreamReader isr = new InputStreamReader(new FileInputStream(
				"a.txt"));
		// 封装目的地
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
				"b.txt"));

		// 读写数据
		// 方式1
		// int ch = 0;
		// while ((ch = isr.read()) != -1) {
		// osw.write(ch);
		// }

		// 方式2
		char[] chs = new char[1024];
		int len = 0;
		while ((len = isr.read(chs)) != -1) {
			osw.write(chs, 0, len);
			// osw.flush();
		}

		// 释放资源
		osw.close();
		isr.close();
	}
}



/*
 * 由于我们常见的操作都是使用本地默认编码,所以,不用指定编码。
 * 而转换流的名称有点长,所以,Java就提供了其子类供我们使用。
 * OutputStreamWriter = FileOutputStream + 编码表(GBK)
 * FileWriter = FileOutputStream + 编码表(GBK)
 * 
 * InputStreamReader = FileInputStream + 编码表(GBK)
 * FileReader = FileInputStream + 编码表(GBK)
 * 
 /*
 * 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
 * 
 * 数据源:
 * 		a.txt -- 读取数据 -- 字符转换流 -- InputStreamReader -- FileReader
 * 目的地:
 * 		b.txt -- 写出数据 -- 字符转换流 -- OutputStreamWriter -- FileWriter
 */
public class CopyFileDemo2 {
	public static void main(String[] args) throws IOException {
		// 封装数据源
		FileReader fr = new FileReader("a.txt");
		// 封装目的地
		FileWriter fw = new FileWriter("b.txt");

		// 一次一个字符
		// int ch = 0;
		// while ((ch = fr.read()) != -1) {
		// fw.write(ch);
		// }

		// 一次一个字符数组
		char[] chs = new char[1024];
		int len = 0;
		while ((len = fr.read(chs)) != -1) {
			fw.write(chs, 0, len);
			fw.flush();
		}

		// 释放资源
		fw.close();
		fr.close();
	}
}



BufferedWrter: 字符缓冲流的特殊方法:
public void newLine() : 根据系统来决定换行符
public String readLine() : 一次读取一行数据
  包含行内容的字符串,不包含任何行终止符,如果到达末尾,则返回null
public class BufferedDemo {
	public static void main(String[] args) throws IOException {
		// write();
		read();
	}

	private static void read() throws IOException {
		// 创建字符缓冲输入流对象
		BufferedReader br = new BufferedReader(new FileReader("bw2.txt"));

		// public String readLine():一次读取一行数据
		// String line = br.readLine();
		// System.out.println(line);
		// line = br.readLine();
		// System.out.println(line);

		// 最终版代码
		String line = null;
		while ((line = br.readLine()) != null) {
			System.out.println(line);
		}
		
		//释放资源
		br.close();
	}

	private static void write() throws IOException {
		// 创建字符缓冲输出流对象
		BufferedWriter bw = new BufferedWriter(new FileWriter("bw2.txt"));
		for (int x = 0; x < 10; x++) {
			bw.write("hello" + x);
			// bw.write("\r\n");
			bw.newLine();
			bw.flush();
		}
		bw.close();
	}

}


案例:使用字符缓冲流复制文件
/*
 * 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中
 * 
 * 数据源:
 * 		a.txt -- 读取数据 -- 字符转换流 -- InputStreamReader -- FileReader -- BufferedReader
 * 目的地:
 * 		b.txt -- 写出数据 -- 字符转换流 -- OutputStreamWriter -- FileWriter -- BufferedWriter
 */
public class CopyFileDemo {
	public static void main(String[] args) throws IOException {
		// 封装数据源
		BufferedReader br = new BufferedReader(new FileReader("a.txt"));
		// 封装目的地
		BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));

		// 两种方式其中的一种一次读写一个字符数组
		char[] chs = new char[1024];
		int len = 0;
		while ((len = br.read(chs)) != -1) {
			bw.write(chs, 0, len);
			bw.flush();
		}

		// 释放资源
		bw.close();
		br.close();
	}
}
分享到:
评论

相关推荐

    传智播客 刘意-2015年Java基础视频-深入浅出精华版 笔记day01-day27

    在"传智播客 刘意-2015年Java基础视频-深入浅出精华版 笔记day01-day27"这套课程中,Java初学者将踏上一段全面而深入的Java编程之旅。刘意老师以其丰富的教学经验,将复杂的Java知识讲解得通俗易懂,旨在帮助学员...

    2015年Java基础视频教程_深入浅出完整版

    传智播客风清扬老师的Java基础教程,包括课堂笔记 和课后练习。帮助初学者快速上手,

    传智播客_Andorid_Android基础视频video_第四天修

    "传智播客_Andorid_Android基础视频video_第四天修"这个压缩包显然包含了针对Android初学者的第四天教学内容,旨在帮助学习者深化对Android开发的理解。传智播客是一家知名的教育机构,他们的课程通常覆盖了广泛的IT...

    2015年Java传智博客基础视频笔记_风清扬(刘意).pdf

    - **定义**:用于给类、接口、方法、变量等命名的字符序列。 - **组成规则**:可以由英文字母、数字、`$`和`_`组成,但不能以数字开头且不能是Java的关键字。 - **命名规则**: - 包:全部小写,例如`liuyi`或`...

    刘意JavaSE视频+源码(27天)(百度云)

    传智播客刘意-风清扬的JavaSE学习资料,共有27天,视频和源码都有,下载后打开记事本复制链接密码,下载即可

    输入法-风清扬输入法

    3. 自定义短语:风清扬输入法允许用户自定义快捷短语,将常用长句或段落设置为短键,只需输入几个字符就能快速输入整句话,尤其适合写作和办公场景。 4. 智能纠错:内置强大的纠错机制,当用户输入错误时,风清扬...

    逻辑IO与物理IO 逻辑IO与物理IO 逻辑IO与物理IO

    在计算机系统中,IO(Input/Output)操作是与外部设备进行通信的关键环节。IO 端口是指CPU与外部设备交互的接口,用于发送和接收数据。在不同的硬件架构中,IO 端口的管理和访问方式有所不同,主要分为逻辑IO和物理...

    风清扬主讲SEO免费讲座

    本次讲座由风清扬老师主讲,讲座已经成功举办了四次,并且受到了广泛的好评。为了让更多的人能够学习到SEO的知识,讲座内容被整理成了PDF文件供免费下载。本次讲座得到了红杉树(中国)信息技术有限公司提供的视频...

    风清扬五笔自造词维护

    风清扬五笔自造词维护风清扬五笔自造词维护风清扬五笔自造词维护风清扬五笔自造词维护风清扬五笔自造词维护风清扬五笔自造词维护风清扬五笔自造词维护风清扬五笔自造词维护风清扬五笔自造词维护风清扬五笔自造词维护...

    风清扬简繁体五笔输入法风清扬简繁体五笔输入法

    风清扬简繁体五笔输入法是一款专为中文用户设计的输入工具,它结合了简体和繁体汉字的编码,旨在提供高效、便捷的文字输入体验。在深入理解这款输入法之前,我们首先需要了解五笔字型的基本概念。 五笔字型是一种...

    繁体五笔输入法风清扬

    繁体五笔输入法:风清扬五笔输入法 繁体五笔输入法:风清扬五笔输入法

    风清扬繁简两用五笔输入法

    "风清扬繁简两用五笔输入法"是一款专为中文输入设计的软件,尤其适合需要在繁体和简体中文之间切换的用户。它整合了广东话打法,拓展了传统五笔输入法的功能,增加了对粤语常用词汇的支持,同时也保留了对“老字”...

    风清扬简转繁

    风清扬简转繁,好用

    风清扬繁简两用五笔输入法6.6版 支持vista,字词数:13万余条,并带自造词维护

    风清扬繁简两用五笔输入法6.6版是一款专为中文用户设计的高效汉字输入工具,尤其适用于那些需要在繁体和简体汉字间切换的用户。这款输入法软件具有高度的兼容性和稳定性,它特别指出支持Windows Vista操作系统,意味...

    风清扬五笔.zip

    风清扬五笔的编码设计遵循了王码五笔的基本规则,但同时在字库和编码策略上做了升级,使得不常用字的输入也变得更为便捷。这在一定程度上解决了传统五笔输入法中遇到的生僻字输入困难的问题。 该软件的安装文件通常...

    创业计划书-汽车服务创业计划书(风清扬)

    《创业计划书-汽车服务创业计划书(风清扬)》是针对汽车服务业的一份详尽的商业规划文档,旨在为潜在的创业者提供一个清晰的框架,指导他们如何在这个行业中成功起步并发展业务。这份计划书的核心内容可能涵盖以下几...

    风清扬简繁五笔输入法6.91

    其中,“风清扬五笔自造词维护.exe”是该输入法的自定义词汇管理工具,用户可以通过这个程序添加自己的常用词组,提高输入效率。自造词功能是许多高级输入法的特色,它允许用户根据个人需求定制词汇库,满足个性化...

    风清扬输五笔入法旧版

    风清扬输入法是一款以武侠人物“风清扬”命名的汉字输入法,它旨在提供高效、便捷的中文输入体验。这款旧版的风清扬输入法可能包含了一些早期的功能特性和用户界面设计,对于那些熟悉旧有操作习惯或者喜欢经典界面的...

    风清扬五笔

    1. **全面的字库**:包含了大量的常用和生僻汉字,尤其是针对香港地区特有的词汇和粤语字词进行了优化,使得用户可以输入更多本地化的字符。 2. **易学性**:对于初学者,"风清扬五笔"可能提供了较为友好的学习资源...

    风清扬简繁体五笔输入法V6.01

    《风清扬简繁体五笔输入法V6.01》是一款深受用户喜爱的经典输入法软件,尤其适合对五笔编码有一定熟悉度的用户。它集简体与繁体汉字输入于一体,提供了高效便捷的文字录入体验。在信息技术日益发达的今天,选择一款...

Global site tag (gtag.js) - Google Analytics