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

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

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

    qileilove

    blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

    Java流緩沖區(qū)問(wèn)題

     聽(tīng)著張孝祥老師關(guān)于緩沖區(qū)知識(shí)的課,發(fā)現(xiàn)還是有一些沒(méi)有掌握,動(dòng)手試了一下,果然發(fā)現(xiàn)了問(wèn)題。

      先講一下關(guān)于java緩沖區(qū)的知識(shí),應(yīng)用程序和IO設(shè)備之間存在一個(gè)緩沖區(qū),一般流是沒(méi)有緩沖區(qū)的,但是如果存在緩沖區(qū),就會(huì)發(fā)現(xiàn)很大的問(wèn)題。

      錯(cuò)誤代碼如下:為了確保問(wèn)題發(fā)生,我使用了BufferedOutputStream,使得手動(dòng)構(gòu)造出了一個(gè)緩沖區(qū)。

    1. import java.io.*;  
    2. public class Test {  
    3.     public static void main(String[] args) throws Exception{  
    4.         DataOutputStream out = new DataOutputStream(  
    5.                             new BufferedOutputStream(  
    6.                             new FileOutputStream("1.txt")));  
    7.         out.writeChars("hello");  
    8.         FileInputStream in = new FileInputStream("1.txt");  
    9.         int len = in.available();  
    10.         byte[] b = new byte[len];  
    11.         int actlen = in.read(b);  
    12.         String str = new String(b);  
    13.         System.out.println(str);  
    14.           
    15.     }     
    16. }

      發(fā)現(xiàn)什么問(wèn)題了嗎?

      因?yàn)槿绻麤](méi)有緩沖區(qū),應(yīng)用程序每次IO都要和設(shè)備進(jìn)行通信,效率很低,因此緩沖區(qū)為了提高效率,當(dāng)寫(xiě)入設(shè)備時(shí),先寫(xiě)入緩沖區(qū),等到緩沖區(qū)有足夠多的數(shù)據(jù)時(shí),就整體寫(xiě)入設(shè)備。這就是問(wèn)題所在,上個(gè)例子中,當(dāng)我們寫(xiě)入hello時(shí),由于hello占用空間很小,所以暫時(shí)存放在緩沖區(qū)中,后來(lái)輸入流想要從文件中讀取,但是由于文件中沒(méi)有字節(jié),所以不能讀取hello。

      這里,解決方法很簡(jiǎn)單,只要調(diào)用out.flush() 或者out.close()即可,這是把緩沖區(qū)的數(shù)據(jù)手動(dòng)寫(xiě)入文件。

      正確代碼如下:

    1. import java.io.*;  
    2. public class Test {  
    3.     public static void main(String[] args) throws Exception{  
    4.         DataOutputStream out = new DataOutputStream(  
    5.                             new BufferedOutputStream(  
    6.                             new FileOutputStream("1.txt")));  
    7.         out.writeChars("hello");  
    8.         out.close();//inserted  
    9.         FileInputStream in = new FileInputStream("1.txt");  
    10.         int len = in.available();  
    11.         byte[] b = new byte[len];  
    12.         int actlen = in.read(b);  
    13.         String str = new String(b);  
    14.         System.out.println(str);  
    15.           
    16.     }     
    17. }

     接下來(lái)又是我遇到的一個(gè)例子,這個(gè)例子也很明顯的反應(yīng)出緩沖區(qū)的問(wèn)題。

    1. import java.io.BufferedReader;  
    2. import java.io.FileReader;  
    3. import java.io.FileWriter;  
    4. import java.io.IOException;  
    5. import java.io.PrintWriter;  
    6. import java.util.Calendar;  
    7. import java.util.Date;  
    8. import java.util.GregorianCalendar;  
    9. import java.util.Scanner;  
    10. import java.util.StringTokenizer;  
    11.   
    12. public class StringTokenizerTest {  
    13.   
    14.     public static void main(String[] args) {  
    15.         Employee[] e = new Employee[3];  
    16.         e[0] = new Employee("Carl Cracker"7500019871215);  
    17.         e[1] = new Employee("Harry Hacker"500001989101);  
    18.         e[2] = new Employee("Tony Tester"400001990315);  
    19.         try {  
    20.             PrintWriter out = new PrintWriter(new FileWriter("1.txt"));  
    21.             writeData(e, out);  
    22.             // out.close();**********************************************************************   
    23.         } catch (Exception e1) {  
    24.             e1.printStackTrace();  
    25.         }  
    26.         System.out.println("*******是否要讀取數(shù)據(jù)?********");  
    27.         Scanner in1 = new Scanner(System.in);  
    28.         String yes = in1.nextLine();  
    29.         if (yes.equalsIgnoreCase("YES")) {  
    30.             try {  
    31.                 BufferedReader in = new BufferedReader(new FileReader("1.txt"));  
    32.                 Employee[] result = readData(in);  
    33.                 for (int i = 0; i < result.length; i++)  
    34.                     System.out.println(result[i]);  
    35.                 in.close();  
    36.             } catch (Exception e2) {  
    37.                 e2.printStackTrace();  
    38.             }  
    39.         }  
    40.   
    41.     }  
    42.   
    43.     public static Employee[] readData(BufferedReader in) throws IOException {  
    44.         int length = Integer.parseInt(in.readLine());  
    45.         Employee[] e = new Employee[length];  
    46.         for (int i = 0; i < length; i++) {  
    47.             String line = in.readLine();  
    48.             StringTokenizer token = new StringTokenizer(line, "|");  
    49.             String name = token.nextToken();  
    50.             double salary = Double.parseDouble(token.nextToken());  
    51.             int year = Integer.parseInt(token.nextToken());  
    52.             int month = Integer.parseInt(token.nextToken());  
    53.             int day = Integer.parseInt(token.nextToken());  
    54.             e[i] = new Employee(name, salary, year, month, day);  
    55.         }  
    56.         return e;  
    57.     }  
    58.   
    59.     public static void writeData(Employee[] e, PrintWriter out) {  
    60.         out.println(e.length);  
    61.         for (int i = 0; i < e.length; i++) {  
    62.             String name = e[i].getName();  
    63.             double salary = e[i].getSalary();  
    64.             Date date = e[i].getHireDay();  
    65.             Calendar c = new GregorianCalendar();  
    66.             c.setTime(date);  
    67.             int year = c.get(Calendar.YEAR);  
    68.             int month = c.get(Calendar.MONTH) + 1;  
    69.             int day = c.get(Calendar.DAY_OF_MONTH);  
    70.             out.println(name + "|" + salary + "|" + year + "|" + month + "|"  
    71.                     + day);  
    72.   
    73.         }  
    74.         System.out.println("********寫(xiě)入數(shù)據(jù)完畢********");  
    75.     }  
    76.   
    77. }  
    78.   
    79. class Employee {  
    80.     public Employee(String n, double s, int year, int month, int day) {  
    81.         name = n;  
    82.         salary = s;  
    83.         GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);  
    84.         hireDay = calendar.getTime();  
    85.     }  
    86.   
    87.     public String getName() {  
    88.         return name;  
    89.     }  
    90.   
    91.     public double getSalary() {  
    92.         return salary;  
    93.     }  
    94.   
    95.     public Date getHireDay() {  
    96.         return hireDay;  
    97.     }  
    98.   
    99.     public void raiseSalary(double byPercent) {  
    100.         double raise = salary * byPercent / 100;  
    101.         salary += raise;  
    102.     }  
    103.   
    104.     public String toString() {  
    105.         return getClass().getName() + "[name=" + name + ",salary=" + salary  
    106.                 + ",hireDay=" + hireDay + "]";  
    107.     }  
    108.   
    109.     private String name;  
    110.   
    111.     private double salary;  
    112.   
    113.     private Date hireDay;  
    114. }

      結(jié)果是沒(méi)有向文件寫(xiě)入任何數(shù)據(jù),為什么呢?

      唯一的錯(cuò)誤就在main方法中沒(méi)有調(diào)用out.close(),把數(shù)據(jù)從緩沖區(qū)刷新到文件。因此用完資源即時(shí)關(guān)閉是很重要的。

    posted on 2011-11-18 14:37 順其自然EVO 閱讀(1025) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 測(cè)試學(xué)習(xí)專(zhuān)欄

    <2011年11月>
    303112345
    6789101112
    13141516171819
    20212223242526
    27282930123
    45678910

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(55)

    隨筆分類(lèi)

    隨筆檔案

    文章分類(lèi)

    文章檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲AV无码乱码国产麻豆穿越| 国产成人综合亚洲AV第一页| 国产成人3p视频免费观看| 四虎永久在线精品免费观看地址| 免费国产怡红院在线观看| 久久久久成人精品免费播放动漫| 免费看h片的网站| 日本19禁啪啪无遮挡免费动图| 亚洲精品无码久久久影院相关影片| 亚洲人成网站在线播放影院在线| 亚洲性无码一区二区三区| 一级毛片完整版免费播放一区| 免费毛片毛片网址| 久久狠狠躁免费观看2020| 国产精品成人免费视频网站京东| 亚洲第一永久AV网站久久精品男人的天堂AV | 一区二区三区免费视频网站| 无码午夜成人1000部免费视频| 成人毛片免费观看| 狠狠综合久久综合88亚洲| 亚洲精品视频在线观看免费| 国产成人亚洲午夜电影| 欧洲人成在线免费| 日韩成人免费视频播放| 国产成人亚洲精品青草天美| 亚洲中文精品久久久久久不卡| 9久热这里只有精品免费| ww在线观视频免费观看| 亚洲成a人片在线观看国产| 亚洲综合激情视频| 污污视频网站免费观看| 69av免费观看| 亚洲人成无码网WWW| 中文字幕精品亚洲无线码一区应用| 亚洲精品在线网站| 中美日韩在线网免费毛片视频| 色se01短视频永久免费| 久久亚洲精品无码观看不卡| 国产精品亚洲片夜色在线| 亚洲va中文字幕| 久久久久久AV无码免费网站 |