一、核心類
java.io下的類
File 文件類、InputStream字節輸入流、OutputStream字節輸入流、Reader字符輸入流、Writer字符輸出流
接口
Closeable關閉流接口、Flushable刷新流接口、Serializable序列化接口
二、流分類
按方向:輸入流、輸出流;
按功能:節點流(直接操作數據源)、處理流也叫包裝流(間接操作數據源,對 流進行封裝,主要是簡化操作和提高性能);
按數據:字節流、字符流(底層基於字節流)。
三、文件編碼
編碼(encode):字符 -> 字節
解碼(decode):字節 ->字符
UTF-8編碼英文是一個字節,中文是三個字節
四、亂碼產生的原因
1、亂碼產生的原因-字節數不夠
Demo(使用UTF-8編碼)
文件中的內容
@Test
public void flushRead(){
File file = new File("sources/123.txt");
InputStream inputStream = null;
try {
inputStream = new FileInputStream(file);
//批量讀取
byte[] flush = new byte[3];
int len;
while ( (len = inputStream.read(flush)) != -1){
String s = new String(flush,0,len);
System.out.println(s);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if (null != inputStream){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
每次讀取三個字節,運行結果如下
每次讀取三個字節
第一次,"q","w","e"三個英文,在UTF-8中每個英文佔一個字節,可以正常打印;
第二次,讀取的三個字節中 "r"佔一個字節,剩下2個字節都來自漢字"中","中"佔三個字節,這一次只讀取到了兩個字節,所以漢字"中"不能正常打印;
第三次,讀取的是漢字"中"的第三個字節,和漢字"文"的前兩個字節,打印出現亂碼;
第四次,讀取的是漢字"文"的第三個字節,打印出現亂碼
2、亂碼產生的原因-編碼和解碼使用的字符集不統一
Demo
@Test
public void decode() throws UnsupportedEncodingException {
String s = "哈哈哈h";
//編碼 默認使用工程的編碼方式UTF-8
byte[] bytes = s.getBytes();
//使用相同字符集 可以正常打印
s = new String(bytes,0,bytes.length, StandardCharsets.UTF_8);
System.out.println(s);
//字符集不統一 出現亂碼
s = new String(bytes,0,bytes.length-2,"gbk");
System.out.println(s);
}
運行結果