⑴ 關於c++中流隨機訪問和文件讀寫問題
#include<string>
#include<iostream>
#include<sstream>
#include<fstream>
usingnamespacestd;
intmain(intargc,char*argv[])
{
fstreamfs("aa.txt",fstream::ate|fstream::in|fstream::out);//打開文件供讀寫,移到結尾
if(!fs) //打開文件出錯
{
cerr<<"Unabletoopenfile!"<<endl;
returnEXIT_FAILURE;
}
autoend_mark=fs.tellg(); //定義文件結束標記,等於文件長度
cout<<"end_mark="<<end_mark<<endl;
fs.seekg(0,fstream::beg); //操作指針移到文件開始
intcnt=0;
stringline;
while(fs&&fs.tellg()!=end_mark&&getline(fs,line))
{
//cout<<"line="<<line<<endl;
cnt+=line.size()+1;
automark=fs.tellg();
cout<<"mark="<<mark<<endl;//保存並輸出當前指針位置
fs.seekp(0,fstream::end); //操作指針移到文件結尾
fs<<cnt; //寫入計數
if(mark!=end_mark)fs<<""; //文件未完,繼續讀
fs.seekg(mark); //操作指針移回上面保存的讀取位置
}
cout<<"tellg()="<<fs.tellg()<<endl;//這時看看,位置到結尾了.
//fs.seekp(0,fstream::beg);
cout<<"注意這個輸出:"<<line<<endl;//上面循環中getline(fs,line)已經讀到最後一行了,
//注意看了,這是為什麼原程序不會往文件結尾寫入"****"的原因:
//在上面while循環操作中,操作指針已移到文件結尾,再調用seekg有可能出現無效!!
//必須先clear()或者再隨便移一下指針位置,按http://www.cplusplus.com/reference/istream/istream/seekg/
//裡面提到:
//C++99:,thefunctionfails(setsfailbitandreturns).
//C++11:,ifsetbeforethecall.
///網上大神也說:endoffile的時候,seek是無效的,必須先clear.
//所以,會出現問題中的星號寫不進文件的情形.保險起見,下面改成:
fs.clear();//或者用下面這句,兩句選一
//fs.seekg(0,fstream::beg); //動一動指針,移到文件開始
//不然,進不了下面判斷中if部分.總之,這一部分挺亂的,C++98,C++11標准支持不同.
if(fs)//先判斷文件還有沒有打開
{
fs.seekp(0,fstream::end); //移到結尾.
fs<<cnt; //寫入最後一行計數
fs<<"**** "; //原程序根本來不到這里.所以無法操作.現在可以操作了,寫入.
cout<<"success!"<<endl;
}
else
{
cout<<"endoffile"<<endl;
}
fs.close();
//system("pause");
return0;
}
⑵ python文件指針是什麼,如何實現文件的隨機讀取
python文件指針是FILE類型的指針。通過移動文件指針,可以使用函數方法來進行文件的讀取與寫入。將文件都視為流,只能按順序從頭到尾讀取。實際上,可在文件中移動,只訪問感興趣的部分(稱為隨機存取)。
⑶ 如何使用ASP隨機讀取access資料庫中的一條信息
Select top 5 * from yourtable order by newid()
隨機取出五條記錄,下面是具體說明
uniqueidentifier是全局唯一標識符 (GUID)
NEWID()返回類型為uniqueidentifier
SQL SERVER聯機幫助中的例子:
declare @myid uniqueidentifier
set @myid=newid()
print 'Value of @myid is '+cast(@myid as varchar(255))
每次運行以上程序返回不同的uniqueidentifier
NEWID()另外一個應用是在Select出記錄時隨即選出N條記錄
比如:Select top 5 * from yourtable order by newid()
這樣就能從yourtable表中每次隨機地選出5條記錄,這對於隨機顯示新聞的地方比較有用
⑷ 考研計算機組成原理:隨機存儲方式、隨機訪問、隨機存取是什麼區別
隨機存儲可以理解為等同於隨機存取,只有RAM可以。
隨機存取和隨機訪問的區別:
1、側重點不同:
隨機存取:隨機是指存取時間與存儲單元的物理位置無關。
隨機訪問:側重在訪問,一般理解為讀操作。
2、訪問方式不同:
隨機存取:存取是指寫入與讀出操作,計算機中的主存如RAM採用這種方式。
隨機訪問:為讀操作,因為ROM是只讀存儲器,所以可以像RAM一樣隨機訪問,但不能隨機存取。
(4)隨機訪問流讀取數據和使用方法擴展閱讀:
隨機存取存儲基本結構
隨機存取存儲器(RAM)的基本結構可分為三個部分:存儲矩陣,地址解碼器,讀寫電路,下面分為三塊介紹:
1、存儲矩陣:存儲矩陣是用來存儲要存放的代碼,矩陣中每個存儲單元都用一個二進制碼給以編號,以便查詢此單元。這個二進制碼稱作地址。
2、地址解碼器:解碼器可以將輸入地址譯為電平信號,以選中存儲矩陣中的響應的單元。定址方式分為一元定址和二元定址。一元定址又稱為單向解碼或字解碼,其輸出的解碼線就是字選擇線,用它來選擇被訪問字的所有單元。
二元定址又稱為雙向解碼,二元定址能夠訪問每一個單元,由X地址解碼器輸出的解碼線作為行選擇線進行「行選」;由Y 地址解碼器輸出的解碼線作為列選擇線進行「列選」,則行、列選擇線同時選中的單元即為被訪問單元,可以對它進行「寫入」或「讀出」。
3、讀寫電路:讀寫電路是RAM的控制部分,它包括片選CS,讀寫控制R/W以及數據輸入讀出放大器,片選CS的作用是只有當該端加低電平時此RAM才起作用, 才能進行讀與寫,讀寫控制R/W的作用是當R/W端加高電平時,對此RAM進行讀出。當R/W端加低電平時進行寫入。
輸出級電路一般採用三態輸出或集電極開路輸出結構,以便擴展存儲容量,如果是集電極開路輸出(即 OC輸出),則應外接負載電阻。
參考資料來源:網路-隨機存取
⑸ java從文件結尾讀取數據
可以參照下面的兩個例子
**
* 隨機讀取文件內容
* @param fileName 文件名
*/
public static void readFileByRandomAccess(String fileName){
RandomAccessFile randomFile = null;
try {
System.out.println("隨機讀取一段文件內容:");
// 打開一個隨機訪問文件流,按只讀方式
randomFile = new RandomAccessFile(fileName, "r");
// 文件長度,位元組數
long fileLength = randomFile.length();
// 讀文件的起始位置
int beginIndex = (fileLength > 4) ? 4 : 0;
//將讀文件的開始位置移到beginIndex位置。
randomFile.seek(beginIndex);
byte[] bytes = new byte[10];
int byteread = 0;
//一次讀10個位元組,如果文件內容不足10個位元組,則讀剩下的位元組。
//將一次讀取的位元組數賦給byteread
while ((byteread = randomFile.read(bytes)) != -1){
System.out.write(bytes, 0, byteread);
}
} catch (IOException e){
e.printStackTrace();
} finally {
if (randomFile != null){
try {
randomFile.close();
} catch (IOException e1) {
}
}
}
}
/**
* 顯示輸入流中還剩的位元組數
* @param in
*/
private static void showAvailableBytes(InputStream in){
try {
System.out.println("當前位元組輸入流中的位元組數為:" + in.available());
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String fileName = "C:/temp/newTemp.txt";
ReadFromFile.readFileByBytes(fileName);
ReadFromFile.readFileByChars(fileName);
ReadFromFile.readFileByLines(fileName);
ReadFromFile.readFileByRandomAccess(fileName);
}
}
⑹ 隨機流可以對行操作嗎
隨機流可以對行操作。隨機流不屬於IO流,是支持對文件的讀取和寫入隨機訪問的。首先把隨機訪問的文件對象看作存儲在文件系統中的一個大型byte數組,然後通過指向該byte數組的游標或索引在該數組任意位置讀取或寫入任意數據。
⑺ Java讀取文件問題
使用Java操作文本文件的方法詳解
摘要: 最初java是不支持對文本文件的處理的,為了彌補這個缺憾而引入了Reader和Writer兩個類
最初java是不支持對文本文件的處理的,為了彌補這個缺憾而引入了Reader和Writer兩個類,這兩個類都是抽象類,Writer中 write(char[] ch,int off,int
length),flush()和close()方法為抽象方法,Reader中read(char[] ch,int off,int length)和close()方法是抽象方法。子類應該分別實現他們。 當我們讀寫文本文件的時候,採用Reader是非常方便的,比如FileReader,InputStreamReader和BufferedReader。其中最重要的類是InputStreamReader,它是位元組轉換為字元的橋梁。你可以在構造器重指定編碼的方式,如果不指定的話將採用底層操作系統的默認編碼方式,例如GBK等。當使用FileReader讀取文件的時候。FileReader fr = new FileReader("ming.txt");
int ch = 0;
while((ch = fr.read())!=-1 )
{
System.out.print((char)ch);
}
其中read()方法返回的是讀取得下個字元。當然你也可以使用read(char[] ch,int off,int length)這和處理二進制文件的時候類似,不多說了。如果使用InputStreamReader來讀取文件的時候while((ch = isr.read())!=-1)
{
System.out.print((char)ch);
}
這和FileReader並沒有什麼區別,事實上在FileReader中的方法都是從InputStreamReader中繼承過來的。read()方法是比較好費時間的,如果為了提高效率我們可以使用BufferedReader對Reader進行包裝,這樣可以提高讀取得速度,我們可以一行一行的讀取文本,使用readLine()方法。BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("ming.txt")));
String data = null;
while((data = br.readLine())!=null)
{
System.out.println(data);
}
當你明白了如何用Reader來讀取文本文件的時候那麼用Writer寫文件同樣非常簡單。有一點需要注意,當你寫文件的時候,為了提高效率,寫入的數據會先放入緩沖區,然後寫入文件。因此有時候你需要主動調用flush()方法。與上面對應的寫文件的方法為:
FileWriter fw = new FileWriter("hello.txt");
String s = "hello world";
fw.write(s,0,s.length());
fw.flush();OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("hello2.txt"));
osw.write(s,0,s.length());
osw.flush();PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("hello3.txt")),true);
pw.println(s);
不要忘記用完後關閉流!下面是個小例子,幫助新手理解。其實有的時候java的IO系統是需要我們多記記的,不然哪天就生疏了。
import java.io.*;public class TestFile2
{
public static void main(String[] args) throws IOException
{
FileReader fr = new FileReader("ming.txt");
char[] buffer = new char[1024];
int ch = 0;
while((ch = fr.read())!=-1 )
{
System.out.print((char)ch);
} InputStreamReader isr = new InputStreamReader(new FileInputStream("ming.txt"));
while((ch = isr.read())!=-1)
{
System.out.print((char)ch);
} BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("ming.txt")));
String data = null;
while((data = br.readLine())!=null)
{
System.out.println(data);
} FileWriter fw = new FileWriter("hello.txt");
String s = "hello world";
fw.write(s,0,s.length());
fw.flush(); OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("hello2.txt"));
osw.write(s,0,s.length());
osw.flush(); PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("hello3.txt")),true);
pw.println(s);
fr.close();
isr.close();
br.close();
fw.close();
osw.close();
pw.close();
}
}
java中多種方式讀文件
一、多種方式讀文件內容。
1、按位元組讀取文件內容
2、按字元讀取文件內容
3、按行讀取文件內容
4、隨機讀取文件內容
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.io.Reader;
public class ReadFromFile {
/**
* 以位元組為單位讀取文件,常用於讀二進制文件,如圖片、聲音、影像等文件。
* @param fileName 文件的名
*/
public static void readFileByBytes(String fileName){
File file = new File(fileName);
InputStream in = null;
try {
System.out.println("以位元組為單位讀取文件內容,一次讀一個位元組:");
// 一次讀一個位元組
in = new FileInputStream(file);
int tempbyte;
while((tempbyte=in.read()) != -1){
System.out.write(tempbyte);
}
in.close();
} catch (IOException e) {
e.printStackTrace();
return;
}
try {
System.out.println("以位元組為單位讀取文件內容,一次讀多個位元組:");
//一次讀多個位元組
byte[] tempbytes = new byte[100];
int byteread = 0;
in = new FileInputStream(fileName);
ReadFromFile.showAvailableBytes(in);
//讀入多個位元組到位元組數組中,byteread為一次讀入的位元組數
while ((byteread = in.read(tempbytes)) != -1){
System.out.write(tempbytes, 0, byteread);
}
} catch (Exception e1) {
e1.printStackTrace();
} finally {
if (in != null){
try {
in.close();
} catch (IOException e1) {
}
}
}
}
/**
* 以字元為單位讀取文件,常用於讀文本,數字等類型的文件
* @param fileName 文件名
*/
public static void readFileByChars(String fileName){
File file = new File(fileName);
Reader reader = null;
try {
System.out.println("以字元為單位讀取文件內容,一次讀一個位元組:");
// 一次讀一個字元
reader = new InputStreamReader(new FileInputStream(file));
int tempchar;
while ((tempchar = reader.read()) != -1){
//對於windows下,rn這兩個字元在一起時,表示一個換行。
//但如果這兩個字元分開顯示時,會換兩次行。
//因此,屏蔽掉r,或者屏蔽n。否則,將會多出很多空行。
if (((char)tempchar) != 'r'){
System.out.print((char)tempchar);
}
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println("以字元為單位讀取文件內容,一次讀多個位元組:");
//一次讀多個字元
char[] tempchars = new char[30];
int charread = 0;
reader = new InputStreamReader(new FileInputStream(fileName));
//讀入多個字元到字元數組中,charread為一次讀取字元數
while ((charread = reader.read(tempchars))!=-1){
//同樣屏蔽掉r不顯示
if ((charread == tempchars.length)&&(tempchars[tempchars.length-1] != 'r')){
System.out.print(tempchars);
}else{
for (int i=0; i<charread; i++){
if(tempchars[i] == 'r'){
continue;
}else{
System.out.print(tempchars[i]);
}
}
}
}
} catch (Exception e1) {
e1.printStackTrace();
}finally {
if (reader != null){
try {
reader.close();
} catch (IOException e1) {
}
}
}
}
/**
* 以行為單位讀取文件,常用於讀面向行的格式化文件
* @param fileName 文件名
*/
public static void readFileByLines(String fileName){
File file = new File(fileName);
BufferedReader reader = null;
try {
System.out.println("以行為單位讀取文件內容,一次讀一整行:");
reader = new BufferedReader(new FileReader(file));
String tempString = null;
int line = 1;
//一次讀入一行,直到讀入null為文件結束
while ((tempString = reader.readLine()) != null){
//顯示行號
System.out.println("line " + line + ": " + tempString);
line++;
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null){
try {
reader.close();
} catch (IOException e1) {
}
}
}
}
/**
* 隨機讀取文件內容
* @param fileName 文件名
*/
public static void readFileByRandomAccess(String fileName){
RandomAccessFile randomFile = null;
try {
System.out.println("隨機讀取一段文件內容:");
// 打開一個隨機訪問文件流,按只讀方式
randomFile = new RandomAccessFile(fileName, "r");
// 文件長度,位元組數
long fileLength = randomFile.length();
// 讀文件的起始位置
int beginIndex = (fileLength > 4) ? 4 : 0;
//將讀文件的開始位置移到beginIndex位置。
randomFile.seek(beginIndex);
byte[] bytes = new byte[10];
int byteread = 0;
//一次讀10個位元組,如果文件內容不足10個位元組,則讀剩下的位元組。
//將一次讀取的位元組數賦給byteread
while ((byteread = randomFile.read(bytes)) != -1){
System.out.write(bytes, 0, byteread);
}
} catch (IOException e){
e.printStackTrace();
} finally {
if (randomFile != null){
try {
randomFile.close();
} catch (IOException e1) {
}
}
}
}
/**
* 顯示輸入流中還剩的位元組數
* @param in
*/
private static void showAvailableBytes(InputStream in){
try {
System.out.println("當前位元組輸入流中的位元組數為:" + in.available());
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String fileName = "C:/temp/newTemp.txt";
ReadFromFile.readFileByBytes(fileName);
ReadFromFile.readFileByChars(fileName);
ReadFromFile.readFileByLines(fileName);
ReadFromFile.readFileByRandomAccess(fileName);
}
}
二、將內容追加到文件尾部
import java.io.FileWriter;
import java.io.IOException;
import java.io.RandomAccessFile;
/**
* 將內容追加到文件尾部
*/
public class AppendToFile {
/**
* A方法追加文件:使用RandomAccessFile
* @param fileName 文件名
* @param content 追加的內容
*/
public static void appendMethodA(String fileName,
String content){
try {
// 打開一個隨機訪問文件流,按讀寫方式
RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
// 文件長度,位元組數
long fileLength = randomFile.length();
//將寫文件指針移到文件尾。
randomFile.seek(fileLength);
randomFile.writeBytes(content);
randomFile.close();
} catch (IOException e){
e.printStackTrace();
}
}
/**
* B方法追加文件:使用FileWriter
* @param fileName
* @param content
*/
public static void appendMethodB(String fileName, String content){
try {
//打開一個寫文件器,構造函數中的第二個參數true表示以追加形式寫文件
FileWriter writer = new FileWriter(fileName, true);
writer.write(content);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String fileName = "C:/temp/newTemp.txt";
String content = "new append!";
//按方法A追加文件
AppendToFile.appendMethodA(fileName, content);
AppendToFile.appendMethodA(fileName, "append end. n");
//顯示文件內容
ReadFromFile.readFileByLines(fileName);
//按方法B追加文件
AppendToFile.appendMethodB(fileName, content);
AppendToFile.appendMethodB(fileName, "append end. n");
//顯示文件內容
ReadFromFile.readFileByLines(fileName);
}
}
⑻ VB隨機訪問模式讀取TXT記錄
首先是商品數據類型在公共模塊定義,比如
public type MerRecType
Name as string*100'你可以估計你最長的商品名所佔的字元數
Price as double
end type
dim mrec() as MerRecType'這里是商品的所有記錄
如果
然後是保存時
dim tmpmr as MerRecType'這里只是為了取得數據長度而定義一個臨時數據
Open "文件名" For Random as #1 len=len(tmpmr)
這里按mrec數組順序寫入文件
然後是你想知道的讀取部分
Open "文件名" For Random as #1 len=len(tmpmr) 'len=len(tmpmr)是必須的
n=9 '如果你想取得第9個數據,比如n=9
get #1,(n-1)*len(tmpmr)+1,tmpmr 'tmpmr就是你需要的第9個數據,當然你可以換成其他變數
⑼ 理解流的概念,流的劃分 2) 掌握文件描述,順序處理,隨機訪問處理的方法;
流媒體又叫流式媒體,它是指商家用一個視頻傳送伺服器把節目當成數據包發出,傳送到網路上。用戶通過解壓設備對這些數據進行解壓後,節目就會像發送前那樣顯示出來。這個過程的一系列相關的包稱為「流」。流媒體實際指的是一種新的媒體傳送方式,而非一種新的媒體。流媒體技術全面應用後,人們在網上聊天可直接語音輸入;如果想彼此看見對方的容貌、表情,只要雙方各有一個攝像頭就可以了;在網上看到感興趣的商品,點擊以後,講解員和商品的影像就會跳出來;更有真實感的影像新聞也會出現。流媒體技術發端於美國,在美國目前流媒體的應用已很普遍,比如惠普公司的產品發布和銷售人員培訓都用網路視頻進行。(南方都市報)所謂流媒體是指採用流式傳輸的方式在Internet播放的媒體格式。流式傳輸方式則是將整個A/V及3D等多媒體文件經過特殊的壓縮方式分成一個個壓縮包,由視頻伺服器向用戶計算機連續、實時傳送。在採用流式傳輸方式的系統中,用戶不必像採用下載方式那樣等到整個文件全部下載完畢,而是只需經過幾秒或幾十秒的啟動延時即可在用戶的計算機上利用解壓設備(硬體或軟體)對壓縮的A/V、3D等多媒體文件解壓後進行播放和觀看。此時多媒體文件的剩餘部分將在後台的伺服器內繼續下載。與單純的下載方式相比,這種對多媒體文件邊下載邊播放的流式傳輸方式不僅使啟動延時大幅度地縮短,而且對系統緩存容量的需求也大大降低。(ChinaByte)附:流媒體技術簡介一、流式傳輸的基礎在網路上傳輸音/視頻等多媒體信息目前主要有下載和流式傳輸兩種方案。A/V文件一般都較大,所以需要的存儲容量也較大;同時由於網路帶寬的限制,下載常常要花數分鍾甚至數小時,所以這種處理方法延遲也很大。流式傳輸時,聲音、影像或動畫等時基媒體由音視頻伺服器向用戶計算機的連續、實時傳送,用戶不必等到整個文件全部下載完畢,而只需經過幾秒或十數秒的啟動延時即可進行觀看。當聲音等時基媒體在客戶機上播放時,文件的剩餘部分將在後台從伺服器內繼續下載。流式不僅使啟動延時成十倍、百倍地縮短,而且不需要太大的緩存容量。流式傳輸避免了用戶必須等待整個文件全部從Internet上下載才能觀看的缺點。流媒體指在Internet/Intranet中使用流式傳輸技術的連續時基媒體,如:音頻、視頻或多媒體文件。流式媒體在播放前並不下載整個文件,只將開始部分內容存入內存,流式媒體的數據流隨時傳送隨時播放,只是在開始時有一些延遲。流媒體實現的關鍵技術就是流式傳輸。流式傳輸定義很廣泛,現在主要指通過網路傳送媒體(如視頻、音頻)的技術總稱。其特定含義為通過Internet將影視節目傳送到PC機。實現流式傳輸有兩種方法:實時流式傳輸(Realtimestreaming)和順序流式傳輸(progressivestreaming)。一般說來,如視頻為實時廣播,或使用流式傳輸媒體伺服器,或應用如RTSP的實時協議,即為實時流式傳輸。如使用HTTP伺服器,文件即通過順序流發送。採用那種傳輸方法依賴你的需求。當然,流式文件也支持在播放前完全下載到硬碟。順序流式傳輸順序流式傳輸是順序下載,在下載文件的同時用戶可觀看再線媒體,在給定時刻,用戶只能觀看已下載的那部分,而不能跳到還未下載的前頭部分,順序流式傳輸不象實時流式傳輸在傳輸期間根據用戶連接的速度做調整。由於標準的HTTP伺服器可發送這種形式的文件,也不需要其他特殊協議,它經常被稱作HTTP流式傳輸。順序流式傳輸比較適合高質量的短片段,如片頭、片尾和廣告,由於該文件在播放前觀看的部分是無損下載的,這種方法保證電影播放的最終質量。這意味著用戶在觀看前,必須經歷延遲,對較慢的連接尤其如此。對通過數據機發布短片段,順序流式傳輸顯得很實用,它允許用比數據機更高的數據速率創建視頻片段。盡管有延遲,畢竟可讓你發布較高質量的視頻片段。順序流式文件是放在標准HTTP或FTP伺服器上,易於管理,基本上與防火牆無關。順序流式傳輸不適合長片段和有隨機訪問要求的視頻,如:講座、演說與演示。它也不支持現場廣播,嚴格說來,它是一種點播技術。實時流式傳輸實時流式傳輸指保證媒體信號帶寬與網路連接配匹,使媒體可被實時觀看到。實時流與HTTP流式傳輸不同,他需要專用的流媒體伺服器與傳輸協議。實時流式傳輸總是實時傳送,特別適合現場事件,也支持隨機訪問,用戶可快進或後退以觀看前面或後面的內容。理論上,實時流一經播放就可不停止,但實際上,可能發生周期暫停。實時流式傳輸必須配匹連接帶寬,這意味著在以數據機速度連接時圖象質量較差。而且,由於出錯丟失的信息被忽略掉,網路擁擠或出現問題時,視頻質量很差。如欲保證視頻質量,順序流式傳輸也許更好。實時流式傳輸需要特定伺服器,如QuickTimeStreamingServer、RealServer與WindowsMediaServer。這些伺服器允許你對媒體發送進行級別的控制,因而系統設置、管理比標准HTTP伺服器更復雜。實時流式傳輸還需要特殊網路協議,如:RTSP(RealtimeStreamingProtocol)或MMS(MicrosoftMediaServer)。這些協議在有防火牆時有時會出現問題,導致用戶不能看到一些地點的實時內容。二、流媒體技術原理流式傳輸的實現需要緩存。因為Internet以包傳輸為基礎進行斷續的非同步傳輸,對一個實時A/V源或存儲的A/V文件,在傳輸中它們要被分解為許多包,由於網路是動態變化的,各個包選擇的路由可能不盡相同,故到達客戶端的時間延遲也就不等,甚至先發的數據包還有可能後到。為此,使用緩存系統來彌補延遲和抖動的影響,並保證數據包的順序正確,從而使媒體數據能連續輸出,而不會因為網路暫時擁塞使播放出現停頓。通常高速緩存所需容量並不大,因為高速緩存使用環形鏈表結構來存儲數據:通過丟棄已經播放的內容,流可以重新利用空出的高速緩存空間來緩存後續尚未播放的內容。----流式傳輸的實現需要合適的傳輸協議。由於TCP需要較多的開銷,故不太適合傳輸實時數據。在流式傳輸的實現方案中,一般採用HTTP/TCP來傳輸控制信息,而用RTP/UDP來傳輸實時聲音數據。流式傳輸的過程一般是這樣的:用戶選擇某一流媒體服務後,Web瀏覽器與Web伺服器之間使用HTTP/TCP交換控制信息,以便把需要傳輸的實時數據從原始信息中檢索出來;然後客戶機上的Web瀏覽器啟動A/VHelper程序,使用HTTP從Web伺服器檢索相關參數對Helper程序初始化。這些參數可能包括目錄信息、A/V數據的編碼類型或與A/V檢索相關的伺服器地址。A/VHelper程序及A/V伺服器運行實時流控制協議(RTSP),以交換A/V傳輸所需的控制信息。與CD播放機或VCRs所提供的功能相似,RTSP提供了操縱播放、快進、快倒、暫停及錄制等命令的方法。A/V伺服器使用RTP/UDP協議將A/V數據傳輸給A/V客戶程序(一般可認為客戶程序等同於Helper程序),一旦A/V數據抵達客戶端,A/V客戶程序即可播放輸出。需要說明的是,在流式傳輸中,使用RTP/UDP和RTSP/TCP兩種不同的通信協議與A/V伺服器建立聯系,是為了能夠把伺服器的輸出重定向到一個不同於運行A/VHelper程序所在客戶機的目的地址。實現流式傳輸一般都需要專用伺服器和播放器,其基本原理如圖3.1所示。三、智能流技術(SureStream)今天,28.8Kbps數據機是Internet連接的基本速率,cablemodem、ADSL、DSS、ISDN等發展快,內容提供商不得不要麼限制發布媒體質量,要麼限制連接人數。根據RealNetwork站點統計,對28.8Kbps數據機,實際流量為10bps到26Kbps,呈鍾形分布,高峰在20Kbps。這意味著若內容提供商選擇20Kbps固定速率,將有大量用戶得不到好質量信號,並可能停止媒體流而引起客戶端再次緩沖,直到接收足夠數據。一種解決方法是伺服器減少發送給客戶端的數據而阻止再緩沖,在RealSystem5.0中,這種方法稱為\\\"視頻流瘦化\\\"。這種方法的限制是RealVideo文件為一種數據速率設計,結果可通過抽取內部幀擴展到更低速率,導致質量較低。離原始數據速率越遠,質量越差。另一種解決方法是根據不同連接速率創建多個文件,根據用戶連接,伺服器發送相應文件,這種方法帶來製作和管理上的困難,而且,用戶連接是動態變化的,伺服器也無法實時協調。智能流技術通過兩種途徑克服帶寬協調和流瘦化。首先,確立一個編碼框架,允許不同速率的多個流同時編碼,合並到同一個文件中;第二,採用一種復雜客戶/伺服器機制探測帶寬變化。針對軟體、設備和數據傳輸速度上的差別,用戶以不同帶寬瀏覽音視頻內容。為滿足客戶要求,Progressivenetworks公司編碼、記錄不同速率下媒體數據,並保存在單一文件中,此文件稱為智能流文件,即創建可擴展流式文件。當客戶端發出請求,它將其帶寬容量傳給伺服器,媒體伺服器根據客戶帶寬將智能流文件相應部分傳送給用戶。以此方式,用戶可看到最可能的優質傳輸,製作人員只需要壓縮一次,管理員也只需要維護單一文件,而媒體伺服器根據所得帶寬自動切換。智能流通過描述I現實世界Internet上變化的帶寬特點來發送高質量媒體並保證可靠性,並對混合連接環境的內容授權提供了解決方法。流媒體實現方式如下:*對所有連接速率環境創建一個文件*在混合環境下以不同速率傳送媒體*根據網路變化,無縫切換到其它速率*關鍵幀優先,音頻比部分幀數據重要*向後兼容老版本RealPlayer智能流在RealSystemG2中是對所謂自適應流管理(ASM)API的實現,ASM描述流式數據的類型,輔助智能決策,確定發送那種類型數據包。文件格式和廣播插件定義了ASM規則。用最簡單的形式分配預定義屬性和平均帶寬給數據包組。對高級形式,ASM規則允許插件根據網路條件變化改變數據包發送。每個ASM規則可有一定義條件的演示式,如演示式定義客戶帶寬是5,000到15,000Kbps,包損失小於2.5%。如此條件描述了客戶當前網路連接,客戶就訂閱此規則。定義在規則中的屬性有助於RealServer有效傳送數據包,如網路條件變化,客戶就訂閱一個不同規則。
⑽ Oracle 中實現隨機抽取數據
一、Oracle取隨機數據 1、Oracle訪問數據的基本方法: 1)、全表掃描(Full table Scan):執行全表掃描,Oracle讀表中的所有記錄,考查每一行是否滿足WHERE條件。Oracle順序的讀分配給該表的每一個數據塊,且每個數據塊Oracle只讀一次.這樣全表掃描能夠受益於多塊讀. 2)、采樣表掃描(sample table scan):掃描返回表中隨機采樣數據,這種訪問方式需要在FROM語句中包含SAMPLE選項或者SAMPLE BLOCK選項. 註:從Oracle8i開始Oracle提供采樣表掃描特性
2、使用sample獲得隨機結果集 2.1、語法: SAMPLE BLOCK [ SEED (seed_value) ] SAMPLE選項:表示按行采樣來執行一個全表掃描,Oracle從表中讀取特定百分比的記錄,並判斷是否滿足WHERE子句以返回結果。 BLOCK: 表示使用隨機塊例舉而不是隨機行例舉。 sample_percent:是隨機獲取一張表中記錄的百分比。比如值為10,那就是表中的隨機的百分之10的記錄。 值必須大於等於.000001,小於100。
SEED:表示從哪條記錄返回,類似於預先設定例舉結果,因而每次返回的結果都是固定的。該值必須介於0和4294967295之間。
2.2、舉例說明
(1)sample(sample_percent):
(2)、sample block(sample_percent)
(3)、sample block(sample_percent) seed(seed_value)
注意以下幾點:
1.sample只對單表生效,不能用於表連接和遠程表 2.sample會使SQL自動使用CBO
3、使用DBMS_RANDOM包 DBMS_RANDOM有兩種主要的使用方法分別是:DBMS_RANDOM.VALUE()和DBMS_RANDOM.RANDOM
4、使用 內部函數sys_guid()
****注:****
在使用sys_guid() 這種方法時,有時會獲取到相同的記錄,即和前一次查詢的結果集是一樣的,查找相關資料,有些說是和 操作系統 有關,在windows平台下正常,獲取到的數據是隨機的,而在 Linux 等平台下始終是相同不變的數據集,有些說是因為sys_guid()函數本身的問題,即sys_guid()會在查詢上生成一個16位元組的全局唯一標識符,這個標識符在絕大部分平台上由一個宿主標識符和進程或進程的線程標識符組成,這就是說,它很可能是隨機的,但是並不表示一定是百分之百的這樣。
所以,為確保在不同的平台每次讀取的數據都是隨機的,我們大多採用使用sample函數或者DBMS_RANDOM包獲得隨機結果集,其中使用sample函數更常用,因為其查詢時縮小了查詢范圍,在查詢大表,且要提取數據不是很不多的情況下,會對查詢速度上有明顯的提高。