當前位置:首頁 » 文件管理 » 流有緩存嗎

流有緩存嗎

發布時間: 2022-06-20 00:58:01

㈠ 帶緩存和不帶緩存的區別

以 ssize_t write(int filedes, const void *buff, size_t nbytes)和size_t fwrite(const void *ptr, size_t size, size_t nobj, FILE *fp)來講講自己對unix系統下帶緩存的I/O和不帶緩存的I/O的區別。

首先要清楚一個概念,所謂的代緩存並不是指上面兩個函數的buff參數,而是指unix系統在內核中所設的緩沖存儲器。

當將數據寫到文件上時,內核先將該數據寫到緩存,如果該緩存未滿,則並不將其排入輸出隊列,直到緩存寫滿或者內核再次需要重新使用此緩存時才將其排入輸入隊列,待其到達對首,在進行實際的I/O操作,也就是此時才把數據真正寫到磁碟,這種技術叫延遲寫。
現在假設內核所設的緩存是100個位元組,如果你使用write,且buff的size為10,當你要把9個同樣的buff寫到文件時,你需要調用9次write,也就是9次系統調用,此時也並沒有寫到硬碟,如果想立即寫到硬碟,調用fsync,可以進行實際的I/O操作。
標准I/O,也就是帶緩存的I/O採用FILE*,FILE實際上包含了為管理流所需要的所有信息:實際I/O的文件描述符,指向流緩存的指針(標准I/O緩存,由malloc分配,又稱為用戶態進程空間的緩存,區別於內核所設的緩存),緩存長度,當前在緩存中的位元組數,出錯標志等,假設流緩存的長度為50位元組,把以上的數據寫到文件,則只需要2次系統調用(fwrite調用write系統調用),因為先把數據寫到流緩存,當其滿以後或者調用fflush時才填入內核緩存,所以進行了2次的系統調用write。
fflush將流所有未寫的數據送入(刷新)到內核(內核緩沖區),fsync將所有內核緩沖區的數據寫到文件(磁碟)。

不帶緩存的read和write是相對於fread/fwrite等流函數來說明的,因為fread和fwrite是用戶函數(3),所以他們會在用戶層進行一次數據的緩存,而read/write是系統調用(2)所以他們在用戶層是沒有緩存的,所以稱read和write是無緩存的IO,其實對於內核來說還是進行了緩存,不過用戶層看不到罷了。

java中。流(Stream)的原理是讀取一個文件並講他儲存在一個流里,還是作為一個大門連接程序與數據

你可以把流看做是程序與文件或者設備連接的管道。

㈢ java中,緩沖流的疑惑

FileReader FileWriter 是字元流沒有緩沖的作用。
緩存流是 BufferedReader 和 BufferedWriter
流的讀取和傳輸都需要時間,如果一次性讀取一個位元組或者字元就發送到伺服器,必定沒有一次讀取多個位元組和字元然後發送到伺服器高效。

㈣ java中位元組流到底用到緩沖區沒有,如果用到的話為什麼不用刷新和字元流的區別是什麼 麻煩說的詳細!

最原始的位元組流沒有用到緩沖區,但是你可以給它套一個緩沖流吧,字元流和位元組流的區別,就是一個是針對位元組的,也就是這個文件可以是MP3。。。等等,字元流只能針對字元.肯定都用要內存,一個程序起來或多或少都有內存,也許你的上面的意思是想說 位元組流沒有把數據存到緩沖區里吧

㈤ 手機里流媒體裡面的初始緩存有什麼用

緩存是在播放的時候保持畫面有個緩沖階段,這樣不容易卡頓,就像電視直播,中間延遲30秒就是給畫面緩沖機會,以至於保持流暢,純手打希望幫到您

㈥ 數據流緩存是什麼

數據緩存
指在硬碟內部的高速存儲器,在電腦中就象一塊緩沖器一樣將一些數據暫時性的保存起來以供讀取和再讀取。目前硬碟的高速緩存一般為512KB—2MB,目前主流ATA硬碟的數據緩存為2MB,而在SCSI硬碟中最高的數據緩存現在已經達到了16MB。對於大數據緩存的硬碟在存取零散文件時具有很大的優勢。

緩存是指臨時文件交換區,手機把最常用的文件從存儲器里提出來臨時放在緩存里,就像把工具和材料搬上工作台一樣,這樣會比用時現去倉庫取更方便。因為緩存往往使用的是RAM(斷電即掉的非永久儲存),所以在忙完後還是會把文件送到手機存儲器里,

㈦ nodejs fs 文件流傳輸要不要緩存區

nodejs的fs模塊並沒有提供一個的方法,但我們可以很容易的實現一個,比如:
var source = fs.readFileSync('/path/to/source', {encoding: 'utf8'});
fs.writeFileSync('/path/to/dest', source);

這種方式是把文件內容全部讀入內存,然後再寫入文件,對於小型的文本文件,這沒有多大問題,比如grunt-file-就是這樣實現的。但是對於體積較大的二進制文件,比如音頻、視頻文件,動輒幾個GB大小,如果使用這種方法,很容易使內存「爆倉」。理想的方法應該是讀一部分,寫一部分,不管文件有多大,只要時間允許,總會處理完成,這里就需要用到流的概念。

