1. 程式人生 > >Java基礎知識IO流(位元組流的快取區並自定義)

Java基礎知識IO流(位元組流的快取區並自定義)

  • 位元組流快取區
  • 自定義位元組流快取區
  • read()和write()方法的特點

位元組流快取區

位元組流也有快取區
BufferedInputStream
BufferedInputStream 為另一個輸入流新增一些功能,即緩衝輸入以及支援 mark 和 reset 方法的能力。在建立 BufferedInputStream 時,會建立一個內部緩衝區陣列。
BufferedOutputStream
該類實現緩衝的輸出流。通過設定這種輸出流,應用程式就可以將各個位元組寫入底層輸出流中,而不必針對每次位元組寫入呼叫底層系統。

快取原理
以將MP3檔案複製到別處為例:

BufferedInputStream bufis=new
BufferedInputStream(new FileInputStream("music.mp3")); bufis.read();

MP3檔案存放在硬碟上,檔案內都是位元組資料。當bufis.read();時,不是直接在硬碟上讀取位元組資料,而是先用FileInputStream()的read(byte[])方法讀取位元組快取到記憶體的緩衝區(位元組陣列)中,並返回讀取的位元組數,定義計數器,初始值就是該位元組數,再從緩衝區(位元組陣列)取出資料,讀取資料時定義一個指標,一個一個地讀取,每 讀取一個,指標指向下一個,同時計數器減1,直到減到0時,說明本組資料讀完,再讀下一組資料到快取區中(位元組陣列),直到取到的資料個數是-1時,說明讀取完畢。簡言之:緩衝區的思想就是從硬碟上獲取一批資料到記憶體緩衝區中,一個一個讀取,然後再獲取一批資料一個個讀取,這樣效率比較高。

自定義位元組流快取區

已知快取原理,自定義位元組流的緩衝區:
1.定義緩衝區
2.定義計數器(初始值是0,myRead()方法中當判斷到count=0時,將count數值設定為讀取到位元組陣列中的位元組數)
3.定義指標 (初始值是0)
4.自定義myRead()方法,讀取一個位元組,返回int型資料。
5.自定義myClose()方法。

import java.io.*;

