⑴ 关于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函数更常用,因为其查询时缩小了查询范围,在查询大表,且要提取数据不是很不多的情况下,会对查询速度上有明显的提高。