1. 程式人生 > >Java IO流(二)

Java IO流(二)

*****************************I/O流的分類****************************************

一.按照資料的流向分

1. 輸入流


2. 輸出流


二. 每次存取的單位

1. 位元組流


2. 字元流

 

三.按照管道是否直接和資料來源相連

1. 節點流

如果管道 直接和資料來源相連 該管道屬於節點流


2. 處理流(包裝流)


套在節點流之上的管道 叫做處理流,也叫做包裝流..

 

4個常用的抽象類

位元組 字元


輸入 InputStream Reader read()方法


輸出 OutputStream Writer write()方法


*****************************位元組讀****************************************

FileInputStream


演示程式碼:

package com.chapter13.演示位元組讀;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
* 公司:藍橋軟體學院
* 作者:zhangzy
* 時間:2017年7月21日 下午2:10:56
* 功能:演示位元組讀
*/
public class TestFileInputStream {

public static void main(String[] args) {

//一.建立通道
FileInputStream fis = null;
int b;

try {
fis = new FileInputStream("d:\\jidi16\\io\\HelloIO.txt");
} catch (FileNotFoundException e) {
System.out.println("檔案沒有找到");
e.printStackTrace();

System.exit(-1);
}

//二.利用read迴圈讀

//fis.read() 每次讀一個位元組 把讀到的這1個位元組 存到int型別的低8位中
// read() 如果讀到了檔案末尾 返回-1
try {
while((b=fis.read())!=-1){

System.out.print((char)b);
}
} catch (IOException e) {
System.out.println("讀取檔案失敗");
e.printStackTrace();
}finally{

//三.關閉通道
if(fis!=null){
try {
fis.close();
} catch (IOException e) {
System.out.println("關閉fis通道失敗");
e.printStackTrace();
}
}
}
}
}

 

常用方法

public int read() throws IOException


每次讀一個位元組 讀到int型別的低8位中 如果讀到檔案末尾 返回-1
*****************************JDK7.0的新特性---可以自動釋放資源的try****************************************

try-with-resources


演示程式碼:


package com.chapter13.演示位元組讀;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
* 公司:藍橋軟體學院 作者:zhangzy 時間:2017年7月21日 下午2:10:56 功能:可以自動釋放資源的try
*/
public class TestTryWithResources {

public static void main(String[] args) {

// 一.建立通道

int b;

try (
FileInputStream fis = new FileInputStream("d:\\jidi16\\io\\HelloIO.txt");
) {

while ((b = fis.read()) != -1) {

System.out.print((char) b);
}
} catch (FileNotFoundException e) {
System.out.println("檔案沒有找到");
e.printStackTrace();

System.exit(-1);
} catch (IOException e) {
System.out.println("讀取檔案失敗");
e.printStackTrace();
}

}
}


****************************************字元讀****************************************

FileReader

常用方法

public int read() throws IOException


每次讀一個字元 中文是一個字元 英文也是一個字元 (並不是說英文就讀2個位元組 是錯誤的)


package com.chapter13.演示位元組讀;

import java.io.FileReader;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
* 公司:藍橋軟體學院
* 作者:zhangzy
* 時間:2017年7月21日 下午2:10:56
* 功能:演示字元讀
*/
public class TestFileReader {

public static void main(String[] args) {

//一.建立通道
FileReader fis = null;
int b;

int sum = 0;

try {
fis = new FileReader("d:\\jidi16\\io\\HelloIO.txt");
} catch (FileNotFoundException e) {
System.out.println("檔案沒有找到");
e.printStackTrace();

System.exit(-1);
}

//二.利用read迴圈讀


try {
while((b=fis.read())!=-1){
sum++;
System.out.print((char)b);
}
} catch (IOException e) {
System.out.println("讀取檔案失敗");
e.printStackTrace();
}finally{

//三.關閉通道
if(fis!=null){
try {
fis.close();
} catch (IOException e) {
System.out.println("關閉fis通道失敗");
e.printStackTrace();
}
}
}

System.out.println();
System.out.println(System.getProperty("file.encoding"));//獲得本地平臺的預設字元編碼集
System.out.println("一共讀取了" + sum + "次");
}
}

 

