操作基本数据类型的流对象
用于操作字节数组,字符数组 的流对象
字符编码
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/**
* 操作基本数据类型的流对象
* DataInputStream 和 DataOutputStream
*/
public class DataStream {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//writeData();
//readDate();
//writeUTFDemo();
//writeUTFADemo();
//readUTFDemo();
readUTFADemo();
}
//常用 字符编码 读取
public static void readUTFADemo() throws IOException{
InputStreamReader isr=new InputStreamReader(new FileInputStream("E:\\utf.txt"),"UTF-8");
char[] buf=new char[1024];
int len=isr.read(buf);
String s=new String(buf,0,len);
System.out.println(s);
}
//修改版定UTF 专门读取方法
public static void readUTFDemo() throws IOException{
DataInputStream dis=new DataInputStream(new FileInputStream("E:\\utfdata.txt"));
//DataInputStream dis=new DataInputStream(new FileInputStream("E:\\utf.txt")); //会报错, EOFEXception
String s=dis.readUTF();
System.out.println(s);
dis.close();
}
//常用的 utf 写入
public static void writeUTFADemo() throws IOException{
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("E:\\utf.txt"),"UTF-8");
osw.write("你好");
osw.close();
}
//修改版定UTF 读取 只能使用专门的指定 读取方法
public static void writeUTFDemo() throws IOException{
DataOutputStream dos=new DataOutputStream(new FileOutputStream("E:\\utfdata.txt"));
dos.writeUTF("你好"); //与机器无关的编码
dos.close();
}
//读取 int boolean double
public static void readDate() throws IOException{
DataInputStream dis=new DataInputStream(new FileInputStream("E:\\data.txt"));
int num=dis.readInt();
boolean flag=dis.readBoolean();
Double dd=dis.readDouble();
System.out.println(num+"\\"+flag+"\\"+dd);
}
//写入 int boolean double
public static void writeData() throws IOException{
DataOutputStream dos=new DataOutputStream(new FileOutputStream("E:\\data.txt"));
dos.writeInt(234); //4个字节
dos.writeBoolean(true); //1个字节
dos.writeDouble(89555.455); //8个字节
dos.close();
}
}
用于操作字节数组,字符数组 的流对象
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 用于操作字节数组的流对象
* ByteArrayInputStream: 在构造的时候 需要接口数据源,而且数据源是一个字节数组
* ByteArrayOutputStream: 在构造的时候,不用定义数据目的, 因为该独享中已经内存封装了一个可变长度的字节数组.
* 这就是 数据目的
*
* 用于操作字符数组的流对象
* charArrayReader
* charAarrayWriter
*
* 因为这连个个流对象操作都是数组,并没有使用系统资源,所以不需要进行关闭.
*
*
* 在 讲流的操作规律的时候
* 源设备:
* 键盘:System.in, 硬盘:FileStream ,内存: ArrayStream
* 目的设备
* 键盘:System.out, 硬盘:FileStream ,内存: ArrayStream
*
* 用流的读写思想来操作数组
*
*/
public class ByteArrayStream {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//数据源
ByteArrayInputStream bis=new ByteArrayInputStream("adfsde".getBytes());
ByteArrayOutputStream bos=new ByteArrayOutputStream();
System.out.println(bos.size()); //缓冲的大小
int by=0;
while((by=bis.read())!=-1){
bos.write(by);
}
System.out.println(bos.size());
System.out.println(bos.toString());
bos.writeTo(new FileOutputStream("E:\\IOArray.txt"));
}
}
字符编码
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
/**
* 字符编码
* 字符编码的出现为了方便操作字符
* 更重要的是加入了编码转换
* 通过子类转换流来完成
* InputStreamReader
* OutputStreamWriter
* (PrintStream,PrintWriter 也加入编码表)
* 在两个对象构造的时候可以加入字符集.
*
* 编码表的由来
* 计算机只能识别二进制数据,早起由是电信号
* 为了方便应用计算机,让它可以识别个个国家的文字
* 就将各个国家的文字用数字来表示,并一对一,形成一张表.
* 这就是编码表
*
* 常见的编码表
* ASCII:美国标准信息交换码
* 用一个字节的7位可以表示.
* ISO8859-1:拉丁码表.欧洲码表
* 用一个字节的8位可以表示.
* GB2312:中国的中文编码表.
* 6000-7000 多
* GBK:中国的中文编码表升级.融合了更多的中文文字符号.
* 上万了
* Unicode: 国际标准码,融合了多种文字.
* 所有文字都有两个字节来表示,java语言使用的就是unicode
* UTF-8:unicode transform format -8:最多三个字节来表示一个字符.一个字节 装不下,采用两个 ,两个不行 三个.
*
*
*
* 编码: 将字符串 --变成 ---字节数组
* String---byte: str.getBytes(charsetname); //默认是 GBk
* 解码: 将字节数组 ---变成 ---字符串
* byte[] ---String: new String(byte,charsetname); 默认 gbk
*
*/
public class EncodeDemo {
public static void main(String[] args) throws IOException{
//writeText();
//readText();
//encodeDemo();
encodeDemo2();
}
public static void encodeDemo2() throws IOException{
String s="你好";
byte[] b1=s.getBytes("GBK");
System.out.println(Arrays.toString(b1));
String s1=new String(b1,"ISO8859-1");//已经是 乱码的文字了
System.out.println(s1);
byte[] b2=s1.getBytes("ISO8859-1");
System.out.println(new String(b2,"GBK"));
}
public static void encodeDemo1() throws IOException{
String s="你好";
byte[] b1=s.getBytes("GBK");
System.out.println(Arrays.toString(b1));
String s1=new String(b1,"GBK");
System.out.println(s1);
}
public static void encodeDemo() throws IOException{
String s="你好";
byte[] b1=s.getBytes();
System.out.println(Arrays.toString(b1));
String s1=new String(b1);
System.out.println(s1);
}
public static void readText() throws IOException{
InputStreamReader isr=new InputStreamReader(new FileInputStream("E:\\gbk.txt"));
char [] buf=new char[10];
int len=isr.read(buf);
String s=new String(buf,0,len);
System.out.println(s);
}
//默认的使用gbk
public static void writeText() throws IOException{
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("E:\\gbk.txt"));
osw.write("你好"); //4个字节: 默认的是 GBK 6个字节 UTF-8 8个自己 修订版UTF
osw.close();
}
}