亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

JAVA IO API使用詳解

2019-11-26 15:54:13
字體:
來源:轉載
供稿:網友

一.理論準備
流是個抽象的概念,是對輸入輸出設備的抽象,Java程序中,對于數據的輸入/輸出操作都是以“流”的方式進行,設備可以是文件、網絡、內存等。流具有方向性,至于是輸入流還是輸出流則是一個相對的概念,一般以程序(小馬哥說的是機器)為參考,如果數據的流向是程序至設備,我們成為輸出流,反之我們稱為輸入流,可以將流想象成一個“水流管道”(很多資料都這么講的),自然就出現了方向的概念。
流把I/O設備內部的具體操作給隱藏起來了。所有InputStream和Reader的派生類都有一個基本的,繼承下來的,能讀取單個或byte數組的read( )方法。
Java分為字節流(Stream結尾)和字符流(Reader、Write結尾),再分為輸入流(InputStream、Reader)和輸出流(OutputStream、Write),輸入輸出相對于內存而言。在讀字符的時候用字符流,如文本文件、XML(我想xml明明是字母字符組成的,屬于ASCII文件,為何不用stream讀取呢?)等。在讀二進制文件時候用字節流,如RAR、EXE等不是文本以外的文件(圖片)。Buffered開頭的流只是加了緩沖區,為了讀寫提高效率。字符流不能直接輸出,需要轉換成字節流才能輸出(這個確實是剛知道的)!
Java 2 SDK中有三種基本類型的節點:文件(file)、內存(memory)、管道(pipe)。
下面來看鄭莉教材上IO章節的那個經典圖片。
繼承自InputStream/OutputStream的流都是用于向程序中輸入/輸出數據,且數據的單位都是字節(byte=8bit),如圖,深色的為節點流,淺色的為處理流。

繼承自Reader/Writer的流都是用于向程序中輸入/輸出數據,且數據的單位都是字符(2byte=16bit),如圖,深色的為節點流,淺色的為處理流。

二.用法分析
Java IO的一般使用原則(部分來自百度文庫):
(1) 按數據來源(去向)分類:
是文件: FileInputStream, FileOutputStream, FileReader, FileWriter
是byte[]:ByteArrayInputStream, ByteArrayOutputStream
是Char[]: CharArrayReader, CharArrayWriter
是String: StringBufferInputStream, StringReader, StringWriter
網絡數據流:InputStream, OutputStream, Reader, Writer
(2) 按是否格式化輸出分:
要格式化輸出:PrintStream, PrintWriter
(3) 按是否要緩沖分:
要緩沖:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter。
(4) 按數據格式分:
二進制格式(只要不能確定是純文本的): InputStream, OutputStream及其所有帶Stream結束的子類
純文本格式(含純英文與漢字或其他編碼方式);Reader, Writer及其所有帶Reader, Writer的子類
(5) 按輸入輸出分:
輸入:Reader, InputStream類型的子類;輸出:Writer, OutputStream類型的子類
(6) 特殊需要:
從Stream到Reader,Writer的轉換類:InputStreamReader, OutputStreamWriter
對象輸入輸出:ObjectInputStream, ObjectOutputStream
進程間通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
合并輸入:SequenceInputStream
更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader
       (7) 決定使用哪個類以及它的構造進程的一般準則如下(不考慮特殊需要):
考慮最原始的數據格式是什么:是否為文本?是輸入還是輸出?是否需要轉換流:InputStreamReader, OutputStreamWriter?數據來源(去向)是什么:文件?內存?網絡?是否要緩沖:bufferedReader (特別注明:一定要注意的是readLine()是否有定義,有什么比read, write更特殊的輸入或輸出方法)是否要格式化輸出:print。

三.若干實例
還是寒假時候寫的,權當復習了,折疊代碼的插件找不到了,先看著吧。
1.System.in

復制代碼 代碼如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/*
 * System.in是InputStream static final的,包含了多態,叫同步式或者阻塞式
 * 讀取ASCII和二進制文件(圖片),而字母就是ASCII字符(個人理解)。
 */
public class TestSystemIn {
 public static void main(String[] args) {
  InputStreamReader isr = new InputStreamReader(System.in);
  BufferedReader br = new BufferedReader(isr);//有readline
  String s = null;
  try {
   s = br.readLine();
   while(s!=null) {
    if(s.equalsIgnoreCase("exit")) {
     break;
    }
    System.out.println(s.toUpperCase());
    s = br.readLine();
   }
   br.close();
  }catch (IOException e) {
   e.printStackTrace();
  }
 }
}

  2.buffer
復制代碼 代碼如下:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class TestBuffer {
 public static void main(String[] args) {
  try {
   //查看修改日就可以判斷文件是否是新建的了
   BufferedWriter bw = new BufferedWriter(new FileWriter("d:/java.txt"));
   BufferedReader br = new BufferedReader(new FileReader("d:/java.txt"));
   String s = null;
   for(int i=1; i<100; i++) {
    s = String.valueOf(Math.random());
    bw.write(s);
    bw.newLine();//換行
   }
   //刷新該流的緩沖,br沒有該方法
   bw.flush();
   while((s=br.readLine())!=null) {
    System.out.println(s);
   }
   bw.close();
   br.close();
  }catch (IOException e) {
   e.printStackTrace();
  }
 }
}

    3.FileInputStream
復制代碼 代碼如下:

import java.io.*;
public class TestFileInputStream {
 public static void main(String[] args) {
  FileInputStream in = null;
  try {
   in = new FileInputStream("e:/1.txt");
  }catch(FileNotFoundException e) {
   System.out.println("找不到文件");
   System.exit(-1);
  }
  //下面表示找到了文件
  int tag = 0;
  try {
   long num = 0;
   while((tag = in.read())!=-1) {
    //read是字節流,若是有漢字就顯示不正常了,使用reader就解決了
    System.out.print((char)tag);
    num++;
   }
   in.close();
   System.out.println();
   System.out.println("共讀取了" + num + "字符");
  }catch(IOException e1) {//read和close都會拋出IOException
   System.out.println("文件讀取錯誤");
   System.exit(-1);
  }
 }
}

     4.FileOutputStream實現復制功能
復制代碼 代碼如下:

import java.io.*;
/*
 * 實現復制功能
 */
public class TestFileOutputStream {
 public static void main(String[] args) {
  int b = 0;
  FileInputStream in = null;
  FileOutputStream out = null;
  try {
   in = new FileInputStream("d:/java.txt");
   //下面的若是不存在的話會自動建立
   out = new FileOutputStream("d:/my_java.txt");
   while((b=in.read())!=-1) {
    out.write(b);
   }
   in.close();
   out.close();
  }catch(FileNotFoundException e) {
   System.out.println("找不到指定文件");
   System.exit(-1);
  }catch(IOException e1) {
   System.out.println("文件復制錯誤");
   System.exit(-1);

  }
  System.out.println("文件已復制"); 
 }
}

     5.ObjectOutputStream與Serializable
復制代碼 代碼如下:

import java.io.*;
/*
 * transient(透明的),可以用來修飾成員變量,
 * 當進行序列化時不予考慮,修飾int 的話,不管原來的值是多少
 * 輸出的就是0
 */
public class TestObjectIO {
 public static void main(String[] args) throws Exception {
  T t = new T();
  t.k = 8;
  FileOutputStream fos = new FileOutputStream("d:/1.txt");
  ObjectOutputStream oos = new ObjectOutputStream(fos);
  oos.writeObject(t);
  oos.flush();
  oos.close();

  FileInputStream fis = new FileInputStream("d:/1.txt");
  ObjectInputStream ois = new ObjectInputStream(fis);
  T tRead = (T)ois.readObject();
  System.out.println(tRead.i + " " + tRead.j + " " + tRead.k);
 }
}
class T implements Serializable {
 int i = 10;
 int j = 9;
 double d = 2.3;
 int k = 15;
}

 6.轉換編碼方式
復制代碼 代碼如下:

import java.io.*;
/*
 * 中文windows默認GBK編碼方式
 * 追加的內容顯示為問號,不知道咋回事
 */
