青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

奇奇的空間

奇奇的空間
posts - 5, comments - 13, trackbacks - 0, articles - 23

Java的輸入輸出流

Posted on 2006-05-08 16:52 奇奇 閱讀(225) 評論(0)  編輯 收藏 引用 所屬分類: JAVA

Java語言的輸入輸出功能是十分強大而靈活的,美中不足的是看上去輸入輸出的代碼并不是很簡潔,因為你往往需要包裝許多不同的對象。在Java類庫中,IO部分的內容是很龐大的,因為它涉及的領域很廣泛:標準輸入輸出,文件的操作,網絡上的數據流,字符串流,對象流,zip文件流....本文的目的是為大家做一個簡要的介紹。

  流是一個很形象的概念,當程序需要讀取數據的時候,就會開啟一個通向數據源的流,這個數據源可以是文件,內存,或是網絡連接。類似的,當程序需要寫入數據的時候,就會開啟一個通向目的地的流。這時候你就可以想象數據好像在這其中“流”動一樣,如下圖:


  Java中的流分為兩種,一種是字節流,另一種是字符流,分別由四個抽象類來表示(每種流包括輸入和輸出兩種所以一共四個):InputStream,OutputStream,Reader,Writer。Java中其他多種多樣變化的流均是由它們派生出來的:



  在這其中InputStream和OutputStream在早期的Java版本中就已經存在了,它們是基于字節流的,而基于字符流的Reader和Writer是后來加入作為補充的。以上的層次圖是Java類庫中的一個基本的層次體系。

  在這四個抽象類中,InputStream和Reader定義了完全相同的接口:

int read()
int read(char cbuf[])
int read(char cbuf[], int offset, int length)

  而OutputStream和Writer也是如此:

int write(int c)
int write(char cbuf[])
int write(char cbuf[], int offset, int length)

  這六個方法都是最基本的,read()和write()通過方法的重載來讀寫一個字節,或者一個字節數組。

  更多靈活多變的功能是由它們的子類來擴充完成的。知道了Java輸入輸出的基本層次結構以后,本文在這里想給大家一些以后可以反復應用例子,對于所有子類的細節及其功能并不詳細討論。

import java.io.*;

    public class IOStreamDemo {

    ??????public void samples() throws IOException {

    ???????????//1. 這是從鍵盤讀入一行數據,返回的是一個字符串
    ???????????BufferedReader stdin =new BufferedReader(new InputStreamReader(System.in));
    ???????????System.out.print("Enter a line:");
    ???????????System.out.println(stdin.readLine());

    ???????????//2. 這是從文件中逐行讀入數據

    ???????????BufferedReader in = new BufferedReader(new FileReader("IOStreamDemo.java"));
    ???????????String s, s2 = new String();
    ???????????while((s = in.readLine())!= null
    ??????????????????????s2 += s + "\n"
    ???????????in.close();

    ???????????//3. 這是從一個字符串中逐個讀入字節
    ???????????StringReader in1 = new StringReader(s2);
    ???????????int c;
    ???????????while((c = in1.read()) != -1)
    ??????????????????????System.out.print((char)c);

    ???????????//4. 這是將一個字符串寫入文件
    ???????????try {
    ??????????????????????BufferedReader in2 = new BufferedReader(new StringReader(s2));
    ??????????????????????PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out")));
    ??????????????????????int lineCount = 1;
    ??????????????????????while((s = in2.readLine()) != null
    ?????????????????????????????????out1.println(lineCount++ + ": " + s);
    ??????????????????????out1.close();
    ???????????} catch(EOFException e) {
    ??????????????????????System.err.println("End of stream");
    ???????????}
    ??????}

    }

  對于上面的例子,需要說明的有以下幾點:

  1. BufferedReaderReader的一個子類,它具有緩沖的作用,避免了頻繁的從物理設備中讀取信息。它有以下兩個構造函數:

BufferedReader Reader in)
BufferedReaderReader in, int sz)

  這里的sz是指定緩沖區的大小。

  它的基本方法:

void close(//關閉流

???????????void mark(int readAheadLimit) //標記當前位置

???????????boolean markSupported() //是否支持標記

???????????int read() //繼承自Reader的基本方法

???????????int read(char[] cbuf, int off,int len) //繼承自Reader的基本方法

???????????String readLine() //讀取一行內容并以字符串形式返回

???????????boolean ready() //判斷流是否已經做好讀入的準備

???????????void reset() //重設到最近的一個標記

???????????long skip(long n) //跳過指定個數的字符讀取

  2. InputStreamReaderInputStreamReader之間的橋梁,由于System.in是字節流,需要用它來包裝之后變為字符流供給 ????????????BufferedReader使用。

  3. PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out")));

  這句話體現了Java輸入輸出系統的一個特點,為了達到某個目的,需要包裝好幾層。首先,輸出目的地是文件IODemo.out,所以最內層包裝的是FileWriter,建立一個輸出文件流,接下來,我們希望這個流是緩沖的,所以用BufferedWriter來包裝它以達到目的,最后,我們需要格式化輸出結果,于是將PrintWriter包在最外層。

  Java提供了這樣一個功能,將標準的輸入輸出流轉向,也就是說,我們可以將某個其他的流設為標準輸入或輸出流,看下面這個例子:

import java.io.*;

public class Redirecting {

???????public static void
main(String[] args) throws IOException {
??????????????PrintStream console = System.out;
??????????????BufferedInputStream in = newBufferedInputStreamnew FileInputStream"Redirecting.java"));
??????????????PrintStream out = newPrintStream( new BufferedOutputStream new FileOutputStream"test.out")));
??????????????System.setIn(in);
??????????????System.setOut(out);

??????????????BufferedReader br = newBufferedReadernewInputStreamReader(System.in));
??????????????String s;
??????????????while((s = br.readLine()) != null
?????????????????????System.out.println(s);
??????????????out.close();
??????????????System.setOut(console);
??????}
}

  在這里java.lang.System的靜態方法

static void setIn(InputStream in)
static void setOut(PrintStream out)

  提供了重新定義標準輸入輸出流的方法,這樣做是很方便的,比如一個程序的結果有很多,有時候甚至要翻頁顯示,這樣不便于觀看結果,這是你就可以將標準輸出流定義為一個文件流,程序運行完之后打開相應的文件觀看結果,就直觀了許多。

  Java流有著另一個重要的用途,那就是利用對象流對對象進行序列化。下面將開始介紹這方面的問題。

  在一個程序運行的時候,其中的變量數據是保存在內存中的,一旦程序結束這些數據將不會被保存,一種解決的辦法是將數據寫入文件,而Java中提供了一種機制,它可以將程序中的對象寫入文件,之后再從文件中把對象讀出來重新建立。這就是所謂的對象序列化Java中引入它主要是為了RMI(Remote Method Invocation)和Java Bean所用,不過在平時應用中,它也是很有用的一種技術。

  所有需要實現對象序列化的對象必須首先實現Serializable接口。下面看一個例子:

import java.io.*;
import java.util.*;

public class Logon implements Serializable {

???????private Date date = new Date();
???????private String username;
???????private transient String password;


???????Logon(Stringname, String pwd) {
??????????????username = name;
??????????????password = pwd;
???????}


???????public String toString() {
??????????????String pwd = (password == null) ? "(n/a)" : password;
??????????????return "logon info: \n " + "username: " + username + "\n date: " + date + "\n password: " + pwd;
???????}


???????public static void
main(String[] args) throws IOException, ClassNotFoundException {
??????????????Logon a = new Logon("Morgan", "morgan83");
??????????????System.out.println( "logon a = " + a);
??????????????ObjectOutputStream o = newObjectOutputStreamnewFileOutputStream"Logon.out"));
??????????????o.writeObject(a);
??????????????o.close();

