導航:首頁 > 編程語言 > javaio緩沖區大小

javaio緩沖區大小

發布時間:2025-01-06 20:20:46

『壹』 javaio緩沖區為什麼不直接開辟大空間

Javaio緩沖區不直接開辟大空間原因:有效地管理系統資源,方便用戶使用的程序集合。(操作系統是加在裸機上的第一層軟體,是用戶與計算機的介面)。

當BufferedReader在讀取文本文件時,會先盡量從文件中讀入字元數據並置入緩沖區,如果緩沖區數據不足,才會再從文件中讀取。這里的緩沖區應該是在硬碟中。

使用BufferedWriter時,寫入的數據並不會先輸出到目的地,而是先存儲至緩沖區中。如果緩沖區中的數據滿了,才會一次對目的地進行寫出。這里的緩存區應該在內存中。

原理:

Java把這些不同來源和目標的數據都統一抽象為數據流。Java語言的輸入輸出功能是十分強大而靈活的,美中不足的是看上去輸入輸出的代碼並不是很簡潔,因為你往往需要包裝許多不同的對象。

在Java類庫中,IO部分的內容是很龐大的,因為它涉及的領域很廣泛:標准輸入輸出,文件的操作,網路上的數據流,字元串流,對象流,zip文件流。



『貳』 java io 默認緩沖區大小是多少位元組

8192個位元組。
你可以去jdk中查看BufferedReader類的源代碼,裡面定義了private static int defaultCharBufferSize = 8192

『叄』 Java 以下兩個要求 怎麼在Java中以程序的方式實現 (圍繞CORBA和IOR)

最近在看JAVANIO 的相關知識,了解一下IO的底層實現原理。

IO涉及到的底層的概念大致如下:

1) 緩沖區操作。2) 內核空間與用戶空間。3) 虛擬內存。4) 分頁技術。

一,虛擬存儲器

虛擬存儲器是硬體異常(缺頁異常)、硬體地址翻譯、主存、磁碟文件和內核軟體的完美交互,它為每個進程提供了一個大的、一致的和私有的地址空間。

虛擬存儲器的三大能力:①將主存看成是一個存儲在磁碟上的地址空間的高速緩存。②為每個進程提供了一個一致的地址空間。③保護每個進程的地址空間不被其他進程破壞。

虛擬內存的兩大好處:① 一個以上的虛擬地址可指向同一個物理內存地址。② 虛擬內存空間可大於實際可用的硬體內存。

二,用戶空間與內核空間

設虛擬地址為32位,那麼虛擬地址空間的范圍為0~4G。操作系統將這4G分為二部分,將最高的1G位元組(虛擬地址范圍為:0xC0000000-0xFFFFFFFF)供內核使用,稱為內核空間。而將較低的3G位元組供各個進程使用,稱為用戶空間。

每個進程可以通過系統調用進入內核,因為內核是由所有的進程共享的。對於每一個具體的進程,它看到的都是4G大小的虛擬地址空間,即相當於每個進程都擁有一個4G大小的虛擬地址空間。

三,IO操作

一般IO緩沖區操作:

1) 用戶進程使用read()系統調用,要求其用戶空間的緩沖區被填滿。

2) 內核向磁碟控制器硬體發命令,要求從磁碟讀入數據。

3) 磁碟控制器以DMA方式(數據不經過CPU)把數據復制到內核緩沖區。

4) 內核將數據從內核緩沖區復制到用戶進程發起read()調用時指定的用戶緩沖區。

四,JAVA中的IO,本質上是把數據移進或者移出緩沖區。

read()和write()系統調用完成的作用是:把內核緩沖區映射的物理內存空間中的數據 拷貝到 用戶緩沖區映射的物理內存空間中。

因此,當使用內存映射IO時,可視為:用戶進程直接把文件數據當作內存,也就不需要使用read()或write()系統調用了。

當發起一個read()系統調用時,根據待讀取的數據的位置生成一個虛擬地址(用戶進程使用的是虛擬地址),由MMU轉換成物理地址,若內核中沒有相應的數據,產生一個缺頁請求,內核負責頁面調入從而將數據從磁碟讀取到內核緩沖區映射的物理內存中。對用戶程序而言,這一切都是在不知不覺中進行。

總之,從根本上講數據從磁碟裝入內存是以頁為單位通過分頁技術裝入內存的。

五,JAVA NIO中的直接緩存和非直接緩存

