day23 字節流

1.input 輸入,從硬盤到程序;output輸出,從程序到硬盤
2.字節輸出流outputstream

  • 字節類寫任何文件均可以,字節是最基本存儲單元
  • 抽象類,是輸出類所有類超類io包中
  • 每次僅操作一個字節write(int);write(byte[])寫入字節數組;
    write(byte[],int a,int b),從byte數組a索引開始寫入b個元素
  • close(),關閉資源,必寫
  • java操作對象都是調用操作系統完成
  • 類命名都是前半部分是功能后半部分是父類:ByteArrayOutputStream

3.fileoutputstream

  • 構造方法綁定一個輸出目的,參數有file和String(文件名)
  • 三步,創建綁定目的地,write,close
  • 所有io異常均是ioexception
FileOutputStream fo=new FileOutputStream("c:\\a.txt");
        fo.write(100);
        fo.close();
輸出是d,會查詢編碼表
若在文本中輸出100則是三個數1,0,0,三個字節
漢字是兩個字節
想要字符串寫入可以:“hello”.getBytes()
流對象會創建新文件,若文件已存在則會全部覆蓋
  • 續寫和換行在構造方法里new FileOutputStream("c:\a.txt",true);true是在文件末尾寫,flase是在開頭寫入
  • \r\n換行
  • close寫在finally中,有異常拋出停止,文件創建失敗則不需要close
if (foS!=null) {
                try {
                    foS.close();
                    
                } catch (IOException ix) {
                    ix.printStackTrace();

                    throw new RuntimeException("釋放資源失敗");
}
io出現問題軟件解決不了,直接拋出異常就好

4.字節輸入流FileInputStream

  • read()讀一個字節
  • read(byte[])讀一定量字節byte一般1024容量或者整數倍,但不可以太大
int lon=0;
byte[] arr=new byte[1024];
            while ((lon=fiS.read(arr))!=-1) {
                foS.write(arr, 0, lon);
            }
 同樣會按照ascii編碼表轉碼想看到原文件就char強轉
只能以lon來第三方替換,因為read一次就會換位讀到不同字節
read返回的數是讀到幾個字節,裝進arr數組會不停覆蓋之前讀進去的元素
如果new byte[2]
讀abcde,第三次就會讀到e,但是顯示最后一次是[e,d],d是上一次留下的
讀到末尾結束標記,jvm就會直接返回-1
  • 復制
    FileInputStream fiS=null;
        FileOutputStream foS=null;
        try {
    fiS=new FileInputStream("C:\\Users\\Desktop\\java\\eclipse-SDK-3.7.2-win32.zip");
            foS=new FileOutputStream("C:\\User\\Desktop\\a.zip");
            int lon=0;
            byte[] arr=new byte[1024];
            while ((lon=fiS.read(arr))!=-1) {
                foS.write(arr, 0, lon);
            }
        } catch (IOException ix) {

      ix.printStackTrace();
        throw new RuntimeException("復制失敗");
        
        }finally
        {
            if (foS!=null) {
                try {
                    foS.close();
                    
                } catch (IOException ix) {
                    ix.printStackTrace();

                    throw new RuntimeException("釋放資源失敗");
                }finally
                {
                    try {
                        if (fiS!=null) {
                            
                            fiS.close();
                        }
                    } catch (IOException ix) {
                        ix.printStackTrace();
                        throw new RuntimeException("復制失敗");
                    }
                }
            }
            
        }
單個字節復制太慢,用byte[]
為確保fis也可以close成功,需要在fos.close在使用一次finally       

5.字符編碼表

  • ascii一個字節7個位,最高位(首位)是0沒有正負之分
  • 漢字兩個字節,第一個字節負數,第二個可能正數
  • “abc”.getbyte()轉成編碼,String(byte[])數字轉字符是解碼

6.字符流filewriter,filereader

  • 和字節流一樣,把byte[]變成char[]
  • 每一次write之后需要調用flush()刷新,close也有刷新功能,但一起堆到close再刷新會耗時耗內存(不刷時候臨時數據都在內存)
int lon=0;
            char[] arr=new char[1024];
            while ((lon=fiS.read(arr))!=-1) {
                foS.write(arr, 0, lon);
                foS.flush();
            }
打開能看懂的都是文本文件
字符流僅能用于文本編輯,復制圖片什么的都是壞的
僅有字符流在close之前需要使用flush,別的都不需要
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容