Java 進階 & I/O體系及常用類

I/O流的概念

I/O流 即輸入Input流/ 輸出Output流的縮寫,常見的是電腦屏幕輸出設備和鍵盤鼠標輸入設備是辕,其廣義上的定義就是:數(shù)據(jù)在內(nèi)部存儲器和外部存儲器或其他周邊設備之間的輸入和輸出孕豹;即:數(shù)據(jù)/ 輸入/ 輸出痊臭。

流是一個抽象但形象的概念该溯,Java中把不同的輸入/輸出源(鍵盤,文件璃诀,網(wǎng)絡連接等)抽象的表述為 “流”(Stream)∶锵唬可以簡單理解成一個數(shù)據(jù)的序列劣欢,輸入流表示從一個源讀取數(shù)據(jù),輸出流則表示向一個目標寫數(shù)據(jù)裁良,在Java程序中凿将,對于數(shù)據(jù)的輸入和輸出都是采用 “流” 這樣的方式進行的。

image
image.gif

?

I/O流的分類

按流向分:輸入流价脾,輸出流
輸入流:只能從中讀取數(shù)據(jù)牧抵,不能寫入數(shù)據(jù)
輸出流,只能向其寫入數(shù)據(jù),不能讀取數(shù)據(jù)

這里的輸入輸出是相對而言的犀变,在本地用程序讀寫文件時妹孙,始終是以程序為中心,即程序從文件中讀取時就是硬盤向內(nèi)存中輸入获枝,程序向文件中寫入就是內(nèi)存向硬盤輸出蠢正。

但對于服務器和客戶端來說,服務器將數(shù)據(jù)輸出到網(wǎng)絡中省店,這是Sever端程序的輸出流嚣崭。客戶端從網(wǎng)絡中讀取數(shù)據(jù)萨西,這是Client端的輸入流有鹿。

按操作單元分:字節(jié)流和字符流
字節(jié)流:圖片、視頻文件中存儲的都是二進制的字節(jié)(byte)谎脯。直觀的想法葱跋,以一個字節(jié)單位來運輸?shù)模热缫槐槐娜∷?/p>

以InputStream和OutputStream作為基類

字符流:一般文本文件中存放都是有明確含義的源梭,可供人閱讀理解的字符(char)娱俺。直觀的想法,以多個字節(jié)來運輸?shù)姆下椋热缫煌耙煌暗娜∷恚煌八挚梢苑譃閹妆?/p>

以Reader和Writer作為基類

image
image.gif

?

不管是文本、還是圖書烛愧、視頻最終在磁盤上的時候都是按照byte存儲的油宜。因此,Java要提供基于字符流的機制怜姿,就要處理字節(jié)和字符的相互轉化慎冤,這里就涉及字符集合字符編碼的問題。

字節(jié)流和字符流的區(qū)別:

字節(jié)流讀取單個字節(jié)沧卢,字符流讀取單個字符(一個字符根據(jù)編碼的不同蚁堤,對應的字節(jié)也不同,如 UTF-8 編碼是 3 個字節(jié)但狭,中文編碼是 2 個字節(jié)披诗。)字節(jié)流用來處理二進制文件(圖片、MP3立磁、視頻文件)呈队。

字符流用來處理文本文件(可以看做是特殊的二進制文件,使用了某種編碼唱歧,人可以閱讀)掂咒。

簡而言之,字節(jié)是個計算機看的,字符才是給人看的绍刮。

其實現(xiàn)子類:FileInputStream和FileOutputStream可以對任意類型的文件進行讀寫操作温圆,但 FileReader和FileWriter只能對純文本文件進行操作。

從網(wǎng)上找來一張圖孩革,方便對Java I/O有個總統(tǒng)的認識岁歉。從這張圖可以很清楚的看清Java I/O的字節(jié)流和字符流的整體情況。


image.png

IO體系的基類

InputStream/Reader,OutputStream/Writer

InputStream和Reader是所有輸入流的抽象基類膝蜈,本身并不能創(chuàng)建實例來執(zhí)行輸入锅移,但它們將成為所有輸入流的模板,所以他們的方法是所有輸入流都可使用的方法饱搏。

  • InputStream 讀文件方法

