<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    javaGrowing

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      92 隨筆 :: 33 文章 :: 49 評論 :: 0 Trackbacks

    #

    Dom + Javascript 在本機瀏覽器中對的表格數(shù)據(jù)進行排序

    在本機瀏覽器中對的表格數(shù)據(jù)進行排序
    在Web應用中,數(shù)據(jù)從服務器端返回到客戶端,以表格形式表現(xiàn)出來。如果要對數(shù)據(jù)集按指定的列排序顯示,常規(guī)做法都是向服務器發(fā)出請求,服務器端程序重新從數(shù)據(jù)庫中取出按指定列排序的數(shù)據(jù),返回給客戶端,頁面重新顯示排序后數(shù)據(jù)。
    ?
    采用這種方式有如下缺點:
    1- 響應時間延遲,每次排序都要向服務器端發(fā)送請求,等待結(jié)果返回,同時增加網(wǎng)絡負載。
    2- 編程復雜,可維護性差,而且客戶端和服務器端代碼耦合度很高,客戶端和服務器端都要處理排序涉及的列名、排序方式,如果有分頁和查詢條件,都需要在客戶端頁面中保留,排序請求時重新傳遞到服務器端,當參數(shù)數(shù)量很多時極易出錯。
    3- 重用度很低,針對不同表格,很難抽象出一個公共程序來共用,需要逐個編寫代碼實現(xiàn),增加工作量。
    ?
    現(xiàn)在換一個角度考慮,數(shù)據(jù)既然已下載到了客戶端,在重新排序時沒有必要再重服務器端獲取,只要對瀏覽器中的數(shù)據(jù)重新排序顯示就可以了。要實現(xiàn)該目標,需要做到以下幾點:
    1 - 獲得表格中要排序的數(shù)據(jù),將其放入一個2維數(shù)組中。
    2 - 對2維數(shù)組排序。
    3 - 用排序后的數(shù)據(jù)重新更新表格。
    ?
    利用瀏覽器支持的DOM(Document Object Model)和JavaScript即可實現(xiàn)上述目標。
    ?
    通常頁面中會很多的<table>,要獲得需要排序數(shù)據(jù)所在的table,需要在<table>中增加一個id屬性,便于document對象用getElementById得到該表格對象,例如要排序的表格定義如下:
    ?<table id="st" >
    ??? <tr>
    ??????? <td>1</td>
    ??????? <td>2</td>
    ??? </tr>
    </table>
    ?
    在javascript中,用var objTable = document.getElementById("st")就可得到表格對象,該對象在DOM中定義為一個Element。
    ?
    然 后用 var objRows = objTable.getElementsByTagName("tr")得到該表格中全部的行對象,ObjRows.length返回該表格行數(shù); var rowi = objRows[i].getElementsByTagName("td")得到第i行的全部<td>節(jié)點,i從0開始計數(shù), rowi.item(j)則可得到第i行,第j列的節(jié)點,該節(jié)點的innerHTML為該節(jié)點<td></td>之間的內(nèi)容。
    ?
    獲取表格數(shù)據(jù)到2維數(shù)組的代碼見源代碼,此處略。
    ?
    下面說明在javascript中2維數(shù)組的構(gòu)造和排序。
    javascript不支持2維數(shù)組,因此需要用數(shù)組的數(shù)組來模擬一個2維數(shù)組,其方法是先定義一個1維數(shù)組,元素個數(shù)為2維數(shù)組的行數(shù),然后對每個元素賦一個值,值為一個數(shù)組,其元素個數(shù)為2維數(shù)組的列數(shù)。構(gòu)造代碼如下:
    ?
    var rows = new Array(R);? //R為行數(shù)
    for(var i = 0; i < rows.length; i++){
    ??? rows[i] = new Array(C);??? //C為列數(shù)
    }
    ?
    ?
    利用javascript中的Array.sort(comparer)對rows中的元素排序,比較方式由重新定義的比較函數(shù)得到。要根據(jù)第j列元素的大小排序,只要定義如下函數(shù)即可:
    ?
    function compareCol(a,b){
    ???
    ??? if (a[j] < b[j])
    ??????? return -1;
    ?
    ??? if (a[j] > b[j])
    ??????? return 1;
    ?
    ?? return 0;
    ?
    }
    ?
    因為compareCol只能有兩個參數(shù),因此j要定義為全局變量。
    ?
    用rows.sort (compareCol)就可實現(xiàn)根據(jù)j列值的大小對行進行排序。根據(jù)javascript文檔,字符串比較大小是按照其Unicode編碼的大小來比 較,對英文排序沒有問題,對中文排序時就不是按通常的拼音排序,那需要javascript提供本地化支持,目前沒有發(fā)現(xiàn)javascript此功能。該 功能在java中可用java.text.Collator實現(xiàn)。
    ?
    ?
    ?以上介紹了在本地對瀏覽器中的數(shù)據(jù)進行排序的主要思想, 為方便使用,將這些功能進行了封裝,以javascript函數(shù)的提供,存放在sorttable.js文件中,在需要的頁面中用<script type=text/javascript src='sorttable.js'></script>引入。
    ?
    ?
    ?下面說明排序函數(shù)原型和使用方法。
    ?
    函數(shù)1 function sortTable(tableId,sortCol,compareType)
    對頁面中指定表格中的數(shù)據(jù)進行排序,通常第一行為標題行,排序時從第二行開始,第一次調(diào)用為升序排列,第二次為降序排列,依次輪換。
    tableId??? 為<table id=''>中id的值,在同一個頁面中要唯一。
    sortCol??? 排序時用來比較大小的數(shù)據(jù)所在的列,從1開始計數(shù)。
    compareType 排序時比較大小的方式,s-按字符串比較大小,n-按數(shù)字比較大小。
    ?
    ?
    ?
    ?函數(shù)2 function sortTableInRange(tableId,sortCol,compareType,startRow,endRow,startCol,endCol)
    ?
    ??????? 對表格中指定的區(qū)域數(shù)據(jù)排序,有時數(shù)據(jù)第一列為流水號,最后一行為合計,這些數(shù)據(jù)不需要參與排序,可用此函數(shù)來對部分數(shù)據(jù)排序。
    ???????
    ??????? tableId??? 為<table id=''>中id的值,在同一個頁面中要唯一。
    ??????? sortCol??? 排序時用來比較大小的數(shù)據(jù)所在的列,從1開始計數(shù)。
    ??????? compareType 排序時比較大小的方式,s-按字符串比較大小,n-按數(shù)字比較大小。
    ??????? startRow,endRow 要排序區(qū)域開始和結(jié)束行號,從1開始計數(shù)。例如對第2行到第7行排序,startRow=2,endRow=7
    ??????? startCol,endCol? 要排序區(qū)域開始和結(jié)束列號,從1開始計數(shù)。
    ?
    ?
    ?
    ?
    ?
    存在的問題:
    1- 中文不能按拼音排序。
    ?
    ?
    要注意的問題:
    要排序的table必須用ID標示,并要作為參數(shù)傳給排序函數(shù),表格中的數(shù)據(jù)應該是可以排序的,否則結(jié)果不可預知;要排序的表格不能有嵌套表,否則排序出錯。
    ?
    ?
    本函數(shù)已在IE6.0 ,FireFox1.01中運行通過。源代碼和例子代碼見后。
    ?
    ?
    ?
    ?
    參考資料:
    ?
    Danny Goodman with Michael Morrison?? JavaScript Bible 5th? ,John Wiley and Sons? 2004
    ?
    David Flanagan? JavaScript The Definitive Guide 4th ,? O'Reilly? 2001
    ?
    ?
    ?
    ?
    ?
    ?附源代碼:要運行例子,需要將javascript代碼保存到sorttable.js文件中,html部分代碼保存到同一目錄下另一文件中即可。
    ?
    ?
    sorttable.js
    ?
    ?

    ?1?//=========================================================
    ?2??//
    ?3??//??在本機對瀏覽器頁面表格中的數(shù)據(jù)行進行排序的javascript函數(shù)
    ?4??//?
    ?5??//??author?William??QQ:?22967225
    ?6?//??create?date?2005-12-2
    ?7??//??version?1.0
    ?8??//=========================================================
    ?9?
    10??//column?index?for?sort
    11??var?indexCol;
    12??//比較函數(shù),用于Array.sort()排序時比較用。
    13??//本函數(shù)比較數(shù)組元素array1[indexCol]和元素array2[indexCol]Unicode值的大小
    14??function?arrayCompare(array1,array2){
    15???//alert(array1.length+"--"+array1[indexCol]);
    16???if?(array1[indexCol]?<?array2[indexCol])
    17????return?-1;
    18???if?(array1[indexCol]?>?array2[indexCol])
    19????return?1;
    20??
    21???return?0;
    22??
    23??}
    24??//比較數(shù)組元素array1[indexCol]和元素array2[indexCol]的數(shù)值大小
    25??function?arrayCompareNumber(array1,array2){
    26??
    27???if?(parseInt(array1[indexCol])?<?parseInt(array2[indexCol]))
    28????return?-1;
    29???if?(parseInt(array1[indexCol])?>?parseInt(array2[indexCol]))
    30????return?1;
    31??
    32???return?0;
    33??}
    34??//與arrayCompare相反方式比較大小,用于倒序使用
    35??function?arrayCompareRev(array1,array2){
    36??
    37???if?(array1[indexCol]?<?array2[indexCol])
    38????return?1;
    39???if?(array1[indexCol]?>?array2[indexCol])
    40????return?-1;
    41??
    42???return?0;
    43??
    44??}
    45??//與arrayCompareNumber相反方式比較大小,用于倒序使用
    46??function?arrayCompareNumberRev(array1,array2){
    47???if?(parseInt(array1[indexCol])?<?parseInt(array2[indexCol]))
    48????return?1;
    49???if?(parseInt(array1[indexCol])?>?parseInt(array2[indexCol]))
    50????return?-1;
    51??
    52???return?0;
    53??}
    54??
    55??//define?a?2-dimension?array
    56??function?BiArray(rows,cols){
    57??
    58???//simulate?multidimension?array
    59???this.rows?=?rows;
    60???this.cols?=?cols;
    61??
    62???//construct?array
    63???var?lines?=?new?Array(rows);
    64???for(var?i?=?0;i?<?lines.length;?i++){
    65????lines[i]?=?new?Array(cols);
    66???}

    ?
    posted @ 2007-07-23 16:20 javaGrowing 閱讀(440) | 評論 (0)編輯 收藏

    function toHtml(strBody,cset)
    {
    ?var Rec=new ActiveXObject("ADODB.RecordSet");
    ?Rec.Fields.Append("DDD",201,1);
    ?Rec.Open();
    ?Rec.AddNew();

    ?Rec(0).AppendChunk(strBody);

    ?Rec.Update();
    ?var HTML=Rec(0).Value;
    ?Rec.Close();
    ?delete Rec;
    ?document.charset=cset;
    ?return(HTML);
    }

    posted @ 2007-05-26 01:07 javaGrowing 閱讀(1004) | 評論 (0)編輯 收藏

    出處:http://www.smallrain.net/study_show.asp?id=703

    <div id="Error"></div>
    <div id="State"></div>
    <div id="DownloadEnd"></div>
    <Script Language="JavaScript">
    <!--
    // more javascript from http://www.smallrain.net

    function Ajax(OnError,OnState,OnDownloadEnd)
    {
    ?// 錯誤字符串
    ?this.ErrorStr ??= null;
    ?// 錯誤事件驅(qū)動,當發(fā)生錯誤時觸發(fā)
    ?this.OnError ??= OnError;
    ?// 狀態(tài)事件驅(qū)動,當狀態(tài)改變時觸發(fā)
    ?this.OnState ??= OnState;
    ?// 完成事件驅(qū)動,當類操作完成時觸發(fā)
    ?this.OnDownloadEnd ?= OnDownloadEnd;

    ?// XMLHTTP 發(fā)送數(shù)據(jù)類型 GET 或 POST
    ?this.method??= "GET";
    ?// 將要獲取的URL地址
    ?this.URL??= null;
    ?// 指定同步或異步讀取方式(true 為異步,false 為同步)
    ?this.sync??= true;
    ?// 當method 為 POST 時 所要發(fā)送的數(shù)據(jù)
    ?this.PostData??= null
    ?// 返回讀取完成后的數(shù)據(jù)
    ?this.RetData ??= null;

    ?// 創(chuàng)建XMLHTTP對像
    ?this.HttpObj ??= this.createXMLHttpRequest();
    ?if(this.HttpObj == null)
    ?{
    ??// 對像創(chuàng)建失敗時中止運行
    ??return;
    ?}

    ?var Obj = this;
    ?// 調(diào)用事件檢測
    ?this.HttpObj.onreadystatechange = function()
    ?{
    ??Ajax.handleStateChange(Obj);
    ?}
    }

    // UTF 轉(zhuǎn)入 GB (by:Rimifon)
    Ajax.prototype.UTFTOGB = function(strBody)
    {
    ?var Rec=new ActiveXObject("ADODB.RecordSet");
    ?Rec.Fields.Append("DDD",201,1);
    ?Rec.Open();
    ?Rec.AddNew();
    ?Rec(0).AppendChunk(strBody);
    ?Rec.Update();
    ?var HTML=Rec(0).Value;
    ?Rec.Close();
    ?delete Rec;
    ?return(HTML);
    }

    // 創(chuàng)建XMLHTTP對像
    Ajax.prototype.createXMLHttpRequest = function()
    {
    ?if (window.XMLHttpRequest)
    ?{
    ??//Mozilla 瀏覽器
    ??return new XMLHttpRequest();
    ?}
    ?else if (window.ActiveXObject)
    ?{
    ??????? ?var msxmls = new Array('Msxml2.XMLHTTP.5.0','Msxml2.XMLHTTP.4.0','Msxml2.XMLHTTP.3.0','Msxml2.XMLHTTP','Microsoft.XMLHTTP');
    ??????? ?for (var i = 0; i < msxmls.length; i++)
    ??????? ?{
    ??????????????? ?try
    ??????????????? ?{
    ??????????????????????? ?return new ActiveXObject(msxmls[i]);
    ??????????????? ?}catch (e){}

    ??}
    ?}
    ?this.ErrorStr = "你的瀏覽器不支持XMLHttpRequest對象."
    ?if(this.OnError)
    ?{
    ??this.OnError(this.ErrorStr);
    ?}
    ??? ?return null;
    }

    // 發(fā)送HTTP請求
    Ajax.prototype.send = function()
    {

    ?if (this.HttpObj !== null)
    ?{
    ??this.URL = this.URL + "?t=" + new Date().getTime();
    ??this.HttpObj.open(this.method, this.URL, this.sync);
    ??if(this.method.toLocaleUpperCase() == "GET")
    ??{
    ???this.HttpObj.send(null);
    ??}
    ??else if(this.method.toLocaleUpperCase() == "POST")
    ??{
    ???this.HttpObj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    ???this.HttpObj.send(this.PostData);
    ??}
    ??else
    ??{
    ???this.ErrorStr = "錯誤的[method]命令."
    ???if(this.OnError)
    ???{
    ????this.OnError(this.ErrorStr);
    ???}
    ???return;
    ??}

    ??if (this.HttpObj.readyState == 4)
    ??{
    ???// 判斷對象狀態(tài)
    ??????????? ??if (this.HttpObj.status == 200)
    ??????????????? ?{
    ????this.RetData = this.UTFTOGB(this.HttpObj.responseBody);
    ????if(this.OnDownloadEnd)
    ????{
    ?????this.OnDownloadEnd(this.RetData);
    ????}
    ??????????????????????? ?return;
    ??????????????? ?}
    ???else
    ???{
    ????this.ErrorStr = "您所請求的頁面有異常."
    ????if(this.OnError)
    ????{
    ?????this.OnError(this.ErrorStr);
    ????}
    ????return;
    ???}
    ??}

    ?}

    }

    // 事件檢測
    Ajax.handleStateChange = function(Obj)
    {
    ?if(Obj.OnState)
    ?{
    ??Obj.OnState(Obj.HttpObj.readyState);
    ?}

    ?if (Obj.HttpObj.readyState == 4)
    ?{
    ??// 判斷對象狀態(tài)
    ??????????? ?if (Obj.HttpObj.status == 200)
    ??????????????? {
    ???Obj.RetData = Obj.UTFTOGB(Obj.HttpObj.responseBody);
    ???if(Obj.OnDownloadEnd)
    ???{
    ????Obj.OnDownloadEnd(Obj.RetData);
    ???}
    ??????????????????????? return;
    ??????????????? }
    ??else
    ??{
    ???Obj.ErrorStr = "您所請求的頁面有異常."
    ???if(Obj.OnError)
    ???{
    ????Obj.OnError(Obj.ErrorStr);
    ???}
    ???return;
    ??}
    ?}
    }


    // 錯誤回調(diào)事件函數(shù)
    function EventError(strValue)
    {
    ?document.getElementById("Error").innerHTML = strValue;
    }

    // 狀態(tài)回調(diào)事件函數(shù)
    function EventState(strValue)
    {
    ?var strState = null;
    ?switch (strValue)
    ?{
    ?? ??case 0:
    ??strState = "未初始化...";
    ??break;

    ?? ??case 1:
    ??strState = "開始讀取數(shù)據(jù)...";
    ??break;

    ?? ??case 2:
    ??strState = "讀取數(shù)據(jù)...";
    ??break;

    ?? ??case 3:
    ??strState = "讀取數(shù)據(jù)中...";
    ??break;

    ?? ??case 4:
    ??strState = "讀取完成...";
    ??break;

    ?? ??default:
    ??strState = "未初始化...";
    ??break;
    ?}
    ?document.getElementById("State").innerHTML = strState;
    }

    // 完成回調(diào)事件函數(shù)
    function EventDownloadEnd(strValue)
    {
    ?document.getElementById("DownloadEnd").innerHTML = strValue;
    }


    // 初始化Ajax對像,引入事件回調(diào)函數(shù)
    var A1 = new Ajax(EventError,EventState,EventDownloadEnd);
    // 指定method數(shù)據(jù)發(fā)送類型
    A1.method = "GET";
    // 指定URL地址
    A1.URL = "// 指定為異步處理
    A1.sync = true;
    //發(fā)送請求
    A1.send();
    //-->
    </Script>?

    posted @ 2007-05-26 00:37 javaGrowing 閱讀(654) | 評論 (0)編輯 收藏

    ajax代理程序自動判斷字符編碼

    作者:llinzzi 時間: 2006-03-16 文檔類型:原創(chuàng) 來自:藍色理想
    瀏覽統(tǒng)計 total:6402 | year:1609 | Quarter:376 | Month:132 | Week:26 | today:2

    由于ajax在跨域的訪問上有問題,目前最好的方法是做代理.寫了個代理程序和心得.

    為了做ajax的代理,研究了下服務器端的xmlhttp并和客戶端的ajax中的xmlhttp做了個比較,后臺代碼是asp的.

    服務器端的xmlhttp也就是asp小偷程序,我把代碼改成了javascript.

    1.在服務器端的xmlhttp.Open("GET",url,false)異步必須是關閉的,而客戶端的異步是打開的,這個很好理解.
    2.在服務器端的xmlhttp.Responsebody 這里用的是Responsebody而不是ResponseText或ResponseXml,一開始我是用ResponseText,但在函數(shù)bytesToBSTR轉(zhuǎn)換編碼的時候提示錯誤,經(jīng)過比較發(fā)現(xiàn)其他的asp小偷程序里的代碼都是Responsebody,分析后,發(fā)現(xiàn)body返回來的是二進制數(shù)據(jù)而不是像ResponseText或ResponseXml那樣返回字符或dom對象.

    ajax的asp代理函數(shù)介紹:
    send_request(url) ,url為地址

    服務器端代碼如下帶自動判斷所有字符編碼,已測試 日語 韓語 繁體:

    <%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

    "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>XMLHTTP</title>
    </head>
    <%

    ?

    Server.ScriptTimeout=9999999;
    function send_request(url) {
    ?var codedtext;
    ?http_request = Server.CreateObject("Microsoft.XMLHTTP");
    ?http_request.Open("GET",url,false);
    ?http_request.Send(null);
    ?if (http_request.ReadyState == 4){
    ??//自動判斷編碼開始
    ??var charresult = http_request.ResponseText.match(/CharSet=(\S+)\">/i);
    ??if (charresult != null){
    ??var Cset = charresult[1];
    ??}else{Cset = "gb2312"}//對獲取不到的網(wǎng)站采用gb2312編碼,可自行更改
    ??
    //自動判斷編碼結(jié)束
    ??codedtext = bytesToBSTR(http_request.Responsebody,Cset);
    ??}else{
    ??codedtext = "Erro";
    ??}
    ?return(codedtext);
    }

    function bytesToBSTR(body,Cset){
    var objstream;
    objstream = Server.CreateObject("Adodb.Stream");
    objstream.Type = 1;
    objstream.Mode = 3;
    objstream.Open();
    objstream.Write(body);
    objstream.Position = 0;
    objstream.Type = 2;
    objstream.Charset = Cset;
    bytesToBSTR = objstream.Readtext;
    objstream.Close;
    return(bytesToBSTR);
    }

    %>
    <body>
    <% Response.Write(send_request("http://www.daum.net")) %>
    </body>
    </html>

    posted @ 2007-05-26 00:31 javaGrowing 閱讀(433) | 評論 (0)編輯 收藏

    一. Input和Output
    1. stream代表的是任何有能力產(chǎn)出數(shù)據(jù)的數(shù)據(jù)源,或是任何有能力接收數(shù)據(jù)的接收源。在Java的IO中,所有的stream(包括Input和Out stream)都包括兩種類型:
    1.1 以字節(jié)為導向的stream
    以字節(jié)為導向的stream,表示以字節(jié)為單位從stream中讀取或往stream中寫入信息。以字節(jié)為導向的stream包括下面幾種類型:
    1) input stream:
    1) ByteArrayInputStream:把內(nèi)存中的一個緩沖區(qū)作為InputStream使用
    2) StringBufferInputStream:把一個String對象作為InputStream
    3) FileInputStream:把一個文件作為InputStream,實現(xiàn)對文件的讀取操作
    4) PipedInputStream:實現(xiàn)了pipe的概念,主要在線程中使用
    5) SequenceInputStream:把多個InputStream合并為一個InputStream
    2) Out stream
    1) ByteArrayOutputStream:把信息存入內(nèi)存中的一個緩沖區(qū)中
    2) FileOutputStream:把信息存入文件中
    3) PipedOutputStream:實現(xiàn)了pipe的概念,主要在線程中使用
    4) SequenceOutputStream:把多個OutStream合并為一個OutStream
    1.2 以Unicode字符為導向的stream
    以Unicode字符為導向的stream,表示以Unicode字符為單位從stream中讀取或往stream中寫入信息。以Unicode字符為導向的stream包括下面幾種類型:
    1) Input Stream
    1) CharArrayReader:與ByteArrayInputStream對應
    2) StringReader:與StringBufferInputStream對應
    3) FileReader:與FileInputStream對應
    4) PipedReader:與PipedInputStream對應
    2) Out Stream
    1) CharArrayWrite:與ByteArrayOutputStream對應
    2) StringWrite:無與之對應的以字節(jié)為導向的stream
    3) FileWrite:與FileOutputStream對應
    4) PipedWrite:與PipedOutputStream對應
    以字符為導向的stream基本上對有與之相對應的以字節(jié)為導向的stream。兩個對應類實現(xiàn)的功能相同,字是在操作時的導向不同。如CharArrayReader:和ByteArrayInputStream的作用都是把內(nèi)存中的一個緩沖區(qū)作為InputStream使用,所不同的是前者每次從內(nèi)存中讀取一個字節(jié)的信息,而后者每次從內(nèi)存中讀取一個字符。
    1.3 兩種不現(xiàn)導向的stream之間的轉(zhuǎn)換
    InputStreamReader和OutputStreamReader:把一個以字節(jié)為導向的stream轉(zhuǎn)換成一個以字符為導向的stream。
    2. stream添加屬性
    2.1 “為stream添加屬性”的作用
    運用上面介紹的Java中操作IO的API,我們就可完成我們想完成的任何操作了。但通過FilterInputStream和FilterOutStream的子類,我們可以為stream添加屬性。下面以一個例子來說明這種功能的作用。
    如果我們要往一個文件中寫入數(shù)據(jù),我們可以這樣操作:
    FileOutStream fs = new FileOutStream(“test.txt”);
    然后就可以通過產(chǎn)生的fs對象調(diào)用write()函數(shù)來往test.txt文件中寫入數(shù)據(jù)了。但是,如果我們想實現(xiàn)“先把要寫入文件的數(shù)據(jù)先緩存到內(nèi)存中,再把緩存中的數(shù)據(jù)寫入文件中”的功能時,上面的API就沒有一個能滿足我們的需求了。但是通過FilterInputStream和FilterOutStream的子類,為FileOutStream添加我們所需要的功能。
    2.2 FilterInputStream的各種類型
    2.2.1 用于封裝以字節(jié)為導向的InputStream
    1) DataInputStream:從stream中讀取基本類型(int、char等)數(shù)據(jù)。
    2) BufferedInputStream:使用緩沖區(qū)
    3) LineNumberInputStream:會記錄input stream內(nèi)的行數(shù),然后可以調(diào)用getLineNumber()和setLineNumber(int)
    4) PushbackInputStream:很少用到,一般用于編譯器開發(fā)
    2.2.2 用于封裝以字符為導向的InputStream
    1) 沒有與DataInputStream對應的類。除非在要使用readLine()時改用BufferedReader,否則使用DataInputStream
    2) BufferedReader:與BufferedInputStream對應
    3) LineNumberReader:與LineNumberInputStream對應
    4) PushBackReader:與PushbackInputStream對應
    2.3 FilterOutStream的各種類型
    2.2.3 用于封裝以字節(jié)為導向的OutputStream
    1) DataIOutStream:往stream中輸出基本類型(int、char等)數(shù)據(jù)。
    2) BufferedOutStream:使用緩沖區(qū)
    3) PrintStream:產(chǎn)生格式化輸出
    2.2.4 用于封裝以字符為導向的OutputStream
    1) BufferedWrite:與對應
    2) PrintWrite:與對應
    3. RandomAccessFile
    1) 可通過RandomAccessFile對象完成對文件的讀寫操作
    2) 在產(chǎn)生一個對象時,可指明要打開的文件的性質(zhì):r,只讀;w,只寫;rw可讀寫
    3) 可以直接跳到文件中指定的位置
    4. I/O應用的一個例子
    import java.io.*;
    public class TestIO{
    public static void main(String[] args)
    throws IOException{
    //1.以行為單位從一個文件讀取數(shù)據(jù)
    BufferedReader in =
    new BufferedReader(
    new FileReader("F:\\nepalon\\TestIO.java"));
    String s, s2 = new String();
    while((s = in.readLine()) != null)
    s2 += s + "\n";
    in.close();

    //1b. 接收鍵盤的輸入
    BufferedReader stdin =
    new BufferedReader(
    new InputStreamReader(System.in));
    System.out.println("Enter a line:");
    System.out.println(stdin.readLine());

    //2. 從一個String對象中讀取數(shù)據(jù)
    StringReader in2 = new StringReader(s2);
    int c;
    while((c = in2.read()) != -1)
    System.out.println((char)c);
    in2.close();

    //3. 從內(nèi)存取出格式化輸入
    try{
    DataInputStream in3 =
    new DataInputStream(
    new ByteArrayInputStream(s2.getBytes()));
    while(true)
    System.out.println((char)in3.readByte());
    }
    catch(EOFException e){
    System.out.println("End of stream");
    }

    //4. 輸出到文件
    try{
    BufferedReader in4 =
    new BufferedReader(
    new StringReader(s2));
    PrintWriter out1 =
    new PrintWriter(
    new BufferedWriter(
    new FileWriter("F:\\nepalon\\ TestIO.out")));
    int lineCount = 1;
    while((s = in4.readLine()) != null)
    out1.println(lineCount++ + ":" + s);
    out1.close();
    in4.close();
    }
    catch(EOFException ex){
    System.out.println("End of stream");
    }

    //5. 數(shù)據(jù)的存儲和恢復
    try{
    DataOutputStream out2 =
    new DataOutputStream(
    new BufferedOutputStream(
    new FileOutputStream("F:\\nepalon\\ Data.txt")));
    out2.writeDouble(3.1415926);
    out2.writeChars("\nThas was pi:writeChars\n");
    out2.writeBytes("Thas was pi:writeByte\n");
    out2.close();
    DataInputStream in5 =
    new DataInputStream(
    new BufferedInputStream(
    new FileInputStream("F:\\nepalon\\ Data.txt")));
    BufferedReader in5br =
    new BufferedReader(
    new InputStreamReader(in5));
    System.out.println(in5.readDouble());
    System.out.println(in5br.readLine());
    System.out.println(in5br.readLine());
    }
    catch(EOFException e){
    System.out.println("End of stream");
    }

    //6. 通過RandomAccessFile操作文件
    RandomAccessFile rf =
    new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");
    for(int i=0; i<10; i++)
    rf.writeDouble(i*1.414);
    rf.close();

    rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");
    for(int i=0; i<10; i++)
    System.out.println("Value " + i + ":" + rf.readDouble());
    rf.close();

    rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");
    rf.seek(5*8);
    rf.writeDouble(47.0001);
    rf.close();

    rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");
    for(int i=0; i<10; i++)
    System.out.println("Value " + i + ":" + rf.readDouble());
    rf.close();
    }
    }
    關于代碼的解釋(以區(qū)為單位):
    1區(qū)中,當讀取文件時,先把文件內(nèi)容讀到緩存中,當調(diào)用in.readLine()時,再從緩存中以字符的方式讀取數(shù)據(jù)(以下簡稱“緩存字節(jié)讀取方式”)。
    1b區(qū)中,由于想以緩存字節(jié)讀取方式從標準IO(鍵盤)中讀取數(shù)據(jù),所以要先把標準IO(System.in)轉(zhuǎn)換成字符導向的stream,再進行BufferedReader封裝。
    2區(qū)中,要以字符的形式從一個String對象中讀取數(shù)據(jù),所以要產(chǎn)生一個StringReader類型的stream。
    4區(qū)中,對String對象s2讀取數(shù)據(jù)時,先把對象中的數(shù)據(jù)存入緩存中,再從緩沖中進行讀取;對TestIO.out文件進行操作時,先把格式化后的信息輸出到緩存中,再把緩存中的信息輸出到文件中。
    5區(qū)中,對Data.txt文件進行輸出時,是先把基本類型的數(shù)據(jù)輸出屋緩存中,再把緩存中的數(shù)據(jù)輸出到文件中;對文件進行讀取操作時,先把文件中的數(shù)據(jù)讀取到緩存中,再從緩存中以基本類型的形式進行讀取。注意in5.readDouble()這一行。因為寫入第一個writeDouble(),所以為了正確顯示。也要以基本類型的形式進行讀取。
    6區(qū)是通過RandomAccessFile類對文件進行操作。

    posted @ 2007-05-19 20:11 javaGrowing 閱讀(334) | 評論 (0)編輯 收藏

    僅列出標題
    共19頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
    主站蜘蛛池模板: 亚洲精品V天堂中文字幕| 一级一级毛片免费播放| 免费无遮挡无码视频网站| 成人免费网站视频www| 亚洲AV日韩AV天堂一区二区三区| 日韩国产免费一区二区三区| 蜜桃传媒一区二区亚洲AV| 国产亚洲精品岁国产微拍精品| 无码人妻一区二区三区免费手机 | 亚洲va中文字幕无码| 久久国产精品一区免费下载| 国产成人精品亚洲2020| 在线亚洲97se亚洲综合在线| 国产高清免费视频| 一级做性色a爰片久久毛片免费| 亚洲毛片免费观看| 亚洲国产91精品无码专区| 亚洲网站免费观看| av网站免费线看| 亚洲狠狠成人综合网| 好看的亚洲黄色经典| 国产gav成人免费播放视频| 91精品国产免费| 一级做a爰片久久毛片免费陪| 97久久国产亚洲精品超碰热| 亚洲精品无码MV在线观看 | 亚洲国产主播精品极品网红 | 久久久无码精品亚洲日韩软件| 7x7x7x免费在线观看| 国产大片免费天天看| 亚洲人成网站18禁止| 激情综合亚洲色婷婷五月APP| 亚洲欧洲自拍拍偷精品 美利坚 | 精品视频一区二区三区免费| 欧美日韩亚洲精品| 亚洲 日韩经典 中文字幕 | 黄色一级视频免费观看| 亚洲欧美第一成人网站7777| 亚洲精品在线网站| 婷婷久久久亚洲欧洲日产国码AV| 亚洲天堂在线视频|