如上面高大上的圖片所示,我們把文件比作裝水的桶,而水就是文件里的內容,我們用一根管子(pipe)連接兩個桶使得水從一個桶流入另一個桶,這樣就慢慢的實現了大文件的復制過程。
Stream在nodejs中是EventEmitter的實現,並且有多種實現形式,例如:
http responses request
fs read write streams
zlib streams
tcp sockets
child process stdout and stderr
上面的文件復制可以簡單實現一下:
var fs = require('fs');
var readStream = fs.createReadStream('/path/to/source');
var writeStream = fs.createWriteStream('/path/to/dest');

readStream.on('data', function(chunk) { // 當有數據流出時,寫入數據
writeStream.write(chunk);
});

readStream.on('end', function() { // 當沒有數據時,關閉數據流
writeStream.end();
});

上面的寫法有一些問題,如果寫入的速度跟不上讀取的速度,有可能導致數據丟失。正常的情況應該是,寫完一段,再讀取下一段,如果沒有寫完的話,就讓讀取流先暫停,等寫完再繼續,於是代碼可以修改為:
var fs = require('fs');
var readStream = fs.createReadStream('/path/to/source');
var writeStream = fs.createWriteStream('/path/to/dest');

readStream.on('data', function(chunk) { // 當有數據流出時,寫入數據
if (writeStream.write(chunk) === false) { // 如果沒有寫完,暫停讀取流
readStream.pause();
}
});

writeStream.on('drain', function() { // 寫完後,繼續讀取
readStream.resume();
});

readStream.on('end', function() { // 當沒有數據時,關閉數據流
writeStream.end();
});

或者使用更直接的pipe
// pipe自動調用了data,end等事件
fs.createReadStream('/path/to/source').pipe(fs.createWriteStream('/path/to/dest'));

下面是一個更加完整的復制文件的過程
var fs = require('fs'),
path = require('path'),
out = process.stdout;

var filePath = '/Users/chen/Movies/Game.of.Thrones.S04E07.1080p.HDTV.x264-BATV.mkv';

var readStream = fs.createReadStream(filePath);
var writeStream = fs.createWriteStream('file.mkv');

var stat = fs.statSync(filePath);

var totalSize = stat.size;
var passedLength = 0;
var lastSize = 0;
var startTime = Date.now();

readStream.on('data', function(chunk) {

passedLength += chunk.length;

if (writeStream.write(chunk) === false) {
readStream.pause();
}
});

readStream.on('end', function() {
writeStream.end();
});

writeStream.on('drain', function() {
readStream.resume();
});

setTimeout(function show() {
var percent = Math.ceil((passedLength / totalSize) * 100);
var size = Math.ceil(passedLength / 1000000);
var diff = size - lastSize;
lastSize = size;
out.clearLine();
out.cursorTo(0);
out.write('已完成' + size + 'MB, ' + percent + '%, 速度:' + diff * 2 + 'MB/s');
if (passedLength < totalSize) {
setTimeout(show, 500);
} else {
var endTime = Date.now();
console.log();
console.log('共用時:' + (endTime - startTime) / 1000 + '秒。');
}
}, 500);

可以把上面的代碼保存為.js試驗一下
我們添加了一個遞歸的setTimeout(或者直接使用setInterval)來做一個旁觀者,每500ms觀察一次完成進度,並把已完成的大小、百分比和復制速度一並寫到控制台上,當復制完成時,計算總的耗費時間,效果如圖:

我們復制了一集1080p的權利的游戲第四季第7集,大概3.78G大小,由於使用了SSD,可以看到速度還是非常不錯的,哈哈哈~
復制完成後,顯示總花費時間

結合nodejs的readline, process.argv等模塊,我們可以添加覆蓋提示、強制覆蓋、動態指定文件路徑等完整的復制方法,有興趣的可以實現一下,實現完成,可以
ln -s /path/to/.js /usr/local/bin/my

這樣就可以使用自己寫的my命令替代系統的cp命令

㈧ Java的緩存流的緩存區大了或小了會怎樣,緩存區有什麼用處

大了,會影響系統穩定
小了不起作用

緩沖顧名思義,就是處理的數據暫存的 。。。。。。。。。。

㈨ 什麼是流緩存

傳統數據傳輸時,傳完一次,再次訪問時需要再傳一次。採用流緩存後,傳完一次後會將數據標記,需要再次傳輸相同數據時,只需傳輸數據標簽,不用將整個數據都再重傳一遍,從而達到優化網路的效果。
個人理解

熱點內容
存儲標准性 發布:2024-05-03 13:37:07 瀏覽:416
液鹼存儲 發布:2024-05-03 13:21:13 瀏覽:156
linux如何改配置文件 發布:2024-05-03 13:00:54 瀏覽:31
哪個安卓模擬器老爺機帶得動 發布:2024-05-03 13:00:49 瀏覽:576
編程與實戰 發布:2024-05-03 12:54:30 瀏覽:38
電腦開機有密碼rpc伺服器不可用 發布:2024-05-03 12:40:54 瀏覽:471
硬體的演算法 發布:2024-05-03 12:34:28 瀏覽:388
支付密碼為什麼就六位 發布:2024-05-03 12:29:17 瀏覽:920
腳本找書 發布:2024-05-03 12:02:17 瀏覽:493
境外伺服器租用怎麼辦 發布:2024-05-03 11:45:34 瀏覽:944