int read():從輸入流中讀取單個字節(jié)非剃,返回所讀取的字節(jié)數(shù)據(jù)(字節(jié)數(shù)據(jù)可直接轉為int型)

int read(byte []):從輸入流中最多讀取b.length個字節(jié)的數(shù)據(jù),并將其存儲在字節(jié)數(shù)組b中推沸,返回實際讀取的字節(jié)數(shù)备绽。
int read(byte[], int off, int len): 從輸入流中最多讀取len個字節(jié)的數(shù)據(jù),并將其存儲在數(shù)組b中鬓催,放入b數(shù)組時肺素,并不是從數(shù)組起點開始,而是從off位置開始宇驾,返回實際讀取的字節(jié)數(shù)

  • Reader讀文件方法

int read():從輸入流中讀取單個字符倍靡,返回所讀取的字符數(shù)據(jù)(可直接轉為int類型)
int read(char[]):從輸入流中最多讀取b.length個字符的數(shù)據(jù),并將其存儲在數(shù)組b中课舍,返回實際讀取的字符數(shù)塌西。
int read(char[] b, int off, int len):從輸入流中最多讀取len個字符的數(shù)據(jù),并將其存儲在數(shù)組b中筝尾,放入數(shù)組b時捡需,并不是從數(shù)組七點開始,而是從off位置開始忿等,返回實際讀取的字符數(shù)。

  • OutputStream寫文件方法

void write(int c):將指定的字節(jié)/字符輸出到輸出流中崔挖,c可以代表字節(jié)贸街,也可以代表字符
void write(byte[]/byte[] buf):將字節(jié)數(shù)組,字符數(shù)組的數(shù)據(jù)輸出到指定輸出流中
void write(byte[]/byte[] buf, int off, int len):將字節(jié)數(shù)組/字符數(shù)組從off位置開始狸相,長度為len的字節(jié)/字符數(shù)組輸出到輸出流中

  • Writer寫文件方法

因為字符流直接以字符為操作單位薛匪,所以Writer可以用字符串代替字符數(shù)組,即以String對象為參數(shù)脓鹃。Writer中還包括這兩個方法:

void write(String str):將str字符串里包含的字符輸出到指定輸出流中
void write(String str, int off, int len):將str字符串里從off位置開始逸尖,長度為len的字符輸出到指定輸出流中

IO常用類

  • 文件流:FileInputStream/FileOutputStream, FileReader/FileWriter

FileInputStream/FileOutputStream, FileReader/FileWriter是專門操作文件流的娇跟,用法高度相似岩齿,區(qū)別在于前面兩個是操作字節(jié)流,后面兩個是操作字符流苞俘。它們都會直接操作文件流盹沈,直接與OS底層交互。因此他們也被稱為節(jié)點流吃谣。

使用這幾個流的對象之后乞封,需要關閉流對象,因為java垃圾回收器不會主動回收岗憋。

不過在Java7之后肃晚,可以在 try() 括號中打開流,最后程序會自動關閉流對象仔戈,不再需要顯示的close关串。

下面演示這四個流對象的基本用法

//FileInputStream一個一個字節(jié)讀取
public class FileInputStreamDemo1 {
            public static void main(String[] args) throws IOException{
                FileInputStream fis = new FileInputStream("c:\\a.txt");
                //讀取一個字節(jié),調用方法read 返回int
                //使用循環(huán)方式,讀取文件,  循環(huán)結束的條件  read()方法返回-1
                int len = 0;//接受read方法的返回值

                while( (len = fis.read()) != -1){
                    System.out.print((char)len);
                }
                //關閉資源
                fis.close();
            }
        }

//FileInputStream讀取字節(jié)數(shù)組
  public class FileInputStreamDemo2 {
            public static void main(String[] args) throws IOException {
                FileInputStream fis = new FileInputStream("c:\\a.txt");
                //創(chuàng)建字節(jié)數(shù)組
                byte[] b = new byte[1024];

                int len = 0 ;
                while( (len = fis.read(b)) !=-1){
                    System.out.print(new String(b,0,len));
                }
                fis.close();
            }
        }

