一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - JAVA IO API使用詳解

JAVA IO API使用詳解

2019-10-21 11:41java教程網(wǎng) Java教程

本文通過理論、用法、實例詳細(xì)說明了JAVA IO的使用,大家參考其中的實例代碼實現(xiàn)自己的JAVA IO程序

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

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

三.若干實例
還是寒假時候?qū)懙模瑱?quán)當(dāng)復(fù)習(xí)了,折疊代碼的插件找不到了,先看著吧。
1.System.in

復(fù)制代碼代碼如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/*
 * System.in是InputStream static final的,包含了多態(tài),叫同步式或者阻塞式
 * 讀取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

復(fù)制代碼代碼如下:

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

復(fù)制代碼代碼如下:

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是字節(jié)流,若是有漢字就顯示不正常了,使用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實現(xiàn)復(fù)制功能

復(fù)制代碼代碼如下:

import java.io.*;
/*
 * 實現(xiàn)復(fù)制功能
 */
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("文件復(fù)制錯誤");
   System.exit(-1);

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


     5.ObjectOutputStream與Serializable

復(fù)制代碼代碼如下:

import java.io.*;
/*
 * transient(透明的),可以用來修飾成員變量,
 * 當(dāng)進行序列化時不予考慮,修飾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.轉(zhuǎn)換編碼方式

復(fù)制代碼代碼如下:

import java.io.*;
/*
 * 中文windows默認(rèn)GBK編碼方式
 * 追加的內(nèi)容顯示為問號,不知道咋回事
 */
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是西歐語言,又叫l(wèi)atin-1,此時未考慮東方人,國標(biāo)(ISO)為Unicode
   osw.close();
   osw = new OutputStreamWriter(new FileOutputStream("d:/java.txt",true),"ISO8859_1");//true表示追加
   osw.write("這是追加的內(nèi)容");
   System.out.println("編碼方式:" + osw.getEncoding());
   osw.close();
  }catch(IOException e) {
   e.printStackTrace();
  }
 }
}
7.輸出重定向
[code]
import java.io.*;
/*
 * Print流屬于輸出流,提供了重載的方法很多,
 * PrintWriter和PrintStream不會拋異常,用戶通過檢測錯誤狀態(tài)獲取信息,
 * 包含自動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

復(fù)制代碼代碼如下:

import java.io.*;
public class TestDataStream {
 public static void main(String[] args) {
 //先在內(nèi)存里分配一個字節(jié)數(shù)組,再有一個 OutputStream,再加上一個數(shù)據(jù)流
  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());//共幾個字節(jié)可用
   DataInputStream dis = new DataInputStream(bais);
   ////先寫的先讀(隊列),下面這兩個輸出不可以調(diào)換,否則就先輸出了double里的一個字節(jié)
   System.out.println(dis.readDouble());
   System.out.println(dis.readBoolean());
   dos.close();
   dis.close();
  }catch (IOException e) {
   e.printStackTrace(); 
  }
 }
}


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

延伸 · 閱讀

精彩推薦
  • Java教程JavaWeb 實現(xiàn)驗證碼功能(demo)

    JavaWeb 實現(xiàn)驗證碼功能(demo)

    在 WEB-APP 中一般應(yīng)用于:登錄、注冊、買某票、秒殺等場景,大家都接觸過這個驗證碼操作,今天小編通過實例代碼給大家講解javaweb實現(xiàn)驗證碼功能,需要...

    java教程網(wǎng)12832020-08-05
  • Java教程java 中鎖的性能提高辦法

    java 中鎖的性能提高辦法

    這篇文章主要介紹了java 中鎖的性能提高辦法的相關(guān)資料,需要的朋友可以參考下...

    Java之家3092020-08-13
  • Java教程淺談Java(SpringBoot)基于zookeeper的分布式鎖實現(xiàn)

    淺談Java(SpringBoot)基于zookeeper的分布式鎖實現(xiàn)

    這篇文章主要介紹了Java(SpringBoot)基于zookeeper的分布式鎖實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的...

    LJY_SUPER5742021-07-21
  • Java教程Java list.remove( )方法注意事項

    Java list.remove( )方法注意事項

    這篇文章主要介紹了Java list.remove( )方法注意事項,非常簡單易懂,需要的朋友可以參考下...

    妖久9552021-05-25
  • Java教程SpringBoot引入Thymeleaf的實現(xiàn)方法

    SpringBoot引入Thymeleaf的實現(xiàn)方法

    這篇文章主要介紹了SpringBoot引入Thymeleaf的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下...

    Bobby6472021-07-28
  • Java教程Java之Springcloud Feign組件詳解

    Java之Springcloud Feign組件詳解

    這篇文章主要介紹了Java之Springcloud Feign組件詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下...

    深情以改10322021-11-12
  • Java教程JAVA中通過自定義注解進行數(shù)據(jù)驗證的方法

    JAVA中通過自定義注解進行數(shù)據(jù)驗證的方法

    java 自定義注解驗證可自己添加所需要的注解,下面這篇文章主要給大家介紹了關(guān)于JAVA中通過自定義注解進行數(shù)據(jù)驗證的相關(guān)資料,文中通過示例代碼介紹...

    Decouple6362021-05-25
  • Java教程springboot ehcache 配置使用方法代碼詳解

    springboot ehcache 配置使用方法代碼詳解

    EhCache是一個比較成熟的Java緩存框架,Springboot對ehcache的使用非常支持,所以在Springboot中只需做些配置就可使用,且使用方式也簡易,今天給大家分享spri...

    m1719309529412912021-09-16
主站蜘蛛池模板: 天天操夜夜操狠狠操 | 四虎影视入口 | 日韩精品一区二区三区中文在线 | 爱欲荡漾在线观看 | 手机看片日韩1024你懂的首页 | 成年人在线观看免费视频 | 色就色欧美综合偷拍区a | 久久精品黄AA片一区二区三区 | 日产精品一二三四区国产 | 四虎影院免费在线播放 | 99久女女精品视频在线观看 | ova巨公主催眠1在线观看 | 亚洲 欧美 日韩 国产 视频 | 亚洲国产成人久久综合一区77 | 欧美福利在线播放 | 513热点网| a级情欲片在线观看hd | 国产精品成人一区二区1 | 国产精品13p | 久久热这里只有 精品 | 9热在线精品视频观看 | 我半夜摸妺妺的奶C了她软件 | 91啪在线观看国产在线 | chinese456老人gay china外卖员gay国产xnxx | 99久久免费国产特黄 | 成全视频在线观看免费 | 青草热视频 | www.精品视频 | 婷婷久久精品 | 99久久精品免费看国产四区 | 男男同志videos | 美式禁忌在线 | 77成人影院 | 男女刺激高清视频在线观看 | 国产精品欧美一区二区 | 日本午夜影院 | 亚洲高清在线视频 | boobsmilking流奶水| 完整秽淫刺激长篇小说 | vomoulei成人舞蹈 | 精品一区二区三区自拍图片区 |