直接緩存:不是分配於堆上的存儲,位於JVM之外,它不受JAVA的GC管理,相當於內核緩沖區。非直接緩存:建立在JAVA堆上的緩存,受JVM管理,相當於用戶緩沖區。

根據上面第三點,將直接緩存中的數據寫入通道的速度要快於非直接緩存。因為,連接到通道的另一端是文件(磁碟,FileChannel)或者網路(Socket通道),這些都是某種形式上的硬體。那麼,對於非直接緩存而言,數據從緩沖區傳遞到硬體,要經過內核緩沖區中轉。而對於直接緩存而言,就不需要了,因為直接緩存已經直接映射到內核緩沖區了。

『肆』 java 讀取一個巨大的文本文件,該如何實現 既能保證內存不溢出 又能保證性能

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

public class ReadBig {
public static String fff = "C:\\mq\\read\\from.xml";

public static void main1(String[] args) throws Exception {

final int BUFFER_SIZE = 0x300000;// 緩沖區大小為3M

File f = new File(fff);

/**
*
* map(FileChannel.MapMode mode,long position, long size)
*
* mode - 根據是按只讀、讀取/寫入或專用(寫入時拷貝)來映射文件,分別為 FileChannel.MapMode 類中所定義的
* READ_ONLY、READ_WRITE 或 PRIVATE 之一
*
* position - 文件中的位置,映射區域從此位置開始;必須為非負數
*
* size - 要映射的區域大小;必須為非負數且不大於 Integer.MAX_VALUE
*
* 所以若想讀取文件後半部分內容,如例子所寫;若想讀取文本後1/8內容,需要這樣寫map(FileChannel.MapMode.READ_ONLY,
* f.length()*7/8,f.length()/8)
*
* 想讀取文件所有內容,需要這樣寫map(FileChannel.MapMode.READ_ONLY, 0,f.length())
*
*/

MappedByteBuffer inputBuffer = new RandomAccessFile(f, "r")
.getChannel().map(FileChannel.MapMode.READ_ONLY,
f.length() / 2, f.length() / 2);

byte[] dst = new byte[BUFFER_SIZE];// 每次讀出3M的內容

long start = System.currentTimeMillis();

for (int offset = 0; offset < inputBuffer.capacity(); offset += BUFFER_SIZE) {

if (inputBuffer.capacity() - offset >= BUFFER_SIZE) {

for (int i = 0; i < BUFFER_SIZE; i++)

dst[i] = inputBuffer.get(offset + i);

} else {

for (int i = 0; i < inputBuffer.capacity() - offset; i++)

dst[i] = inputBuffer.get(offset + i);

}

int length = (inputBuffer.capacity() % BUFFER_SIZE == 0) ? BUFFER_SIZE
: inputBuffer.capacity() % BUFFER_SIZE;

System.out.println(new String(dst, 0, length));// new
// String(dst,0,length)這樣可以取出緩存保存的字元串,可以對其進行操作

}

long end = System.currentTimeMillis();

System.out.println("讀取文件文件一半內容花費:" + (end - start) + "毫秒");

}

public static void main2(String[] args) throws Exception {
int bufSize = 1024;
byte[] bs = new byte[bufSize];
ByteBuffer byteBuf = ByteBuffer.allocate(1024);
FileChannel channel = new RandomAccessFile(fff, "r").getChannel();
while (channel.read(byteBuf) != -1) {
int size = byteBuf.position();
byteBuf.rewind();
byteBuf.get(bs); // 把文件當字元串處理,直接列印做為一個例子。
System.out.print(new String(bs, 0, size));
byteBuf.clear();
}

}

public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new FileReader(fff));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}

}

『伍』 關於java的io讀寫,緩沖區是如何提高讀寫效率的

理解是對的。
調用I\O操作的時候,實際上還是一個一個的讀或者寫,關鍵就在,CPU只有一個,不論是幾個核心。CPU在系統調用時,會不會還要參與主要操作?參與多次就會花更多的時間。

系統調用時,若不用緩沖,CPU會酌情考慮使用 中斷。此時CPU是主動地,每個周期中都要花去一部分去詢問I\O設備是否讀完數據,這段時間CPU不能做任何其他的事情(至少負責執行這段模塊的核不能)。所以,調用一次讀了一個字,通報一次,CPU騰出時間處理一次。