//FileOutputStream寫單個字節(jié)
 public class FileOutputStreamDemo {
            public static void main(String[] args)throws IOException {
                FileOutputStream fos = new FileOutputStream("c:\\a.txt");
                //流對象的方法write寫數(shù)據(jù)
                //寫1個字節(jié)
                fos.write(97);
                //關閉資源
                fos.close();
            }
        }

//FileOutputStream寫字節(jié)數(shù)組
  public class FileOutputStreamDemo {
            public static void main(String[] args)throws IOException {
                FileOutputStream fos = new FileOutputStream("c:\\a.txt");
                //流對象的方法write寫數(shù)據(jù)
                //寫字節(jié)數(shù)組
                byte[] bytes = {65,66,67,68};
                fos.write(bytes);

                //寫字節(jié)數(shù)組的一部分,開始索引,寫幾個
                fos.write(bytes, 1, 2);
                //寫入字節(jié)數(shù)組的簡便方式
                //寫字符串
                fos.write("hello".getBytes());
                //關閉資源
                fos.close();
            }
        }

//字符流復制文本
//FileReader讀取數(shù)據(jù)源,FileWriter寫入到數(shù)據(jù)目的

public class Copy {
        public static void main(String[] args) {
            FileReader fr = null;
            FileWriter fw = null;
            try{
                fr = new FileReader("c:\\1.txt");
                fw = new FileWriter("d:\\1.txt");
                char[] cbuf = new char[1024];
                int len = 0 ;
                while(( len = fr.read(cbuf))!=-1){
                    fw.write(cbuf, 0, len);
                    fw.flush();
                }

            }catch(IOException ex){
                System.out.println(ex);
                throw new RuntimeException("復制失敗");
            }finally{
                try{
                    if(fw!=null)
                        fw.close();
                }catch(IOException ex){
                    throw new RuntimeException("釋放資源失敗");
                }finally{
                    try{
                        if(fr!=null)
                            fr.close();
                    }catch(IOException ex){
                        throw new RuntimeException("釋放資源失敗");
                    }
                }
            }
        }
    }
image.gif
  • 轉換流:InputStreamReader/OutputStreamWriter

InputStreamReader/OutputStreamWriter可以將字節(jié)流轉換成字符流,被稱為字節(jié)流與字符流之間的橋梁杂穷。經(jīng)常在讀取鍵盤輸入(System.in)或網(wǎng)絡通信的時候悍缠,需要使用這兩個類。

轉換流作用:

1 . 是字符流和字節(jié)流之間的橋梁

2 . 可對讀取到的字節(jié)數(shù)據(jù)經(jīng)過指定編碼換成字符

3 . 可對讀取到的字符數(shù)據(jù)經(jīng)過指定編碼轉成字節(jié)

 /*
   * 轉換流對象OutputStreamWriter寫文本
   * 采用UTF-8編碼表寫入
   */
  public static void writeUTF()throws IOException{
      //創(chuàng)建字節(jié)輸出流耐量,綁定文件
      FileOutputStream fos = new FileOutputStream("c:\\utf.txt");
      //創(chuàng)建轉換流對象飞蚓,構造方法保證字節(jié)輸出流,并指定編碼表是UTF-8
      OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
      osw.write("你好");
      osw.close();
  }

  /*
   * 轉換流對象 OutputStreamWriter寫文本
   * 文本采用GBK的形式寫入
   */
  public static void writeGBK()throws IOException{
      //創(chuàng)建字節(jié)輸出流廊蜒,綁定數(shù)據(jù)文件
      FileOutputStream fos = new FileOutputStream("c:\\gbk.txt");
      //創(chuàng)建轉換流對象趴拧,構造方法,綁定字節(jié)輸出流山叮,使用GBK編碼表
      OutputStreamWriter osw = new OutputStreamWriter(fos);
      //轉換流寫數(shù)據(jù)
      osw.write("你好");

      osw.close();
  }

/*
 *  轉換流,InputSteamReader讀取文本
 *  采用UTF-8編碼表,讀取文件utf
 */
