字節(jié)流是由字節(jié)組成的,
成都創(chuàng)新互聯(lián)公司技術(shù)團(tuán)隊(duì)10年來致力于為客戶提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、高端網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營銷推廣、搜索引擎SEO優(yōu)化等服務(wù)。經(jīng)過多年發(fā)展,公司擁有經(jīng)驗(yàn)豐富的技術(shù)團(tuán)隊(duì),先后服務(wù)、推廣了1000多家網(wǎng)站,包括各類中小企業(yè)、企事單位、高校等機(jī)構(gòu)單位。
字節(jié)流是最基本的,所有的InputStrem和OutputStream的子類都是,主要用在處理二進(jìn)制數(shù)據(jù),它是按字節(jié)來處理的
字符流和字節(jié)流都是什么
流就是stream. 一個(gè)連續(xù)的字節(jié)隊(duì)列。
流是程序輸入或輸出的一個(gè)連續(xù)的字節(jié)序列,設(shè)備(例如鼠標(biāo),鍵盤,磁盤,屏幕和打印機(jī))的輸入和輸出都是用流來處理的。在C語言中,所有的流均以文件的形式出現(xiàn)---不一定是物理磁盤文件,還可以是對應(yīng)與某個(gè)輸入/輸出源的邏輯文件
流(streams)在I/O系統(tǒng)中是一種I/O機(jī)制和功能,或者稱為streams子系統(tǒng)。它本身并不是一個(gè)物理設(shè)備的概念。
引入流的目的:
傳統(tǒng)的字符設(shè)備驅(qū)動(dòng)程序框架有許多缺點(diǎn),這表現(xiàn)在:
。內(nèi)核與字符設(shè)備驅(qū)動(dòng)程序間接口的抽象層次太高
。內(nèi)核沒有為字符設(shè)備提供可靠的緩沖區(qū)分配和管理功能
。許多系統(tǒng)對字符設(shè)備的界面是把數(shù)據(jù)看成是FIFO(先進(jìn)先出)的字節(jié)流,因此沒有識別消息邊界,區(qū)分普通設(shè)備和控制信息,以及判定不同消息優(yōu)先級的能力,也沒有字節(jié)流流量控制
。在網(wǎng)絡(luò)數(shù)據(jù)傳輸設(shè)備中這些問題更突出。網(wǎng)絡(luò)中數(shù)據(jù)傳輸是基于消息或數(shù)據(jù)分組的。
流的概念:
用通訊中的術(shù)語來說,流是全雙工的處理過程,它是內(nèi)核中驅(qū)動(dòng)程序和用戶進(jìn)程之間的數(shù)據(jù)傳輸通道。
從流的構(gòu)造上來說,它由一個(gè)流頭,一個(gè)流驅(qū)動(dòng)程序尾,以及其間的零個(gè)或若干個(gè)可選模塊構(gòu)成 。流頭是一個(gè)用戶級接口,它允許用戶應(yīng)用程序通過系統(tǒng)調(diào)用接口來訪問流。驅(qū)動(dòng)程序尾與底層設(shè)備通信。在流的中間的模塊是處理數(shù)據(jù)的。
字節(jié)流與字符流主要的區(qū)別是他們的的處理對象
字節(jié)流是由字節(jié)組成的,字符流是由字符組成的. Java里字符由兩個(gè)字節(jié)組成.
字節(jié)流是最基本的,所有的InputStrem和OutputStream的子類都是,主要用在處理二進(jìn)制數(shù)據(jù),它是按字節(jié)來處理的
但實(shí)際中很多的數(shù)據(jù)是文本,又提出了字符流的概念,它是按虛擬機(jī)的encode來處理,也就是要進(jìn)行字符集的轉(zhuǎn)化。在從字節(jié)流轉(zhuǎn)化為字符流時(shí),實(shí)際上就是byte[]轉(zhuǎn)化為String時(shí),
public String(byte bytes[], String charsetName)
有一個(gè)關(guān)鍵的參數(shù)字符集編碼,通常我們都省略了,那系統(tǒng)就用操作系統(tǒng)默認(rèn)的lang
流式傳輸主要指將整個(gè)音頻和視頻及三維媒體等多媒體文件經(jīng)過特定的壓縮方式解析成一個(gè)個(gè)壓縮包,由視頻服務(wù)器向用戶計(jì)算機(jī)順序或?qū)崟r(shí)傳送。在采用流式傳輸方式的系統(tǒng)中,用戶不必像采用下載方式那樣等到整個(gè)文件全部下載完畢,而是只需經(jīng)過幾秒或幾十秒的啟動(dòng)延時(shí)即可在用戶的計(jì)算機(jī)上利用解壓設(shè)備對壓縮的A/V、3D等多媒體文件解壓后進(jìn)行播放和觀看。此時(shí)多媒體文件的剩余部分將在后臺的服務(wù)器內(nèi)繼續(xù)下載。
imagegif(resource $image [, string $filename ]) 從 image 圖像以 filename 為文件名創(chuàng)建一個(gè) GIF 圖像。image 參數(shù)是 imagecreate() 或 imagecreatefrom* 函數(shù)的返回值。
imagejpeg(resource $image [, string $filename ]) 從 image 圖像以 filename 為文件名創(chuàng)建一個(gè) JPEG 圖像。
imagepng(resource $image [, string $filename ]) 將 GD 圖像流(image)以 PNG 格式輸出到標(biāo)準(zhǔn)輸出(通常為瀏覽器),或者如果用 filename 給出了文件名則將其輸出到該文件。
filename 文件保存的路徑,如果未設(shè)置或?yàn)?NULL,將會(huì)直接輸出原始圖象流。
這幾個(gè)函數(shù)你參考一下,希望對你有幫助。
使用緩存,比如memcache,redis,因?yàn)樗鼈兪窃趦?nèi)存中運(yùn)行,所以處理數(shù)據(jù),返回?cái)?shù)據(jù)非???,所以可以應(yīng)對高并發(fā)。
2.增加帶寬和機(jī)器性能,1M的帶寬同時(shí)處理的流量肯定有限,所以在資源允許的情況下,大帶寬,多核cpu,高內(nèi)存是一個(gè)解決方案。
3.分布式,讓多個(gè)訪問分到不同的機(jī)器上去處理,每個(gè)機(jī)器處理的請求就相對減少了。
簡單說些常用技術(shù),負(fù)載均衡,限流,加速器等
在調(diào)用公眾號接口".$token."type=".$type;
上傳永久素材文件總是返回 "{\"errcode\":41005,\"errmsg\":\"media data missing\"}"
經(jīng)過多次測試使用下面的方式,可以正常上傳
//調(diào)用測試
protected static $url;
protected static $delimiter;
protected static $instance;
public function index()
{
? ? static::$delimiter = uniqid();
$basename = Request::instance()-root();
if (pathinfo($basename, PATHINFO_EXTENSION) == 'php') {
$basename = dirname($basename);
}
? ? $result=$this-wxAddMaterial($token,$basename.'/upload/images/gnlog.jpg','image');
}
// 新增其他類型永久素材
public function wxAddMaterial($token,$filename='',$type='') {
// 設(shè)置請求參數(shù)
static::$url = "".$token."type=".$type;
$filePath = str_replace('\\', '/', $filename);
// 發(fā)送請求
$imginfo=pathinfo($filePath);
$fields = array(
? ? 'media'=file_get_contents(".".$filePath),
? ? 'filename'=$imginfo["basename"],
);
$res = $this-putPart( $fields);
// 發(fā)送請求
return $res;
}
//推送文件流
public function putPart($param) {
$post_data = static::buildData($param);
$curl = curl_init(static::$url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($curl, CURLOPT_HTTPHEADER, [
? ? "Content-Type: multipart/form-data; boundary=" . static::$delimiter,
? ? "Content-Length: " . strlen($post_data)
]);
$response = curl_exec($curl);
curl_close($curl);
return $response;
}
//編譯請求頭格式和數(shù)據(jù)流
private static function buildData($param){
$data = '';
$eol = "\r\n";
$upload = $param['media'];
unset($param['media']);
foreach ($param as $name = $content) {
? ? $data .= "--" . static::$delimiter . "\r\n"
? ? ? ? . 'Content-Disposition: form-data; name="' . $name . "\"\r\n\r\n"
? ? ? ? . $content . "\r\n";
}
$data .= "--" . static::$delimiter . $eol
? ? . 'Content-Disposition: form-data; name="media"; filename="' . $param['filename'] . '"' . "\r\n"
? ? . 'Content-Type:application/octet-stream'."\r\n\r\n";
$data .= $upload . "\r\n";
$data .= "--" . static::$delimiter . "--\r\n";
return $data;
}
根據(jù)自己的實(shí)際情況稍作修改
$content?=?$_POST['data'];
$fp?=?fopen('/tmp/newfile.bin','w');
fwrite($fp,$content);
以上例子是在data參數(shù)上傳二進(jìn)制,并保存到/tmp/newfile.bin中,解析json用json_decode,然后把二進(jìn)制的那個(gè)值賦給content就可以
用把ZIP流轉(zhuǎn)換成byte類型,之后用PHP的ZIP解壓方法讀取?;蛘咦尫?wù)器端別用ZIP壓縮數(shù)據(jù),就直接傳遞數(shù)據(jù),也沒多少時(shí)間