而設置緩沖,CPU通常會使用 DMA 方式去執行 I\O 操作。CPU 將這個工作交給DMA控制器來做,自己騰出時間做其他的事,當DMA完成工作時,DMA會主動告訴CPU「操作完成」。這時,CPU接管後續工作。在此,CPU 是被動的。DMA是專門 做 I\O 與 內存 數據交換的,不僅自身效率高,也節約了CPU時間,CPU在DMA開始和結束時做了一些設置罷了。
所以,調用一次,不必通報CPU,等緩沖區滿了,DMA 會對C PU 說 「嘿,伙計!快過來看看,把他們都搬走吧」。

綜上,設置緩沖,就建立了數據塊,使得DMA執行更方便,CPU也有空閑,而不是獃獃地候著I\O數據讀來。從微觀角度來說,設置緩沖效率要高很多。盡管,不能從這個程序上看出來。 幾萬字的讀寫\就能看到差距

『陸』 java 中簡述使用流進行讀寫文本文件的步驟

讀寫是兩個不同的分支,通常都是分開單獨使用的。

『柒』 理解不了BufferedReader的大小有什麼作用

1、java.io.BufferedReader和java.io.BufferedWriter類各擁有8192字元的緩沖區。當BufferedReader在讀取文本文件時,會先盡量從文件中讀入字元數據並置入緩沖區,而之後若使用read()方法,會先從緩沖區中進行讀取。如果緩沖區數據不足,才會再從文件中讀取,使用BufferedWriter時,寫入的數據並不會先輸出到目的地,而是先存儲至緩沖區中。如果緩沖區中的數據滿了,才會一次對目的地進行寫出。

2、從標准輸入流System.in中直接讀取使用者輸入時,使用者每輸入一個字元,System.in就讀取一個字元。為了能一次讀取一行使用者的輸入,使用了BufferedReader來對使用者輸入的字元進行緩沖。readLine()方法會在讀取到使用者的換行字元時,再一次將整行字元串傳入。

3、System.in是一個位流,為了轉換為字元流,可使用InputStreamReader為其進行字元轉換,然後再使用BufferedReader為其增加緩沖功能。例如:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

下面的示例示範了BufferedReader和BufferedWriter的使用。可以在文字模式下輸入字元,程序會將輸入的文字存儲至指定的文件中,如果要結束程序,輸入quit字元串即可。
Java代碼 :
package ysu.hxy;
import java.util.*;
import java.io.*;

public class BufferedReaderWriterDemo {
public static void main(String[] args) {
try {
//緩沖System.in輸入流
//System.in是位流,可以通過InputStreamReader將其轉換為字元流
BufferedReader bufReader = new BufferedReader(new InputStreamReader(System.in));
//緩沖FileWriter
BufferedWriter bufWriter = new BufferedWriter(new FileWriter(args[0]));
String input = null;
//每讀一行進行一次寫入動作
while(!(input = bufReader.readLine()).equals("quit")) {
bufWriter.write(input);
//newLine()方法寫入與操作系統相依的換行字元,依執行環境當時的OS來決定該輸出那種換行字元
bufWriter.newLine();
}
bufReader.close();
bufWriter.close();
} catch( e) {
System.out.println("沒有指定文件");
} catch(IOException e) {
e.printStackTrace();
}
}
}
//運行後會在目錄下產生一個文件test2.txt,並在其中寫入剛才輸入的內容。

閱讀全文

與javaio緩沖區大小相關的資料

熱點內容
文件報送抄送的格式 瀏覽:929
chm文件亂碼 瀏覽:234
微信收藏文件不能下載到電腦 瀏覽:602
c判斷文件格式 瀏覽:130
ps3如何轉換iso文件 瀏覽:531
allwaysync區域網教程 瀏覽:285
微信48mb文件打不開 瀏覽:210
word默認的行距和字元間距是多少 瀏覽:983
如何通過數據解決問題 瀏覽:663
微信給自己發文件 瀏覽:795
如何更換excel文件密碼 瀏覽:842
大數據技術是什麼系 瀏覽:90
怎樣在手機上復制文件夾裡面的文件夾里 瀏覽:395
word亂碼恢復器 瀏覽:138
如何保存頁面密碼 瀏覽:967
傳輸文件內容 瀏覽:22
word文檔中的圖片 瀏覽:815
江門哪裡好學編程 瀏覽:185
nike的app怎麼登 瀏覽:590
寬頻升級為什麼變慢了 瀏覽:623

友情鏈接