public static void readUTF()throws IOException{
    //創(chuàng)建自己輸入流,傳遞文本文件
    FileInputStream fis = new FileInputStream("c:\\utf.txt");
    //創(chuàng)建轉換流對象,構造方法中,包裝字節(jié)輸入流,同時寫編碼表名
    InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
    char[] ch = new char[1024];
    int len = isr.read(ch);
    System.out.println(new String(ch,0,len));
    isr.close();
}
/*
 *  轉換流,InputSteamReader讀取文本
 *  采用系統(tǒng)默認編碼表,讀取GBK文件
 */
public static void readGBK()throws IOException{
    //創(chuàng)建自己輸入流,傳遞文本文件
    FileInputStream fis = new FileInputStream("c:\\gbk.txt");
    //創(chuàng)建轉換流對象,構造方法,包裝字節(jié)輸入流
    InputStreamReader isr = new InputStreamReader(fis);
    char[] ch = new char[1024];
    int len = isr.read(ch);
    System.out.println(new String(ch,0,len));

    isr.close();
}
image.gif
  • 緩沖流:BufferedReader/BufferedWriter 著榴, BufferedInputStream/BufferedOutputStream

沒有經(jīng)過Buffered處理的IO, 意味著每一次讀和寫的請求都會由OS底層直接處理屁倔,這會導致非常低效的問題脑又。

經(jīng)過Buffered處理過的輸入流將會從一個buffer內(nèi)存區(qū)域讀取數(shù)據(jù),本地API只會在buffer空了之后才會被調用(可能一次調用會填充很多數(shù)據(jù)進buffer)锐借。

經(jīng)過Buffered處理過的輸出流將會把數(shù)據(jù)寫入到buffer中问麸,本地API只會在buffer滿了之后才會被調用。

BufferedReader/BufferedWriter可以將字符流(Reader)包裝成緩沖流钞翔,這是最常見用的做法严卖。

另外,BufferedReader提供一個readLine()可以方便地讀取一行布轿,因此BufferedReader也被稱為行讀取器哮笆。而FileInputStream和FileReader只能讀取一個字節(jié)或者一個字符来颤。

在原有的節(jié)點流對象外部包裝緩沖流,為IO流增加了內(nèi)存緩沖區(qū)稠肘,增加緩沖區(qū)的兩個目的:

1 .允許IO一次不止操作一個字符福铅,這樣提高整個系統(tǒng)的性能
2 .由于有緩沖區(qū),使得在流上執(zhí)行skip启具,mark和reset方法都成為可能
緩沖流要套接在節(jié)點流之上本讥,對讀寫的數(shù)據(jù)提供了緩沖功能,增加了讀寫的效率鲁冯,同時增加了一些新的方法拷沸。例如:BufferedReader中的readLine方法,BufferedWriter中的newLine方法薯演。

//字符輸入流
BufferedReader(Reader in)//創(chuàng)建一個32字節(jié)的緩沖區(qū)
BufferedReader(Reader in, int size)//size為自定義緩存區(qū)的大小

//字符輸出流
BufferedWriter(Writer out)
BufferedWriter(Writer out, int size)

//字節(jié)輸入流
BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in, int size)

//字節(jié)輸出流
BufferedOutputStream(OutputStream in)
BufferedOutputStream(OutputStream in, int size)
image.gif

對于輸出的緩沖流撞芍,BufferedWriter和BufferedOutputStream會先在內(nèi)存中緩存,使用flush方法會使內(nèi)存中的數(shù)據(jù)立刻寫出跨扮。

//字節(jié)輸出流緩沖流BufferedOutputStream 
 public class BufferedOutputStreamDemo {
          public static void main(String[] args)throws IOException {
              //創(chuàng)建字節(jié)輸出流,綁定文件
              //FileOutputStream fos = new FileOutputStream("c:\\buffer.txt");
              //創(chuàng)建字節(jié)輸出流緩沖流的對象,構造方法中,傳遞字節(jié)輸出流
              BufferedOutputStream bos = new
                      BufferedOutputStream(new FileOutputStream("c:\\buffer.txt"));

              bos.write(55);

              byte[] bytes = "HelloWorld".getBytes();

              bos.write(bytes);

              bos.write(bytes, 3, 2);

              bos.close();
          }
      }

