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基礎知識IO流(File)
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基礎知識-IO流2
21.01_IO流(字元流FileReader) 1.字元流是什麼 字元流是可以直接讀寫字元的IO流 字元流讀取字元, 就要先讀取到位元組資料, 然後轉為字元. 如果要寫出字元, 需要把字元轉為位元組再寫出. 2.FileReader FileR
java之IO流(位元組流)
一.位元組輸出流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基礎知識總結14(String、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)靜態物件的