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

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

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

    afrag  
    記錄學(xué)習(xí)和成長的歷程
    日歷
    <2010年4月>
    28293031123
    45678910
    11121314151617
    18192021222324
    2526272829301
    2345678
    統(tǒng)計(jì)
    • 隨筆 - 9
    • 文章 - 5
    • 評論 - 2
    • 引用 - 0

    導(dǎo)航

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    文章檔案

    搜索

    •  

    積分與排名

    • 積分 - 10252
    • 排名 - 2373

    最新評論

    閱讀排行榜

    評論排行榜

     
    轉(zhuǎn)自 開發(fā)者的天空

    本文中我們來討論在NIO2中怎樣創(chuàng)建文件、讀取文件和寫文件。NIO2提供了多種創(chuàng)建 文件的方法,使得我們在創(chuàng)建文件的時候就可以指定文件的某些初始屬性。例如在支持POSIX的文件系統(tǒng)上指定文件的所有者,訪問權(quán)限等。關(guān)于文件的屬性, 請看上一篇文章Java SE 7新特性之文件操作(5) - 管理元數(shù)據(jù)
    創(chuàng)建文件
    可以調(diào)用createFile(FileAttribute<?>)方法創(chuàng)建一個空文件。該方法的參數(shù)就是文件的初始屬性。下面的例子是怎樣 在創(chuàng)建文件的時候賦予該文件某些權(quán)限的屬性:
    Path sourceFile = ;
    Path newFile 
    = ;
    PosixFileAttributes attrs 
    = Attributes.readPosixFileAttributes(sourceFile);
    FileAttribute
    <Set<PosixFilePermission>> attr =
              PosixFilePermissions.asFileAttribute(attrs.permissions());
    try {
        file.createFile(attr);
    catch (IOException x) {
        
    //unable to create the file
    }
    如 果在調(diào)用該方法的時候沒有傳入任何參數(shù),那么創(chuàng)建的文件將具有缺省的文件屬性。下面的代碼創(chuàng)建了一個具有缺省文件屬性的文件:
    Path file = ;
    try {
        file.createFile();   
    //Create the empty file with default permissions, etc.
    catch (FileAlreadyExists x) {
        System.err.format(
    "file named %s already exists%n", file);
    catch (IOException x) {
        
    //Some other sort of failure, such as permissions.
        System.err.format("createFile error: %s%n", x);
    }
    如 果要創(chuàng)建的文件已經(jīng)存在,該方法會拋出異常。
    注意在調(diào)用createFile方法時,檢查文件是否存在和創(chuàng)建具有特定的屬性的文件是在同一個原子操作中。
    還可以使用newOutputSteam方法來創(chuàng)建文件,在本文的后面我們會講到怎樣使用newOutputStream方法來創(chuàng)建文件。
    通過Stream I/O讀文件
    我們可以通過newInputStream(OpenOption...)方法打開和讀取文件。這個方法返回一個unbuffered輸入流(input stream),我們可以用它來從文件中讀取字節(jié)內(nèi)容。
    Path file = ;
    InputStream in 
    = null;
    try {
        in 
    = file.newInputStream();
        BufferedReader reader 
    = new BufferedReader(new InputStreamReader(in));
        String line 
    = null;
        
    while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
    catch (IOException x) {
        System.err.println(x);
    finally {
        
    if (in != null) in.close();
    }
    注 意該方法接受可變個數(shù)的參數(shù),參數(shù)類型為OpenOption,指定了文件怎樣打開。如果不傳入?yún)?shù),則使用默認(rèn)的READ方式打開。READ方式是所有 的實(shí)現(xiàn)都支持的方式。有一些實(shí)現(xiàn)也支持其他的打開方式。
    如果傳入的OpenOption或其組合不正確,會拋出異常。如果程序沒有讀權(quán)限或I/O錯誤,也會拋出異常。
    Creating and Writing a File by Using Stream I/O
    使用Stream I/O來創(chuàng)建和寫文件
    我們可以使用newOutputStream方法來創(chuàng)建文件、擴(kuò)展文件或覆蓋已有文件。這個方法為了寫文件而打開或創(chuàng)建文件,該方法返回一個 unbuffered的輸出流(output stream)。newOutputStream方法有兩種形式:

    • newOutputStream(OpenOption...)
    • newOutputStream(Set<? extends OpenOption>, FileAttribute<?>...)

    這兩種形式都接受一組OpenOption作為參數(shù),第二種形式還允許指定初始的文件屬性。這個方法支持的StandardOpenOption有:

    • WRITE –為了寫訪問而打開該文件.
    • APPEND – 將新數(shù)據(jù)擴(kuò)展在文件的末尾。該選項(xiàng)和WRITE或CREATE選項(xiàng)一起使用。
    • TRUNCATE_EXISTING – 將文件截?cái)酁?字節(jié)長. 該選項(xiàng)和WRITE選項(xiàng)一起使用來覆蓋原有文件。
    • CREATE_NEW – 創(chuàng)建一個新的文件。如果原來的文件存在這拋出異常。
    • CREATE – 如果原文件存在這打開它,否則創(chuàng)建新的文件。
    • DELETE_ON_CLOSE – 當(dāng)Stream關(guān)閉時刪除該文件。這個選項(xiàng)對臨時文件比較有用。
    • SPARSE – 表明新創(chuàng)建的文件是Sparse文件. 關(guān)于Sparse文件的具體信息請看http://space.itpub.net/8242091/viewspace-619756
    • SYNC – 保持該文件(包括內(nèi)容和元數(shù)據(jù))與底層存儲設(shè)備同步。
    • DSYNC – 保持文件內(nèi)容與底層存儲設(shè)備同步。

    如果沒有指定OpenOption,該方法的行為是:如果文件不存在,則創(chuàng)建新文件;如果文件存在,那么截?cái)嗨R簿褪钦f缺省的選擇是CREATE和 TRUNCATE_EXISTING選項(xiàng)的組合。
    下面的代碼打開一個日志文件,如果文件不存在,則創(chuàng)建一個新文件。如果文件 存在,這將新的內(nèi)容擴(kuò)展到文件尾部。
    import static java.nio.file.StandardOpenOption.*;

    Path logfile 
    = ;

    //Convert the string to a byte array.
    String s = ;
    byte data[] = s.getBytes();

    OutputStream out 
    = null;
    try {
        out 
    = new BufferedOutputStream(logfile.newOutputStream(CREATE, APPEND));
        
        out.write(data, 
    0, data.length);
    catch (IOException x) {
        System.err.println(x);
    finally {
        
    if (out != null) {
            out.flush();
            out.close();
        }
    }

    使用Channel I/O來讀寫文件
    Stream I/O每次讀取一個字符,Channel I/O每次讀取一個緩沖塊的數(shù)據(jù)。ByteChannel接口提供了基本的讀寫功能。SeekableByteChannel擴(kuò)展了 ByteChannel并提供了維護(hù)一個channel中的位置并改變該位置的能力。SeekableByteChannel還支持截?cái)辔募筒樵兾募? 小的功能。
    移動到文件中不同的位置,從該位置開始讀或?qū)懙哪芰κ刮覀兛梢?span onclick="tagshow(event)" class="t_tag">隨機(jī)訪問文件。有兩種形式的 newByteChannel方法可以用來讀或?qū)懳募@兩種形式和newOutputStream方法一樣。

    • newByteChannel(OpenOption...)
    • newByteChannel(Set<? extends OpenOption>, FileAttribute<?>...)

    這兩個方法都允許指定OpenOption,newOutputStream所支持的選擇這里也支持,而且這里還支持另外一個選項(xiàng)READ,因?yàn)? SeekableByteChannel既支持讀也支持寫。
    如果選項(xiàng)是READ,那么該channel就是為了讀訪問打開。如果選項(xiàng)是WRITE或APPEND,則該channel就是為了寫訪問打開。如果沒有指 定,該channel默認(rèn)是為了讀打開。
    下面的代碼從文件中讀取內(nèi)容并輸出到控制臺上:
    SeekableByteChannel sbc = null;
    try {
        sbc 
    = file.newByteChannel();  //Defaults to READ
        ByteBuffer buf = ByteBuffer.allocate(10);

        
    //Read the bytes with the proper encoding for this platform.
        
    //If you skip this step, you might see something that looks like Chinese
        
    //characters when you expect Latin-style characters.
        String encoding = System.getProperty("file.encoding");
        
    while (sbc.read(buf) > 0) {
            buf.rewind();
            System.out.print(Charset.forName(encoding).decode(buf));
            buf.flip();
        }
    catch (IOException x) {
        System.out.println(
    "caught exception: " + x);
    finally {
        
    if (sbc != null) sbc.close();
    }
    下 面的代碼是為了UNIX或其他支持POSIX的文件系統(tǒng)編寫的。這段代碼創(chuàng)建一個新的日志文件或者擴(kuò)展原有的日志文件,該日志文件創(chuàng)建時指定了訪問權(quán)限 (所有者有讀寫權(quán)限,同組用戶只有讀權(quán)限,其他用戶沒有讀權(quán)限)。
    import static java.nio.file.StandardCopyOption.*;

    //Create the set of options for appending to the file.
    Set<OpenOptions> options = new HashSet<OpenOption>();
    options.add(APPEND);
    options.add(CREATE);

    //Create the custom permissions attribute.
    Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rw-r------");
    FileAttribute
    <Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);

    //Convert the string to a ByetBuffer.
    String s = ;
    byte data[] = s.getBytes();
    ByteBuffer bb 
    = ByteBuffer.wrap(data);

    SeekableByteChannel sbc 
    = null;
    try {
        sbc 
    = file.newByteChannel(options, attr);
        sbc.write(bb);
    catch (IOException x) {
        System.out.println(
    "exception thrown: " + x);
    finally {
        
    if (sbc != null) sbc.close();
    }
    posted on 2010-04-05 17:30 afrag 閱讀(500) 評論(0)  編輯  收藏 所屬分類: Java隨想
     
    Copyright © afrag Powered by: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 国产做国产爱免费视频| 亚洲AV日韩综合一区尤物| 亚洲免费一区二区| 亚洲免费一区二区| 一边摸一边桶一边脱免费视频 | 亚洲AV无码一区东京热| 在线免费观看伊人三级电影| 亚洲熟妇av一区二区三区| 岛国精品一区免费视频在线观看| 国产精品亚洲精品日韩已方| a级毛片免费高清视频| 亚洲中文字幕久久精品无码喷水| 东北美女野外bbwbbw免费| 亚洲av激情无码专区在线播放| 无码人妻久久一区二区三区免费| 亚洲国产精品国自产拍电影| 日韩视频在线精品视频免费观看| 亚洲色欲色欲www| 成人爱做日本视频免费| 香蕉国产在线观看免费| 亚洲欧洲无码AV电影在线观看 | 亚洲高清免费视频| 久久国产精品免费| 久久亚洲sm情趣捆绑调教| 亚洲第一成年免费网站| 国产AV日韩A∨亚洲AV电影| 国产亚洲精久久久久久无码77777 国产亚洲精品成人AA片新蒲金 | 免费国产成人高清视频网站 | 久久大香伊焦在人线免费| 亚洲乱码中文字幕小综合| 免费国产成人高清在线观看麻豆| caoporn国产精品免费| 亚洲日本香蕉视频| www亚洲一级视频com| 免费A级毛片无码视频| 亚洲国产乱码最新视频 | 日木av无码专区亚洲av毛片| 亚洲成AV人片在WWW| 亚洲日韩欧洲无码av夜夜摸| 91九色精品国产免费| 国产成人亚洲精品播放器下载 |