最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JAVA IO API使用詳解

 更新時間:2020年09月12日 12:11:27   投稿:zxhpj  
本文通過理論、用法、實例詳細說明了JAVA IO的使用,大家參考其中的實例代碼實現(xiàn)自己的JAVA IO程序

一.理論準備

流是個抽象的概念,是對輸入輸出設備的抽象,Java程序中,對于數(shù)據(jù)的輸入/輸出操作都是以“流”的方式進行,設備可以是文件、網(wǎng)絡、內(nèi)存等。流具有方向性,至于是輸入流還是輸出流則是一個相對的概念,一般以程序(小馬哥說的是機器)為參考,如果數(shù)據(jù)的流向是程序至設備,我們成為輸出流,反之我們稱為輸入流,可以將流想象成一個“水流管道”(很多資料都這么講的),自然就出現(xiàn)了方向的概念。
流把I/O設備內(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é)點流,淺色的為處理流。

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

二.用法分析

Java IO的一般使用原則(部分來自百度文庫):

(1) 按數(shù)據(jù)來源(去向)分類:
是文件: FileInputStream, FileOutputStream, FileReader, FileWriter
是byte[]:ByteArrayInputStream, ByteArrayOutputStream
是Char[]: CharArrayReader, CharArrayWriter
是String: StringBufferInputStream, StringReader, StringWriter
網(wǎng)絡數(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) 決定使用哪個類以及它的構造進程的一般準則如下(不考慮特殊需要):
考慮最原始的數(shù)據(jù)格式是什么:是否為文本?是輸入還是輸出?是否需要轉(zhuǎn)換流:InputStreamReader, OutputStreamWriter?數(shù)據(jù)來源(去向)是什么:文件?內(nèi)存?網(wǎng)絡?是否要緩沖:bufferedReader (特別注明:一定要注意的是readLine()是否有定義,有什么比read, write更特殊的輸入或輸出方法)是否要格式化輸出:print。

三.若干實例

還是寒假時候?qū)懙模瑱喈攺土暳?,折疊代碼的插件找不到了,先看著吧。

1.System.in

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

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是字節(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)復制功能

import java.io.*;
/*
 * 實現(xiàn)復制功能
 */
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.轉(zhuǎn)換編碼方式

import java.io.*;
/*
 * 中文windows默認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,此時未考慮東方人,國標(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.輸出重定向

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

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)字符串的讀寫。大神回答:單一職責。太牽強了。

相關文章

  • Java中ConstraintValidator接口使用方法詳解

    Java中ConstraintValidator接口使用方法詳解

    在現(xiàn)代 Java 應用開發(fā)中,數(shù)據(jù)校驗是保證系統(tǒng)健壯性和數(shù)據(jù)一致性的核心環(huán)節(jié),無論是 Web 請求參數(shù)、數(shù)據(jù)庫實體對象,還是業(yè)務邏輯中的中間狀態(tài),都需要通過嚴格的校驗規(guī)則來確保數(shù)據(jù)的合法性,Java 提供了 Bean Validation,本文給大家介紹了ConstraintValidator接口使用方法
    2025-07-07
  • 解決參數(shù)命名不規(guī)范,造成使用@NotNull進行校驗出現(xiàn)的問題

    解決參數(shù)命名不規(guī)范,造成使用@NotNull進行校驗出現(xiàn)的問題

    這篇文章主要介紹了解決參數(shù)命名不規(guī)范,造成使用@NotNull進行校驗出現(xiàn)的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java 數(shù)據(jù)庫時間返回前端顯示錯誤(差8個小時)的解決方法

    Java 數(shù)據(jù)庫時間返回前端顯示錯誤(差8個小時)的解決方法

    本文主要介紹了Java 數(shù)據(jù)庫時間返回前端顯示錯誤(差8個小時)的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-08-08
  • 使用JMF實現(xiàn)java視頻播放器

    使用JMF實現(xiàn)java視頻播放器

    這篇文章主要為大家詳細介紹了使用JMF實現(xiàn)java視頻播放器的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Spring boot 無法注入service問題

    Spring boot 無法注入service問題

    這篇文章主要介紹了Spring boot 無法注入service問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java快速掌握Vector類方法

    Java快速掌握Vector類方法

    Vector?類實現(xiàn)了一個動態(tài)數(shù)組。和?ArrayList?很相似,但是兩者是不同的:Vector?是同步訪問的;Vector?包含了許多傳統(tǒng)的方法,這些方法不屬于集合框架
    2022-03-03
  • SpringBoot集成Redis并實現(xiàn)主從架構的實踐

    SpringBoot集成Redis并實現(xiàn)主從架構的實踐

    本文主要和大家分享一下在springboot中如何集成redis,并實現(xiàn)主從架構,進行數(shù)據(jù)的簡單存儲,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Java實現(xiàn)圖片淡入淡出效果

    Java實現(xiàn)圖片淡入淡出效果

    在現(xiàn)代圖形用戶界面和游戲開發(fā)中,**圖片淡入淡出(Fade In/Out)**是一種常見且實用的視覺過渡效果,它可以用于啟動畫面、場景切換、輪播圖、提示框彈出等場景,通過本項目,您將全面了解 Java 上實現(xiàn)淡入淡出效果的各個要點,需要的朋友可以參考下
    2025-05-05
  • Java使用jdbc連接MySQL數(shù)據(jù)庫實例分析

    Java使用jdbc連接MySQL數(shù)據(jù)庫實例分析

    這篇文章主要介紹了Java使用jdbc連接MySQL數(shù)據(jù)庫,結(jié)合實例形式分析了Java基于jdbc鏈接mysql的相關配置及工具類的定義相關操作技巧,需要的朋友可以參考下
    2018-07-07
  • java服務端微信APP支付接口詳解

    java服務端微信APP支付接口詳解

    這篇文章主要為大家詳細介紹了java服務端微信APP支付接口,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04

最新評論

辽中县| 庄浪县| 黎城县| 通化县| 云和县| 武胜县| 长岭县| 五大连池市| 敦化市| 东阿县| 惠州市| 佳木斯市| 新乐市| 手游| 阜宁县| 阿合奇县| 岑巩县| 抚顺县| 临朐县| 高清| 保德县| 龙里县| 客服| 泸州市| 马鞍山市| 潮州市| 略阳县| 永平县| 巫溪县| 平南县| 诏安县| 泽库县| 吴江市| 绵竹市| 孝义市| 横山县| 即墨市| 新蔡县| 临泽县| 姜堰市| 桃园县|