Java IO學習筆記(三)轉換流、數據流、字節數組流


轉換流

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM