流的读取 、缓冲流、以及利用IO流读取文本和写文本的案例

 
import java.util.Arrays;
 
/*
 * 计算机是如何识别什么时候该把两个字节转换为一个中文呢?
 * 在计算机中中文的存储分两个字节:
 * 第一个字节肯定是负数。
 * 第二个字节常见的是负数,可能有正数。但是没影响。
 */
public class StringDemo {
public static void main(String[] args) {
// String s = "abcde";
// // [97, 98, 99, 100, 101]
 
String s = "我爱你中国";
// [-50, -46, -80, -82, -60, -29, -42, -48, -71, -6]
 
byte[] bys = s.getBytes();
System.out.println(Arrays.toString(bys));
}
}
转换流出现的原因及思想

由于字节流操作中文不是特别方便,所以,java就提供了转换流。
字符流=字节流+编码表。
 
import java.io.FileInputStream;
import java.io.IOException;
 
/*
 * 字节流读取中文可能出现的小问题:
 */
public class FileInputStreamDemo {
public static void main(String[] args) throws IOException {
// 创建字节输入流对象
FileInputStream fis = new FileInputStream("a.txt");
 
// 读取数据
// int by = 0;
// while ((by = fis.read()) != -1) {
// System.out.print((char) by);
// }
 
byte[] bys = new byte[1024];
int len = 0;
while ((len = fis.read(bys)) != -1) {
System.out.print(new String(bys, 0, len));
}
 
// 释放资源
fis.close();
}
}
编码表概述和常见的编码表

编码表
  由字符及其对应的数值组成的一张表
 
计算机只能识别二进制数据,早期由来是电信号。
为了方便应用计算机,让它可以识别各个国家的文字。
就将各个国家的文字用数字来表示,并一一对应,形成一张表。
 
ASCII:美国标准信息交换码。
用一个字节的7位可以表示。
ISO8859-1:拉丁码表。欧洲码表
用一个字节的8位表示。
GB2312:中国的中文编码表。
GBK:中国的中文编码表升级,融合了更多的中文文字符号。
GB18030:GBK的取代版本
BIG-5码 :通行于台湾、香港地区的一个繁体字编码方案,俗称“大五码”。
Unicode:国际标准码,融合了多种文字。
所有文字都用两个字节来表示,Java语言使用的就是unicode
UTF-8:最多用三个字节来表示一个字符。
 
UTF-8不同,它定义了一种“区间规则”,这种规则可以和ASCII编码保持最大程度的兼容:
它将Unicode编码为00000000-0000007F的字符,用单个字节来表示
它将Unicode编码为00000080-000007FF的字符用两个字节表示 
它将Unicode编码为00000800-0000FFFF的字符用3字节表示 
 
 
 
 
 
字符串中的编码问题

编码
  把看得懂的变成看不懂的
解码
  把看不懂的变成看得懂的
 
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(); // [-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 字符输出流
  public OutputStreamWriter(OutputStream out)
  public OutputStreamWriter(OutputStream out,String charsetName)
InputStreamReader 字符输入流
  public InputStreamReader(InputStream in)
  public InputStreamReader(InputStream in,String charsetName)
 
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 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(InputStream 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写数据

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)
字符流操作要注意的问题
flush()的作用
flush()和close()的区别
 
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):写一个字符串的一部分
 *
 * 面试题:close()和flush()的区别?
 * A:close()关闭流对象,但是先刷新一次缓冲区。关闭之后,流对象不可以继续再使用了。
 * 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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值