??????????????int seconds = 5;
??????????????long t = System.currentTimeMillis()?+ seconds * 1000;
??????????????whileSystem.currentTimeMillis() < t) ;

??????????????ObjectInputStream in = new ObjectInputStreamnewFileInputStream"Logon.out"));
??????????????System.out.println( "Recovering object at " + new Date());
??????????????a = (Logon)in.readObject();
??????????????System.out.println("logon a = " + a);
???????}
}

  類Logon是一個記錄登錄信息的類,包括用戶名和密碼。首先它實現了接口Serializable,這就標志著它可以被序列化。之后再main方法里ObjectOutputStream o = newObjectOutputStreamnewFileOutputStream"Logon.out"));新建一個對象輸出流包裝一個文件流,表示對象序列化的目的地是文件Logon.out。然后用方法writeObject開始寫入。想要還原的時候也很簡單ObjectInputStream in = newObjectInputStreamnewFileInputStream"Logon.out"));新建一個對象輸入流以文件流Logon.out為參數,之后調用readObject方法就可以了。

  需要說明一點,對象序列化有一個神奇之處就是,它建立了一張對象網,將當前要序列化的對象中所持有的引用指向的對象都包含起來一起寫入到文件,更為奇妙的是,如果你一次序列化了好幾個對象,它們中相同的內容將會被共享寫入。這的確是一個非常好的機制。它可以用來實現深層拷貝。

  關鍵字transient在這里表示當前內容將不被序列化,比如例子中的密碼,需要保密,所以沒有被寫入文

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区二区在线视频| 欧美日一区二区在线观看| 欧美激情一区二区三区成人| 免费成人网www| 欧美成va人片在线观看| 欧美激情亚洲一区| 亚洲精品黄色| 亚洲男人的天堂在线| 亚洲免费影视第一页| 久久国产精品亚洲va麻豆| 久久深夜福利免费观看| 欧美精品乱人伦久久久久久| 国产精品日本精品| 亚洲承认在线| 亚洲综合国产激情另类一区| 久久久亚洲国产美女国产盗摄| 亚洲第一精品在线| 亚洲午夜精品国产| 蜜桃av噜噜一区二区三区| 欧美三级在线| 国产一区 二区 三区一级| 亚洲国产一区二区在线| 亚洲自拍16p| 欧美高潮视频| 午夜精品婷婷| 欧美日韩成人在线视频| 国产综合色产| 亚洲一区二区三区在线视频| 久久久久久久综合狠狠综合| 亚洲欧洲三级| 久久人人97超碰人人澡爱香蕉| 欧美日韩中文字幕在线视频| 在线精品高清中文字幕| 欧美在线二区| 亚洲毛片一区二区| 久久人体大胆视频| 国产亚洲一区在线| 亚洲欧美精品一区| 欧美在线视频在线播放完整版免费观看 | 欧美日韩成人网| 精品电影一区| 午夜电影亚洲| 亚洲精品无人区| 你懂的国产精品| 雨宫琴音一区二区在线| 欧美一级欧美一级在线播放| 亚洲精品视频在线播放| 另类图片综合电影| 有码中文亚洲精品| 欧美一区二区视频网站| 一个色综合av| 欧美日韩网址| 一本久道久久综合中文字幕 | 午夜天堂精品久久久久| 国产精品盗摄久久久| 一区二区国产在线观看| 亚洲娇小video精品| 久久一二三四| 亚洲国产三级| 欧美激情视频一区二区三区不卡| 欧美一区二区视频在线观看| 国产精品入口尤物| 午夜在线一区| 欧美一区二区三区免费观看视频 | 亚洲高清网站| 欧美黄色日本| 欧美精品999| 在线视频免费在线观看一区二区| 91久久黄色| 欧美三级电影一区| 欧美一区二区三区在线视频| 午夜欧美不卡精品aaaaa| 国产欧美在线观看| 久久亚洲综合网| 久久综合给合| 在线欧美日韩精品| 亚洲国产精品久久久| 欧美日韩一区二区精品| 亚洲欧美另类综合偷拍| 午夜久久99| 136国产福利精品导航| 亚洲黄网站黄| 国产精品视频内| 久久综合中文字幕| 欧美激情在线播放| 午夜在线视频观看日韩17c| 久久大香伊蕉在人线观看热2| 在线看国产日韩| 欧美成人激情视频免费观看| 久久久久高清| 久久高清免费观看| 国产日韩亚洲欧美| 狂野欧美激情性xxxx欧美| 亚洲美女啪啪| 91久久线看在观草草青青| 欧美日韩一卡二卡| 欧美国产一区在线| 亚洲午夜久久久久久尤物 | 国产日韩一区二区三区在线| 欧美在线黄色| 亚洲综合色在线| 亚洲激情视频在线播放| 欧美一区二区成人6969| 亚洲高清免费在线| 在线性视频日韩欧美| 黄色一区二区三区| 亚洲另类自拍| 永久免费毛片在线播放不卡| 日韩亚洲欧美中文三级| 影音先锋亚洲电影| av成人天堂| 亚洲激情视频在线| 久久精品91| 欧美在线啊v| 欧美日韩一区二区在线| 欧美电影打屁股sp| 国产一区二区三区电影在线观看| 亚洲人成在线播放| 影音先锋久久精品| 欧美一区二区三区视频在线观看| 亚洲一区二区三区在线| 宅男66日本亚洲欧美视频| 国产精品卡一卡二卡三| 欧美中在线观看| 欧美精品在线免费播放| 久久久久国色av免费观看性色| 欧美精品www在线观看| 欧美sm极限捆绑bd| 国模 一区 二区 三区| 亚洲无限乱码一二三四麻| 亚洲一区二区在线免费观看视频| 欧美国产在线观看| 最近中文字幕日韩精品| 国产亚洲综合在线| 午夜精品在线| 久久精品欧美日韩| 国产一区二区无遮挡| 亚洲伊人一本大道中文字幕| 亚洲综合国产精品| 国产精品亚洲人在线观看| 亚洲一区二区三区成人在线视频精品| 亚洲桃花岛网站| 欧美色一级片| 一本一本a久久| 欧美成人蜜桃| 永久免费视频成人| 久热国产精品视频| 亚洲国产99| 日韩亚洲国产欧美| 欧美午夜激情视频| 亚洲专区欧美专区| 久久久精品国产免大香伊 | 久久久亚洲精品一区二区三区 | 性色av一区二区三区| 国产精品资源| 久久精品国产久精国产爱| 欧美成人高清| 一片黄亚洲嫩模| 国产精品日韩欧美大师| 久久精品99久久香蕉国产色戒| 美日韩精品视频免费看| 亚洲精选在线| 国产精品v日韩精品| 久久av一区| 亚洲国产一二三| 欧美一级播放| 亚洲国产精品激情在线观看| 欧美日韩亚洲视频| 亚洲欧美日韩在线| 欧美国产精品| 欧美亚洲日本网站| 最新国产精品拍自在线播放| 国产精品人人爽人人做我的可爱| 久久精品亚洲国产奇米99| 欧美激情一区二区在线| 午夜精品理论片| 亚洲国产一区二区三区a毛片| 国产精品嫩草影院一区二区| 久久综合给合| 午夜精品久久久久久久99黑人| 麻豆久久婷婷| 亚洲欧美日韩综合国产aⅴ| 亚洲国产精品久久久久秋霞不卡 | 久久精品最新地址| 一本色道综合亚洲| 欧美国产日本韩| 欧美一区二区三区免费观看| 在线免费日韩片| 欧美日韩视频在线一区二区| 久久精品99无色码中文字幕| 一区二区三区高清在线观看| 欧美国产一区二区在线观看| 久久国产精品一区二区三区| 这里只有精品丝袜| **欧美日韩vr在线| 国内精品久久久久久| 国产欧美日韩免费| 国产精品一二一区| 国产精品成人一区二区三区吃奶| 欧美中文在线视频|