//字節(jié)輸入流緩沖流BufferedInputStream
 public class BufferedInputStreamDemo {
          public static void main(String[] args) throws IOException{
              //創(chuàng)建字節(jié)輸入流的緩沖流對象,構造方法中包裝字節(jié)輸入流,包裝文件
              BufferedInputStream bis = new 
                      BufferedInputStream(new FileInputStream("c:\\buffer.txt"));
              byte[] bytes = new byte[10];
              int len = 0 ;
              while((len = bis.read(bytes))!=-1){
                  System.out.print(new String(bytes,0,len));
              }
              bis.close();
          }
      }

//字符流緩沖區(qū)流復制文本文件
*
         *  使用緩沖區(qū)流對象,復制文本文件
         *  數(shù)據(jù)源  BufferedReader+FileReader 讀取
         *  數(shù)據(jù)目的 BufferedWriter+FileWriter 寫入
         *  讀取文本行, 讀一行,寫一行,寫換行
         */
        public class Copy_1 {
            public static void main(String[] args) throws IOException{
                BufferedReader bfr = new BufferedReader(new FileReader("c:\\w.log"));   
                BufferedWriter bfw = new BufferedWriter(new FileWriter("d:\\w.log"));
                //讀取文本行, 讀一行,寫一行,寫換行
                String line = null;
                while((line = bfr.readLine())!=null){
                    bfw.write(line);
                    bfw.newLine();
                    bfw.flush();
                }
                bfw.close();
                bfr.close();
            }
        }
image.gif
  • 對象流(ObjectInputStream/ObjectOutputStream)

如果我們要寫入文件內(nèi)的數(shù)據(jù)不是基本數(shù)據(jù)類型(使用DataInputStream),也不是字符型或字節(jié)型數(shù)據(jù)序无,而是一個對象,應該怎么寫?這個時候就用到了處理流中的對象流衡创。

對象的序列化
對象中的數(shù)據(jù)帝嗡,以流的形式,寫入到文件中保存過程稱為寫出對象璃氢,對象的序列化
ObjectOutputStream將對象寫道文件中哟玷,實現(xiàn)序列化

對象的反序列化
在文件中,以流的形式一也,將對象讀出來巢寡,讀取對象,對象的反序列化
ObjectInputStream 將文件對象讀取出來

注意:

  • 先序列化后反序列化椰苟; 反序列化順序必須與序列化一致

  • 不是所有對象都可以序列化 必須實現(xiàn) java.io.Serializable

  • 不是所有屬性都需要序列化 不需要序列化的屬性 要加 transient

    public class Person implements Serializable {
        private String name;
        private int age;
        private transient String intro;   //不需要序列化
    
        public Person(String name, int age, String intro) {
            this.name = name;
            this.age = age;
            this.intro = intro;
        }
    
        public String getName() {
            return name;
        }
    
        public int getAge() {
            return age;
        }
    
        public String getIntro() {
            return intro;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public void setIntro(String intro) {
            this.intro = intro;
        }
    
        public String toString(){
            return name + " " + age + " " + intro;
        }
    }
    
    image.gif

    進行序列化和反序列化后:

    public class WriteObject {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(
                    new File("d:\\test.txt"))));
    
            oos.writeObject(new Person("shi",13,"A"));
            oos.writeObject(new Person("zhang",15,"B"));
            oos.writeObject(new Person("hao",18,"C"));
    
            oos.close();
    
            ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(
                    new FileInputStream(new File("d:\\test.txt"))));
            Person p1 = (Person) ois.readObject();
            Person p2 = (Person) ois.readObject();
            Person p3 = (Person) ois.readObject();
            ois.close();
            System.out.println(p1);
            System.out.println(p2);
            System.out.println(p3);
        }
    }
    
    image.gif

    可以發(fā)現(xiàn)抑月,自定義類中被transient 標記的數(shù)據(jù)將不被序列化和反序列化,而且自定義類也必須要實現(xiàn)Serializable接口舆蝴。

注意:

ObjectOutputStream 對JAVA對象進行序列化處理谦絮,處理后的對象不是文本數(shù)據(jù)。所以數(shù)據(jù)保存到文件中后洁仗,用記事本层皱、寫字板、Word等文本編輯器打開京痢,是無法識別的奶甘,一定會顯示亂碼篷店。只有使用相同版本的Java的ObjectInputStream進行讀取操作祭椰,方可獲取文件中的對象內(nèi)容臭家。

序列化時的參數(shù)類型和反序列化時的返回類型都是Object類型,所以在反序列化接收類對象數(shù)據(jù)時要用強制類型轉換方淤。

總結上面幾種流的應用場景:

  • FileInputStream/FileOutputStream 需要逐個字節(jié)處理原始二進制流的時候使用钉赁,效率低下
  • FileReader/FileWriter 需要組個字符處理的時候使用
  • StringReader/StringWriter 需要處理字符串的時候,可以將字符串保存為字符數(shù)組
  • PrintStream/PrintWriter 用來包裝FileOutputStream 對象携茂,方便直接將String字符串寫入文件
  • Scanner 用來包裝System.in流你踩,很方便地將輸入的String字符串轉換成需要的數(shù)據(jù)類型
  • InputStreamReader/OutputStreamReader , 字節(jié)和字符的轉換橋梁,在網(wǎng)絡通信或者處理鍵盤輸入的時候用
  • BufferedReader/BufferedWriter 讳苦, BufferedInputStream/BufferedOutputStream 带膜, 緩沖流用來包裝字節(jié)流后者字符流,提升IO性能鸳谜,BufferedReader還可以方便地讀取一行膝藕,簡化編程。

參考文章:

https://blog.csdn.net/wintershii/article/details/81281710

https://blog.csdn.net/sj13051180/article/details/47710099

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咐扭,一起剝皮案震驚了整個濱河市芭挽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蝗肪,老刑警劉巖袜爪,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異薛闪,居然都是意外死亡辛馆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門逛绵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怀各,“玉大人,你說我怎么就攤上這事术浪∑岸裕” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵胰苏,是天一觀的道長硕蛹。 經(jīng)常有香客問我,道長硕并,這世上最難降的妖魔是什么法焰? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮倔毙,結果婚禮上埃仪,老公的妹妹穿的比我還像新娘。我一直安慰自己陕赃,他們只是感情好卵蛉,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布颁股。 她就那樣靜靜地躺著,像睡著了一般傻丝。 火紅的嫁衣襯著肌膚如雪甘有。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天葡缰,我揣著相機與錄音亏掀,去河邊找鬼。 笑死泛释,一個胖子當著我的面吹牛滤愕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播怜校,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼该互,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了韭畸?” 一聲冷哼從身側響起宇智,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胰丁,沒想到半個月后随橘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡锦庸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年机蔗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甘萧。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡萝嘁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扬卷,到底是詐尸還是另有隱情牙言,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布怪得,位于F島的核電站咱枉,受9級特大地震影響,放射性物質發(fā)生泄漏徒恋。R本人自食惡果不足惜蚕断,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望入挣。 院中可真熱鬧亿乳,春花似錦、人聲如沸径筏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至桐款,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間夷恍,已是汗流浹背魔眨。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酿雪,地道東北人遏暴。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像指黎,于是被迫代替她去往敵國和親朋凉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一醋安、基礎知識:1杂彭、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機...
    殺小賊閱讀 2,379評論 0 4
  • 1 I/O流的概念吓揪,分類2 I/O所有類的結構圖及詳解3 何為NIO亲怠,和傳統(tǒng)I/O有何區(qū)別4 在開發(fā)中正確使用I/...
    艾剪疏閱讀 493評論 0 2
  • 1、IO流 1.1柠辞、概述 之前學習的File類它只能操作文件或文件夾团秽,并不能去操作文件中的數(shù)據(jù)。真正保存數(shù)據(jù)的是文...
    Villain丶Cc閱讀 2,670評論 0 5
  • 前提 參考資料: 《Java I/O》 -- 這本書沒有翻譯版叭首,需要自己啃一下习勤。 《Java I/O》這本書主要介...
    zhrowable閱讀 1,175評論 0 1
  • tags:io categories:總結 date: 2017-03-28 22:49:50 不僅僅在JAVA領...
    行徑行閱讀 2,178評論 0 3