1、 比特、字节和字符的定义
这个很基础,但是在开头说一下还是有必要的
比特:bit(binarydigit),信息的基本单元。只有两种取值:0或者1.
字节:通常由8比特组成。由于通常用来编辑计算机上文本的单个字符,所以字节是很多的计算机架构中的内存的最小可寻址单元
字符:信息单元;大概相当于1个字母或者符号等。比如数字,字母,标点符号等。英文字符一般由1个字节组成。汉字一般由两个字节组成
2、 字节流和字符流的区别?
所谓流就是连续访问文件的一种方式。字节流就是一个字节一个字节访问文件。字节流适合除了文本文件外的任何类型的文件。例如,如果文件使用了unicode编码,每个字符使用的是两个字节表示,那么字节流就会将这两个字节流单独对待,导致的结果是你必须在后续自己去转换(成原来的字符)
类似地,字符流就是一个字符一个字符的读取文件。为了工作正常,字符流需要提供文件的编码。
3、 字节流和字符流分别对应的类
所有字节流类都是InputStream或OutputStream的子类。最主要的两个是FileInputStream和FileOutputStream。
什么时候不适用字节流?
字节流代表的是一种低级别的I/O,所以应该尽量避免使用。尤其是文本文件,包含的是字符,最好的方式是使用字符流。字节流只考虑用在最原始的I/O上。但是字节流是所有其他流的基础。
字符流:
Java平台使用Unicode协议保存字符值。字符流I/O自动在这些内部格式和本地字符集间进行转换。
所有的字符流类都是Reader和Writer的子类。
字符流经常会“封装”字节流。字符流使用字节流来操作物理I/O,然后字符流执行字节和字符间的转换。比如,FileReader使用FileInputStream、FileWriter使用FileOutputStream。
4、 字节流和字符流之间的转换
使用InputStreamReader可以将字节流转换成字符流;
使用OutputStreamWriter类可以将字符流转换成字节流。
当你创建InputStreamReader和OutputStreamWriter对象,你可以指定你想要转换的编码。比如为了将一个编码为UTF8的文件转换成Unicode,创建InputStreamReader如下:
FileInputStream fis = new FileInputStream("test.txt");
InputStreamReader isr = newInputStreamReader(fis, "UTF8");
如果忽略,就会使用默认的编码。可以通过如下获取使用的编码:
InputStreamReader defaultReader = new InputStreamReader(fis);
String defaultEncoding =defaultReader.getEncoding();
参考文献:
https://docs.oracle.com/javase/tutorial/i18n/text/stream.html