****************************************編碼方式****************************************


1. ANSI

American National Standards Insitute

美國國家標準協會編碼


中文作業系統 gbk 1箇中文 2個位元組


日文作業系統

 

2. UTF-8


UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字元編碼,又稱萬國碼。由Ken Thompson於1992年建立。現在已經標準化為RFC 3629。UTF-8用1到6個位元組編碼Unicode字元。用在網頁上可以統一頁面顯示中文簡體繁體及其它語言(如英文,日文,韓文)。


國際化 1箇中文 3-4個位元組 佔3個位元組的居多


3.中文

GB2312:國家簡體中文字符集,相容ASCII。
BIG5:統一繁體字編碼
GBK:它是GB2312的擴充套件,支援簡體和繁體字,相容GB2312
GB18030:在GBK基礎上繼續擴充套件生僻字和日文、朝鮮語等的編碼,相容GBK


4.UNICODE:為世界650種語言進行統一編碼,只相容ASCII對GB系列都不相容

 

5.ASCII:西歐字符集


***********************************為什麼會出現亂碼?*********************************

檔案的編碼方式 和解碼方式 不一致的造成的..

 

編碼: 看的懂的明文-------------> 看不懂的密文


解碼: 看不懂的密文--------------> 看的懂的明文

 

 

ASCII


明文 密文

A 65

B 66


? ...

 


****在控制檯下執行程式的時候

java com.chapter13.TestFileReader


啟動JVM 使用的編碼方式 是 gbk(中文作業系統 預設使用的是gbk),檔案編碼是(utf-8),讀到程式中的位元組是utf-8編碼的位元組,

解碼使用的是gbk,二者不一致 所以亂碼!如何解決?


java -Dfile.encoding=utf-8 com.chapter13.TestFileReader


設定JVM執行時 的預設字元編碼集為utf-8

 

****在MyEclipse下設定

 

讀的那個檔案的編碼方式(utf-8) 要和 MyEclipse的控制檯編碼方式一致就可以了


和 右鍵 -- Run As - Run Configurations---Common-- encoding 一致就可以了

 


*****************************使用位元組讀中文(面試題)*************************


解決方案: 一下子把整個檔案全部讀進來

 

FileInputStream常用方法

1.public int read() throws IOException


每次讀一個位元組 讀到int型別的低8位中 如果讀到檔案末尾 返回-1


2.public int read(byte[] b) throws IOException


每次讀一個位元組陣列 把讀到的位元組陣列 存到b 返回的是真正讀取的位元組數

package com.chapter13.演示位元組讀;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
* 公司:藍橋軟體學院
* 作者:zhangzy
* 時間:2017年7月21日 下午2:10:56
* 功能:演示位元組讀中文
* 原理: 一下子把檔案整個讀進來
*/
public class TestInputStreamReadChinese {

public static void main(String[] args) {

//一.建立通道
FileInputStream fis = null;
int b;

try {
fis = new FileInputStream("d:\\jidi16\\io\\HelloIO.txt");
} catch (FileNotFoundException e) {
System.out.println("檔案沒有找到");
e.printStackTrace();

System.exit(-1);
}

//二.利用read迴圈讀


try {
byte[] byteArr = new byte[fis.available()];

while((b=fis.read(byteArr))!=-1){

System.out.print(new String(byteArr,"utf-8"));// 位元組陣列(密文)--->明文 解碼
}
} catch (IOException e) {
System.out.println("讀取檔案失敗");
e.printStackTrace();
}finally{

//三.關閉通道
if(fis!=null){
try {
fis.close();
} catch (IOException e) {
System.out.println("關閉fis通道失敗");
e.printStackTrace();
}
}
}
}
}