轉換流
1、轉換流:將字節流轉換成字符流,轉換之后就可以一個字符一個字符的往程序寫內容了,並且可以調用字符節點流的write(String s)方法,還可以在外面套用BufferedReader()和BufferedWriter,並使用它們的readLine 和 newLine方法。
2、有兩種轉換流:InputStreamReader、OutputStreamWriter
練習小程序1:
package test.io.transfer;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class OutputStreamWriterTest {
public static void main(String args[]){
FileOutputStream fos = null;
FileOutputStream fos1 = null;
OutputStreamWriter opsw = null;
try {
fos = new FileOutputStream("E:/技術學習/java/test/Socket/test4.txt");
fos1 = new FileOutputStream("E:/技術學習/java/test/Socket/test5.txt");
opsw = new OutputStreamWriter(fos);
opsw.write("轉換流練習");
System.out.println(opsw.getEncoding());//獲取編碼格式
opsw.flush();
opsw.close();
opsw = new OutputStreamWriter(fos1,"GBK");
opsw.write("轉換流練習轉換流練習");
System.out.println(opsw.getEncoding());//獲取編碼格式
opsw.flush();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
fos.close();
opsw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
練習小程序2:
package test.io.transfer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class InputStreamReaderTest {
public static void main(String args[]){
InputStreamReader isr = new InputStreamReader(System.in);//System.in是inputstream的子類
BufferedReader bf = new BufferedReader(isr);
String ss = null;
try {
while((ss=bf.readLine()) != null){
if(ss.equals("exit")){
break;
}
System.out.println(ss);
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
isr.close();
bf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
數據流、字節數組流
1、數據流:一般的字節流只能讀寫byte[]類型的數據,只能寫int、byte、byte[]類型的數據 ;字符輸入流只能讀char[]類型的數據,字符輸出流只能寫char、char[]、int、String類型的數據。如果想要讀寫long、double、boolean等其他類型的數據,就需要用到數據流。
2、數據流是一種處理流,有兩種數據流:DataInputStream、DataOutputStream,分別繼承於InputStream和OutputStream。他們需要套在InputStream和OutputStream類型的字節流上操作,下圖中截取一些,具體方法見幫助文檔。
DataInputStream:

DataOutputStream:


DataInputStream的構造方法:DataInputStream(InputStream in)
DataOutputStream 的構造方法:DataOutputStream(OutputStream out)
3、字節數組流(字節流):
ByteArrayInputStream: 字節數組輸入流在內存中創建一個字節數組緩沖區,從輸入流讀取的數據保存在該字節數組緩沖區中,從字節數組中讀數據。
ByteArrayOutputStream:創建字節數組輸出流的同時,內存會為該輸出流創建一個默認大小的字節數組,用於存儲寫入的字節內容。
4、字節數組流的構造方法:
ByteArrayInputStream(byte[] buf);
ByteArrayInputStream(byte[] buf, int offset, int length);
ByteArrayOutputStream(); 創建字節輸出流的同時內存中會創建一個byte[]字節數組,默認大小。
ByteArrayOutputStream(int size); 創建字節輸出流的同時內存中會創建一個大小為size的byte[]字節數組。
在使用的時候,可以用byte[] b = byteArrayOutputStream.toByteArray()返回流中的字節數組,然后創建ByteArrayInputStream bai = new ByteArrayInputStream(byte[] b)來將輸入流接入到字節數組上。
練習小例子:
package test.io.data;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
public class DataByteArrayStreamTest {
public static void main(String args[]){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
ByteArrayInputStream bais = null;
DataInputStream dis = null;
try {
dos.writeDouble(Math.random());
dos.writeBoolean(true);
dos.flush();
bais = new ByteArrayInputStream(baos.toByteArray());
dis = new DataInputStream(bais);
System.out.println(dis.available());
//先進先出,先寫先讀,如果這里是先讀的Boolean,則會自動找到存入的double數據的第一個字節,當做boolean類型讀出來
System.out.println(dis.readDouble());
System.out.println(dis.readBoolean());
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(baos != null){
baos.close();
}
if(dos != null){
dos.close();
}
if(bais != null){
bais.close();
}
if(dis != null){
dis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
控制台輸出結果:
9
0.02241410199042526
true