public class TestTransForm {
 public static void main(String[] args) {
  try {
   OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d:/java.txt"));
   osw.write("你好123");//可以直接寫入字符串,包括中文,因為外邊的是字符流
   System.out.println("編碼方式:" + osw.getEncoding());//ISO8859_1是西歐語言,又叫latin-1,此時未考慮東方人,國標(ISO)為Unicode
   osw.close();
   osw = new OutputStreamWriter(new FileOutputStream("d:/java.txt",true),"ISO8859_1");//true表示追加
   osw.write("這是追加的內容");
   System.out.println("編碼方式:" + osw.getEncoding());
   osw.close();
  }catch(IOException e) {
   e.printStackTrace();
  }
 }
}
7.輸出重定向
[code]
import java.io.*;
/*
 * Print流屬于輸出流,提供了重載的方法很多,
 * PrintWriter和PrintStream不會拋異常,用戶通過檢測錯誤狀態獲取信息,
 * 包含自動flush功能,有什么用呢,在jsp里也要輸出一些東西,
 * 但不必每次拋異常。
 */
public class TestPrintStream {
 public static void main(String[] args) {
  PrintStream ps = null;
  try {
   FileOutputStream fos = new FileOutputStream("d:/java.txt");
   ps = new PrintStream(fos);

  }catch (IOException e) {
   e.printStackTrace();
  }
  if(ps!=null) {
   System.setOut(ps);//輸出重定向
  }
  int ln = 0;
  for(char c=0; c<65535; c++) {
   System.out.print(c + " ");
   if(ln++>100) {
    System.out.println();
    ln = 0;
   }
  }
 }
}

8.DataStream
復制代碼 代碼如下:

import java.io.*;
public class TestDataStream {
 public static void main(String[] args) {
 //先在內存里分配一個字節數組,再有一個 OutputStream,再加上一個數據流
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  DataOutputStream dos = new DataOutputStream(baos);
  try {//寫出讀入
   dos.writeDouble(Math.random());
   dos.writeBoolean(true);
   ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
   System.out.println(bais.available());//共幾個字節可用
   DataInputStream dis = new DataInputStream(bais);
   ////先寫的先讀(隊列),下面這兩個輸出不可以調換,否則就先輸出了double里的一個字節
   System.out.println(dis.readDouble());
   System.out.println(dis.readBoolean());
   dos.close();
   dis.close();
  }catch (IOException e) {
   e.printStackTrace(); 
  }
 }
}