class MyBufIsTest 
{
    public static void main(String[] args) throws IOException
    {
        long start = System.currentTimeMillis();
        copy_2();
        long
end = System.currentTimeMillis(); System.out.println((end-start)+"毫秒"); } public static void copy_2()throws IOException { MyBufferedInputStream bufis = new MyBufferedInputStream(new FileInputStream("testCopyJpg.jpg")); BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("testCopyJpg2.jpg")); int by = 0; //System.out.println("第一個位元組:"+bufis.myRead()); while((by=bufis.myRead())!=-1) { bufos.write(by); } bufos.close(); bufis.myClose(); } } class MyBufferedInputStream { private InputStream is=null; private int count=0; private int pos=0; private byte[] buf=new byte[1024]; MyBufferedInputStream(InputStream is) { this.is=is; } //一次讀一個位元組,從快取區(位元組陣列)獲取 public int myRead()throws IOException { //通過is物件讀取硬碟上的資料,並存儲在buf中,即進行快取。 //先判斷count是否為0,若為零表示初次讀取或者陣列中的位元組已讀完,那麼讀取一批資料到位元組陣列中。 //再判斷此時count是否小於0,若小於0,表示硬碟上的資料已讀完,返回-1 //然後pos=0,從陣列的第一個資料開始讀 //讀完後pos++,count-- //將讀取的byte型別的b與0xff進行&運算:之所以沒有直接強轉int,因為強轉時,前面新增1,那麼前8位為-1,會誤以為讀取完畢,與0xff&運算的話, //前面新增0,就避免了這種情況。 //若count大於0,說明陣列中的資料還未讀完,繼續讀取資料,並count--,pos++,同樣b&0xff //若count是否小於0,表示硬碟上的資料已讀完,返回-1。 if(count==0) { count=is.read(buf); if(count<0) return -1; pos=0; byte b=buf[pos]; pos++; count--; return b&0xff; } else if(count>0) { byte b=buf[pos]; pos++; count--; return b&0xff; } return -1; } public void myClose() throws IOException { is.close(); } }

read()和write()方法的特點

read()方法的返回值型別是int型別,通過與0xff進行&操作,而不是強轉為int型別,是為了在前面添0,即保留了原位元組資料不變,又避免了-1的出現。
write(int b)方法會強制將int型別的引數b強轉危byte型別,只保留最低8位。

相關推薦

Java基礎知識IO位元組快取定義

位元組流快取區 自定義位元組流快取區 read()和write()方法的特點 位元組流快取區 位元組流也有快取區 BufferedInputStream BufferedInputStream 為另一個輸入流新增一些功能,即緩衝輸入以及支援 ma

java基礎知識-IO-位元組

耐得住寂寞,才能守得住繁華 流 1、在java中,所有的資料都是使用流讀寫的,流就像水流一樣,將資料從一個地方帶到另一個地方。 2、流是程式中的資料所經歷的的路徑,輸入流將資料從資料來源傳遞給程式,而輸出流將資料傳送到某個目的地。 流的分類 位元組流 位元組流傳送0

java基礎BufferedReader類提高字元讀取文字檔案的效率IO位元組/字元

String nstr=sb.toString().replace("{name}", “ok”).replace("{sex}", “男”).replace("{hobby}", “陶笛”);boolean exists( ) 判斷檔案或目錄是否存在 bool

Java基礎知識IOFile

File概述 File類用來將檔案或者資料夾封裝成物件。方便對檔案和資料夾的屬性資訊進行操作。 構造方法: 1.File(File parent, String child) 根據 parent 抽象路徑名和 child 路徑名字串

Java基礎IO位元組、字元、記憶體、帶快取、序列化和反序列化

File類:File類提供了對檔案的操作,可以通過字串或URI來構建一個File類物件。通過物件,可以實現檔案的建立(createNewFile)、刪除(delete)、獲得檔名(getName)、獲得父目錄物件(getParentFile)、獲得父目錄名稱(

java輸入輸出14:IO位元組讀寫中文

位元組流讀取中文的問題 位元組流在讀中文的時候有可能會讀到半個中文,造成亂碼。 位元組流寫出中文的問題 位元組流直接操作位元組,所以寫出中文必須將字串轉換成位元組陣列。寫出回車換行write("\r\n

java基礎知識--IO示例

本人的GitHub:戳我一下 示例(一)——File類的基本用法 /** * File類的基本用法 */ package com.yifanjia.one; import java.io.*

Java基礎知識-IO2

21.01_IO流(字元流FileReader) 1.字元流是什麼 字元流是可以直接讀寫字元的IO流 字元流讀取字元, 就要先讀取到位元組資料, 然後轉為字元. 如果要寫出字元, 需要把字元轉為位元組再寫出. 2.FileReader FileR

javaIO位元組

一.位元組輸出流OutputStream OutputStream此抽象類,是表示輸出位元組流的所有類的超類。操作的資料都是位元組,定義了輸出位元組流的基本共性功能方法。 輸出流中定義都是寫write方法: close():關閉此輸出流並釋放與此流有關的所有系統資源 flush():重新整理此輸出流並

java基礎知識---IO

IO流:★★★★★,用於處理裝置上資料。 流:可以理解資料的流動,就是一個數據流。IO流最終要以物件來體現,物件都存在IO包中。 流也進行分類: 1:輸入流(讀)和輸出流(寫)。 2:因為處理的資料不同,分為位元組流和字元流。 位元組流:處理位元組資料的流物件。裝置上的

java基礎知識IO

博主作為一個接觸java時間比較短的開發人員,本篇文章記錄博主學習IO流的一些知識。 IO流用來處理裝置之間的資料傳輸,舉個例子:對於傳統的web專案來說,IO流就是就是處理記憶體和硬碟之間的資料傳輸。java對資料的處理就是通過流來實現的,java用於操作流的物件都在IO

Java基礎Demo -- 基本型別轉換位元組

基本型別轉換為位元組流 位元組流轉換回基本型別  注意理解: 0xff &0xff java移位僅支援int或long >>帶符號右移(負數高位補1,正數高位補0),相當於除以2的n次方 >>>無符號右移(高位補0) <

java基礎知識匯總持續更新中....

方法區 管理 執行 中間 inter print method arch end 1.java四大特性:抽象、繼承、封裝,多態 構造函數: http://blog.csdn.net/qq_33642117/article/details/51909346   

JAVA基礎知識總結12多線程

必須 對象 存放位置 垃圾 java基礎知識 current syn 原理 運行 進程:正在進行中的程序。其實進程就是一個應用程序運行時的內存分配空間。 線程:其實就是進程中一個程序執行控制單元,一條執行路徑。進程負責的是應用程序的空間的標示。線程負責的是應用程序的執行順序

JAVA基礎知識總結14String、StringBuffer、StringBuilder

null 多線程操作 部分 單個 進行 單線程 pri lse 行修改 1.String字符串:   java中用String類進行描述。對字符串進行了對象的封裝。這樣的好處是可以對字符串這種常見數據進行方便的操作。對象封裝後,可以定義N多屬性和行為。   如何定義字符串對

JAVA基礎知識總結18反射

java基礎 null exce 既然 nsa 操作 程序 san 包含 反射技術:   其實就是動態加載一個指定的類,並獲取該類中的所有的內容。而且將字節碼文件封裝成對象,並將字節碼文件中的內容都封裝成對象,這樣便於操作這些成員。簡單說:反射技術可以對一個類進行解剖。

Java工程師成神之路-基礎篇》Java基礎知識——序列化已完結

本文是《成神之路系列文章》中的一篇,主要是關於Java中序列化的一些介紹。 持續更新中 Java物件的序列化與反序列化 深入分析Java的序列化與反序列化 單例與序列化的那些事兒 Google Protocol Buffer 的使用和原理 拓展內容 關於 Java

Java基礎IO操作

Java基礎之IO操作(二) 一、BufferedInputStream public static void main(String[] args) { File src = new File("abc.txt"); //2、選擇流 InputStream is =null;

Java基礎IO操作

Java基礎之IO操作(一) 一、FileInputStream 第一個程式,理解操作步驟 public static void main(String[] args) { //1、建立源 File src = new File("abc.txt"); //2、

JAVA基礎知識精華總結轉載

1、物件的初始化 (1)非靜態物件的初始化      在建立物件時,物件所在類的所有資料成員會首先進行初始化。    基本型別:int型,初始化為0。   如果為物件:這些物件會按順序初始化。 ※在所有類成員初始化完成之後,才呼叫本類的構造方法建立物件。    構造方法的作用就是初始化。   (2)靜態物件的