Windows系统默认是GBK,占2个字节
Unicode中的UTF-8格式占3个字节
字符流中和编码解码相关的两个类
- InputStreamReader:是从字节流到字符流的桥梁,父类是Reader,它读取字节,并使用指定的编码将其解码为字符。它使用的字符集可以由名称制定,也可以被明确指定,或者可以接受平台的默认字符集
- OutputStreamWriter:是从字符流到字节流的桥梁,父类是Writer,使用指定的编码将写入的字符编码为字节。它使用的字符集可以由名称制定,也可以被明确指定,或者可以接受平台的默认字符集
方法名 | 说明 |
---|---|
InputStreamReader(InputStream in) | 使用默认字符编码创建InputStreamReader对象 |
InputStreamReader(InputStream in,String charset) | 使用指定的字符编码创建InputStreamReader对象 |
OutputStreamWriter(OutputStream out) | 使用默认字符编码创建outputStreamWriter对象 |
OutputStreamWriter(OutputStream out,String charset) | 使用指定的字符编码创建outputStreamWriter对象 |
字节流转字符流
package IO流.字节流和缓冲流;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Scanner;
public class 字节流转字符流 {
public static void main(String[] args) {
/**
* 从控制台读取一行
*/
InputStream input = System.in;
InputStreamReader reader = new InputStreamReader(input);
BufferedReader buffReader = new BufferedReader(reader);
try {
String name = buffReader.readLine();
System.out.println("name is " + name);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
buffReader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 从数组读取
*/
try {
// 读取10个字节
byte[] bArray = new byte[10];
input.read(bArray);
// byte[]数组就是指多个字节!!!
String name = new String(bArray);
System.out.println("name is " + name);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
input.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
字符流转字节流
package IO流.字节流和缓冲流;
public class 字符流转字节流 {
public static void main(String[] args) {
// byte 字节
// char 字符
// 字符转字节
String str = "asadddassa";
byte[] byteArray = str.getBytes();
// 字节转字符
// byte[] bArray = {22,33,44,55};
String newStr = new String(byteArray);
System.out.println(newStr);
}
}
自定义MyScanner
底层还是InputStream
package io;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class MyScanner {
private InputStream input;
public MyScanner(InputStream input){
this.input = input;
}
public String next(){
String value = null;
InputStreamReader reader = new InputStreamReader(this.input);
BufferedReader buffReader = new BufferedReader(reader);
try {
value = buffReader.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// finally{
// try {
// buffReader.close();
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
return value;
}
public int nextInt(){
String value = this.next();
return Integer.parseInt(value);
}
public double nextDouble(){
String value = this.next();
return Double.parseDouble(value);
}
}
数据流的使用
package 其他衍生流;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class 数据流的使用 {
public static void main(String[] args) {
//以下有三个数据
// String name = "张三";
// int age = 18;
// double height = 1.75;
// String hobby = "无";
// String no = "1001";
数据流
///作用:方便存取数据
//写出
//writeData(no, name, age, height, hobby);
//读入
readData();
}
/**
* 使用数据流写出到文件
* @param no
* @param name
* @param age
* @param height
* @param hobby
*/
public static void writeData(String no,String name,int age,double height,String hobby){
DataOutputStream out = null;
try {
out = new DataOutputStream(new FileOutputStream("student.data"));
//注意写出的顺序(写出的顺序要跟读入时的顺序保持一致)
out.writeUTF(no); //学号
out.writeUTF(name); //姓名
out.writeInt(age); //年龄
out.writeDouble(height); //身高
out.writeUTF(hobby); //爱好
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
try {
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void readData(){
DataInputStream input = null;
try {
input = new DataInputStream(new FileInputStream("student.data"));
//注意读入的顺序(写出的顺序要跟读入时的顺序保持一致)
String no = input.readUTF(); //学号
String name = input.readUTF(); //姓名
int age = input.readInt(); //年龄
double height = input.readDouble(); //身高
String hobby = input.readUTF(); //爱好
System.out.println("no is "+no);
System.out.println("name is "+name);
System.out.println("age is "+age);
System.out.println("height is "+height);
System.out.println("hobby is "+hobby);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
try {
input.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}