四.小問題
為什么Writer/Reader不繼承自Stream呢?字符最終也要轉換成二進制呀。Writer/Readre繼承OutputStream/InputStream,這樣的繼承層次不是更好,為什么要單獨做一個呢,而且Stream也有些子類能夠實現字符串的讀寫。大神回答:單一職責。太牽強了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品视频免费在线观看| 中文字幕欧美专区| 亚洲欧洲视频在线| 久久精品国产一区| 国产精品综合网站| 亚洲欧美日本精品| 欧美一级大片视频| 欧美超级乱淫片喷水| 性夜试看影院91社区| 91免费在线视频| 亚洲午夜性刺激影院| 亚洲天堂精品在线| 亚洲一品av免费观看| 日韩中文字幕网| 国产99久久精品一区二区永久免费| 国产成人精品在线播放| 国产99久久精品一区二区 夜夜躁日日躁| 中文字幕久久久av一区| 在线看日韩欧美| 国产视频自拍一区| 国产精品一区二区三区久久久| 日韩在线观看电影| 国产精品自拍视频| 国产午夜精品一区理论片飘花| 亚洲精品久久久久中文字幕二区| 欧美大尺度激情区在线播放| 亚洲一区999| 成人夜晚看av| 成人女保姆的销魂服务| 69**夜色精品国产69乱| 欧美日韩第一页| 免费91麻豆精品国产自产在线观看| 福利微拍一区二区| 亚洲自拍小视频免费观看| 欧美一区二区三区四区在线| 国内揄拍国内精品少妇国语| 最近2019年日本中文免费字幕| 国产成人精品一区二区三区| 久久久久国产精品免费网站| 91精品久久久久久久久久| 97精品一区二区视频在线观看| …久久精品99久久香蕉国产| 久久久久久久久久国产精品| 国产91露脸中文字幕在线| 国产精品一区二区三区在线播放| 亚洲精品成人久久电影| 久久综合伊人77777蜜臀| 日韩视频在线一区| 久久久999成人| 国产精品一区久久| 超碰97人人做人人爱少妇| 亚洲最新av网址| 欧美精品videos| 国产拍精品一二三| 欧美黑人巨大xxx极品| 91中文字幕一区| 亚洲男人天堂网| 97碰碰碰免费色视频| 精品性高朝久久久久久久| 秋霞成人午夜鲁丝一区二区三区| 91精品国产91久久久| 欧美性受xxxx黑人猛交| 91精品在线国产| 国产视频精品自拍| 91在线直播亚洲| 久久久久久久久91| 97超视频免费观看| 国产精品视频一| 国产精品免费观看在线| 日韩亚洲一区二区| 中文字幕亚洲一区| 亚洲国产精品人久久电影| 国产美女搞久久| 午夜精品三级视频福利| 亚洲国产一区二区三区在线观看| 久久理论片午夜琪琪电影网| 国产精品看片资源| 国产精品揄拍500视频| 欧美一级免费看| 欧美三级欧美成人高清www| 国产成人+综合亚洲+天堂| 97不卡在线视频| 国产精品第一页在线| 欧美一区二区视频97| 亚洲国产日韩一区| 国产成人精品日本亚洲| 国产精品青草久久久久福利99| 91黄色8090| 欧美大片在线影院| 国产精品视频午夜| 91精品中国老女人| 国产成人在线一区二区| 深夜精品寂寞黄网站在线观看| 日韩精品在线影院| 久久精品国产亚洲7777| 亚洲区中文字幕| 久久久成人精品视频| 国产亚洲美女精品久久久| 国产精品久久久久久久午夜| 日韩天堂在线视频| 69视频在线免费观看| 91色p视频在线| 日韩av片免费在线观看| 国产精品视频免费在线观看| 国产亚洲一区二区精品| 秋霞av国产精品一区| 亚洲国产日韩欧美在线99| 最新国产精品拍自在线播放| 国产精品综合网站| 国产亚洲视频中文字幕视频| 国产一区在线播放| 欧美最猛性xxxxx亚洲精品| 亚洲а∨天堂久久精品喷水| 一区二区欧美日韩视频| 日韩欧美国产成人| 欧美激情综合亚洲一二区| 欧美在线激情网| 日韩最新中文字幕电影免费看| 粗暴蹂躏中文一区二区三区| 国产精品69av| 亚洲一区二区三区在线视频| 在线激情影院一区| 成人妇女免费播放久久久| 尤物yw午夜国产精品视频| 欧美日韩国产综合新一区| 青青久久aⅴ北条麻妃| 在线看片第一页欧美| 成人中文字幕+乱码+中文字幕| 91chinesevideo永久地址| 久久免费视频观看| 欧美激情视频免费观看| 91亚洲国产成人精品性色| 久久久91精品国产一区不卡| 成人性教育视频在线观看| 亚洲欧美资源在线| 国产亚洲精品久久久优势| 91沈先生在线观看| 久久av在线看| 91国产美女视频| 日韩美女激情视频| 一区二区在线免费视频| 91在线看www| 日韩电影网在线| 午夜精品一区二区三区在线视频| 一区二区三区亚洲| 亚洲欧美中文在线视频| 日韩av免费看网站| 精品国产精品自拍| 亚洲精选一区二区| 51色欧美片视频在线观看| 亚洲欧美日韩精品久久奇米色影视| 久久久久久久久爱| 亚洲精品久久久久| 久久乐国产精品| 亚洲国产欧美一区二区三区久久| 久久久久亚洲精品| 欧美日韩裸体免费视频| 日韩电影中文字幕一区| 欧美激情国产精品| 久久夜色精品亚洲噜噜国产mv| 久久久免费av| 亚洲成人黄色在线| 日韩中文字幕在线观看| 欧美成人免费小视频|