色噜噜人体337p人体 I 超碰97观看 I 91久久香蕉国产日韩欧美9色 I 色婷婷我要去我去也 I 日本午夜a I 国产av高清怡春院 I 桃色精品 I 91香蕉国产 I 另类小说第一页 I 日操夜夜操 I 久久性色 I 日韩欧在线 I 国产深夜在线观看 I 免费的av I 18在线观看视频 I 他也色在线视频 I 亚洲熟女中文字幕男人总站 I 亚洲国产综合精品中文第一 I 人妻丰满熟av无码区hd I 新黄色网址 I 国产精品真实灌醉女在线播放 I 欧美巨大荫蒂茸毛毛人妖 I 国产一区欧美 I 欧洲亚洲1卡二卡三卡2021 I 国产亚洲欧美在线观看三区 I 97精品无人区乱码在线观看 I 欧美妇人 I 96精品在线视频 I 国产人免费视频在线观看 I 91麻豆国产福利在线观看

java io流學(xué)習(xí)總結(jié)

時(shí)間:2024-09-30 12:53:17 學(xué)習(xí)總結(jié) 我要投稿
  • 相關(guān)推薦

java io流學(xué)習(xí)總結(jié)

  一、什么是流?

java io流學(xué)習(xí)總結(jié)

  流就是字節(jié)序列的抽象概念,能被連續(xù)讀取數(shù)據(jù)的數(shù)據(jù)源和能被連續(xù)寫(xiě)入數(shù)據(jù)的接收端就是流,流機(jī)制是Java及C++中的一個(gè)重要機(jī)制,通過(guò)流我們可以自由地控制文件、內(nèi)存、IO設(shè)備等數(shù)據(jù)的流向。而IO流就是用于處理設(shè)備上的數(shù)據(jù),如:硬盤(pán)、內(nèi)存、鍵盤(pán)錄入等。IO流根據(jù)處理類(lèi)型的不同可分為字節(jié)流和字符流,根據(jù)流向的不同可分為輸入流和輸出流。

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

  字符流,因?yàn)槲募幋a的不同,就有了對(duì)字符進(jìn)行高效操作的字符流對(duì)象,它的原理就是基于字節(jié)流讀取字節(jié)時(shí)去查了指定的碼表。它和字節(jié)流的區(qū)別有兩點(diǎn):1.在讀取數(shù)據(jù)的時(shí)候,字節(jié)流讀到一個(gè)字節(jié)就返回一個(gè)字節(jié),字符流使用了字節(jié)流讀到一個(gè)或多個(gè)字節(jié)(一個(gè)中文對(duì)應(yīng)的字節(jié)數(shù)是兩個(gè),在UTF-8碼表中是3個(gè)字節(jié))時(shí),先去查指定的編碼表,再將查到的字符返回;2.字節(jié)流可以處理所有類(lèi)型的數(shù)據(jù),如jpg、avi、mp3、wav等等,而字符流只能處理字符數(shù)據(jù)。所以可以根據(jù)處理的文件不同考慮使用字節(jié)流還是字符流,如果是純文本數(shù)據(jù)可以?xún)?yōu)先考慮字符流,否則使用字節(jié)流。

  三、IO體系,所具備的基本功能就是讀和寫(xiě):

  1.字符流

  |-- Reader(讀)

  |-- Writer(寫(xiě))

  Reader

  |--InputStreamReader

  |--FileReader:用于處理文件的字符讀取流對(duì)象

  Writer

  |--OutputStreamWriter

  |--FileWriter:用于處理文件的字符寫(xiě)入流對(duì)象

  其實(shí)很容易就可以看出來(lái),IO體系中的子類(lèi)名后綴絕大部分是父類(lèi)名稱(chēng),而前綴則是體現(xiàn)子類(lèi)特有功能的名稱(chēng)。

  Reader中常見(jiàn)的方法:

  |--int read()

  讀取一個(gè)字符,并返回讀到的這個(gè)字符,讀到流的末尾則返回-1。

  |--int read(char[])

  將讀到的字符存入指定的數(shù)組中,返回的是讀到的字符個(gè)數(shù),

  讀到流的末尾則返回-1。

  |--close()

  讀取字符其實(shí)用的是window系統(tǒng)的功能,就希望使用完畢后,

  進(jìn)行資源的釋放。

  FileReader除了自己的構(gòu)造函數(shù)外沒(méi)有特有的方法:

  |--用于讀取文本文件的流對(duì)象。

  |--用于關(guān)聯(lián)文本文件。

  |--構(gòu)造函數(shù)FileReader(String fileName)

  在讀取流對(duì)象初始化時(shí),必須要指定一個(gè)被讀取的文件,

  如果該文件不存在則會(huì)發(fā)生FileNotFoundException異常。

  Writer中常見(jiàn)的方法:

  |--write()

  將一個(gè)字符寫(xiě)入到流中。

  |--write(char[])

  將一個(gè)字符數(shù)組寫(xiě)入到流中。

  |--writer(String)

  將一個(gè)字符寫(xiě)入到流中。

  |--flush()

  刷新流,將流中的數(shù)據(jù)刷新到目的地中,流還存在。

  |--close()

  關(guān)閉資源,在關(guān)閉錢(qián)會(huì)先調(diào)用flush(), 刷新流中的數(shù)據(jù)到目的地。

  FileWriter,除了自己的構(gòu)造函數(shù)外沒(méi)有特有的方法:

  |--該類(lèi)的特點(diǎn)

  |--用于處理文本文件

  |--沒(méi)有默認(rèn)的編碼表

  |--有臨時(shí)緩沖

  |--構(gòu)造函數(shù),在寫(xiě)入流對(duì)象初始化時(shí),必須要有一個(gè)存儲(chǔ)數(shù)據(jù)的目的地。

  |--FileWriter(String fileName),該構(gòu)造器是干什么用的呢?

  |--調(diào)用系統(tǒng)資源

  |--在指定位置創(chuàng)建一個(gè)文件,如果該文件已經(jīng)存在則被覆蓋。

  |--FileWriter(String filename,Boolean append),這構(gòu)造器的作用是?

  當(dāng)傳入的boolean類(lèi)型的值為true時(shí),會(huì)在指定文件末尾處進(jìn)行數(shù)據(jù)的續(xù)寫(xiě)。

  清單1,將文本數(shù)據(jù)保存到文件中代碼

  private static void test1(){

  FileWriter fw=null;

  try {

  //初始化FileWriter對(duì)象,指定文件名已經(jīng)存儲(chǔ)路徑

  fw=new FileWriter("D:/test.txt");

  fw.write("將字符串寫(xiě)入流");

  //將流中的數(shù)據(jù)刷新到目的地,流還在

  fw.flush();

  fw.write("將字符串寫(xiě)入流");

  } catch (IOException e) {

  e.printStackTrace();

  }finally{

  if(fw!=null){

  try {

  fw.close();

  } catch (IOException e1) {

  e1.printStackTrace();

  }

  }

  }

  }

  清單2,讀取一個(gè)已有文本文件,并將文本內(nèi)容打印出來(lái)代碼

  private static void test2(){

  FileReader fr=null;

  try {

  //初始化FileReader對(duì)象,指定文件路徑

  fr=new FileReader("D:/test.txt");

  int ch=0;

  while((ch=fr.read())!=-1){

  //每次讀取一個(gè)字符,直到讀到末尾-1為止

  System.out.println((char)ch);

  }

  } catch (IOException e) {

  e.printStackTrace();

  }finally{

  if(fr!=null){

  try {

  fr.close();

  } catch (IOException e1) {

  e1.printStackTrace();

  }

  }

  }

  }

  這樣每讀到一個(gè)字符就打印出來(lái),效率很不高,能不能按指定大小讀取完后再打印出來(lái)呢?答案是當(dāng)然可以的。

  清單3,讀取一個(gè)已有文本文件,讀完1kb再將其讀到的內(nèi)容打印出來(lái)代碼

  private static void test3(){

  FileReader fr=null;

  try {

  //初始化FileReader對(duì)象,指定文件路徑

  fr=new FileReader("D:/test.txt");

  char[] buf=new char[1024];

  int len=0;

  while((len=fr.read(buf))!=-1){

  //每次讀取1kb大小的字符,直到讀到末尾-1為止

  System.out.println(new String(buf,0,len));

  }

  } catch (IOException e) {

  e.printStackTrace();

  }finally{

  if(fr!=null){

  try {

  fr.close();

  } catch (IOException e1) {

  e1.printStackTrace();

  }

  }

  }

  }

  字符流的緩沖區(qū):

  |--緩沖區(qū)的出現(xiàn)提高了對(duì)流的操作效率。

  原理:其實(shí)就是將數(shù)組進(jìn)行封裝。

  |--對(duì)應(yīng)的對(duì)象

  |--BufferedWriter

  特有方法newLine(),跨平臺(tái)的換行符。

  |--BufferedReader

  特有方法readLine(),一次讀一行,到行標(biāo)記時(shí),將行標(biāo)記

  之前的字符數(shù)據(jù)作為字符串返回,讀到末尾返回null。

  |--說(shuō)明

  在使用緩沖區(qū)對(duì)象時(shí),要明確,緩沖的存在是為了增強(qiáng)流

  的功能而存在,所以在建立緩沖區(qū)對(duì)象時(shí),要先有流對(duì)象

  存在。其實(shí)緩沖區(qū)內(nèi)部就是在使用流對(duì)象的方法,只不過(guò)

  加入了數(shù)組對(duì)數(shù)據(jù)進(jìn)行了臨時(shí)存儲(chǔ),為了提高操作數(shù)據(jù)的

  效率。

  |--代碼上的體現(xiàn)

  |--寫(xiě)入緩沖區(qū)對(duì)象

  根據(jù)前面所說(shuō)的建立緩沖區(qū)時(shí)要先有流對(duì)象,并將其作為參數(shù)傳遞給緩沖區(qū)的構(gòu)造函數(shù)

  BufferedWriter bufw=new BufferedWriter(new FileWriter(“test.txt”));

  bufw.write(“將數(shù)據(jù)寫(xiě)入緩沖區(qū)”);

  bufw.flush();//將緩沖區(qū)的數(shù)據(jù)刷新到目的地

  bufw.close();//其實(shí)關(guān)閉的是被包裝在內(nèi)部的流對(duì)象

  |--讀取緩沖區(qū)對(duì)象

  BufferedReader bufr=new BufferedReader(new FileReader(“test.txt”));

  String line=null;

  while((line=bufr.readLine())!=null){

  //每次讀取一行,取出的數(shù)據(jù)不包含回車(chē)符

  system.out.println(line);

  }

  bufr.close();

  清單4,使用緩沖區(qū)對(duì)文本文件進(jìn)行拷貝代碼

  private static void test4(){

  BufferedReader bufr=null;

  BufferedWriter bufw=null;

  try {

  bufr=new BufferedReader(new FileReader("D:/a.txt"));

  bufw=new BufferedWriter(new FileWriter("D:/b.txt"));

  String line=null;

  while((line=bufr.readLine())!=null){

  bufw.write(line);//每次將一行寫(xiě)入緩沖區(qū)

  bufw.flush();//刷新到目的地

  }

  } catch (IOException e) {

  e.printStackTrace();

  }finally{

  try {

  if(bufw!=null){

  bufw.close();

  }

  if(bufr!=null){

  bufr.close();

  }

  } catch (IOException e1) {

  e1.printStackTrace();

  }

  }

  }

  仔細(xì)看可以發(fā)現(xiàn),程序里面的FileReader對(duì)象和FileWriter對(duì)象直接new出來(lái)且沒(méi)有調(diào)用close(),因?yàn)榫彌_對(duì)象調(diào)用了這兩個(gè)方法,前面說(shuō)了,緩沖對(duì)象調(diào)用的flush()和close()其實(shí)就是關(guān)閉被包裝在其內(nèi)部的流對(duì)象。關(guān)閉流的先后順序也要注意,如果流之間有依賴(lài)關(guān)系,則被依賴(lài)的流要后關(guān)閉。readLine()方法原理:其實(shí)緩沖區(qū)中的該方法,用的還是與緩沖區(qū)關(guān)聯(lián)的流對(duì)象的read方法,只不過(guò),每一次讀到一個(gè)字符先不進(jìn)行具體操作,先進(jìn)行臨時(shí)存儲(chǔ),當(dāng)讀到回車(chē)標(biāo)記時(shí),將臨時(shí)容器中存儲(chǔ)的數(shù)據(jù)一次性返回。我們可以根據(jù)這個(gè)原理來(lái)自己編寫(xiě)一個(gè)緩沖區(qū)對(duì)象。

  清單5,編寫(xiě)一個(gè)自己的bufferedreader代碼

  public class MyBufferedReader {

  private Reader reader;

  public MyBufferedReader(Reader reader){

  this.reader=reader;

  }

  public String readLine() throws IOException{

  StringBuilder sb=new StringBuilder();

  int ch=0;

  while((ch=reader.read())!=-1){

  if(ch=='\r'){//空格則繼續(xù)

  continue;

  }else if(ch=='\n'){//每次返回一行

  return sb.toString();

  }else{

  sb.append((char)ch);

  }

  }

  return sb.toString();

  }

  public void close() throws IOException{

  //緩沖對(duì)象的關(guān)閉方法其實(shí)就是調(diào)用流本身的close()

  reader.close();

  }

  }

  測(cè)試時(shí)把清單4的BufferedReader對(duì)象替換成MyBufferedReader對(duì)象即可。

  清單6,測(cè)試mybufferedreader代碼

  private static void test4(){

  MyBufferedReader bufr=null;

  BufferedWriter bufw=null;

  try {

  bufr=new MyBufferedReader(new FileReader("D:/a.txt"));

  bufw=new BufferedWriter(new FileWriter("D:/b.txt"));

  String line=null;

  while((line=bufr.readLine())!=null){

  bufw.write(line);//每次將一行寫(xiě)入緩沖區(qū)

  bufw.flush();//刷新到目的地

  }

  } catch (IOException e) {

  e.printStackTrace();

  }finally{

  try {

  if(bufw!=null){

  bufw.close();

  }

  if(bufr!=null){

  bufr.close();

  }

  } catch (IOException e1) {

  e1.printStackTrace();

  }

  }

  }

  其實(shí)我們自己寫(xiě)的這個(gè)緩存對(duì)象就是對(duì)Reader對(duì)象進(jìn)行了功能的增強(qiáng),Reader對(duì)象每次只能返回一個(gè)字符,而增強(qiáng)了功能之后該類(lèi)就可以每次返回一行字符,也就是設(shè)計(jì)模式中所說(shuō)的裝飾模式。

【java io流學(xué)習(xí)總結(jié)】相關(guān)文章:

java工作總結(jié)03-23

JAVA試用期工作總結(jié)02-20

java工程師工作總結(jié)04-10

java年終工作總結(jié)05-07

java程序員轉(zhuǎn)正工作總結(jié)05-10

Java實(shí)習(xí)報(bào)告范文03-22

JAVA轉(zhuǎn)正申請(qǐng)書(shū)02-02

JAVA工程求職信03-19

java個(gè)人年終工作總結(jié)05-19

主站蜘蛛池模板: 成人性生交大片免费看r链接 | 熟女体下毛毛黑森林 | 亚洲第一伊人 | 欧美一区二区在线看 | 毛片wwww | 奴色虐av一区二区三区 | 国产亚洲精品一品区99热 | 韩国乱码片免费看 | 久久国产精品99精品国产987 | 亚洲色自偷自拍另类小说 | 国产精品99久久久久久人 | 一区二区的视频 | 欧美日韩福利视频 | 国产人19毛片水真多19精品 | 黄色aaa视频 | 亚洲美女免费视频 | 成人羞羞国产免费网站 | 国产91色在线 | 二区欧美 | 欧美精品久久久久久久监狱 | 激情视频亚洲 | 国产最黄视频 | 日本黄页网站免费观看 | 伊人久久噜噜噜躁狠狠躁 | 国产精品一品二区三区的使用体验 | 国产精品久久久久久亚洲 | 亚洲乱色熟女一区二区三区丝袜 | 欧美伊人 | 国产成人久久精品一区二区三区 | 欧美丰满熟妇hdxx | 尤物视频在线观看免费 | 97精品欧美一区二区三区 | 黑森林福利视频导航 | 啪啪69xxⅹ偷拍 | 亚洲影院天堂中文av色 | 四虎成人欧美精品在永久在线 | 欧美啊v在线观看 | 国产亚洲小视频 | 国产一区二区三区免费视频 | 国产色多传媒网站 | 全部免费的黄色毛片 | 国产午夜精品视频 | 国产精品拍天天在线 | 欧美午夜理伦三级在线观看吃奶汁 | 日本怡春院一区二区三区 | 精品久久久无码人妻字幂 | 在阳台上玩弄人妻的乳球 | 欧美黑人性猛交xxxx | 日日激情综合久久一区 | 激情视频免费在线观看 | 99免费在线观看 | 国产精品一区理论片 | 一级大片黄色 | 在线观看的网址 | 日韩av免费大片 | 日本成人激情视频 | 欧美国产激情二区三区 | 2018亚洲а∨天堂 | 国产成人无码精品久久久免费 | 久久亚洲私人国产精品va | 久草在线高清视频 | 中国性欧美videofree精品 | av黄在线播放 | 骚片av蜜桃精品一区 | 亚洲国产初高中生女av | 四虎精品免费永久免费视频 | 日本一二三区在线观看 | 欧美人与动牲交精品 | 国产精品国产三级国产aⅴ浪潮 | 最近更新中文字幕 | 欧美日韩综合在线观看 | 日本人与黑人做爰的视频 | 欧美午夜精品理论片a级按摩 | 六月伊人 | 99久久婷婷国产综合 | 欧美高清性色生活片 | 真人二十三式性视频(动) | 日韩欧美色综合 | 小婷又软又嫩又紧水又多的视频 | 成人欧美一区二区三区黑人孕妇 | 欧美黄色a级大片 | 久久久成人av | 久久久免费观看 | 少妇无内裤下蹲露大唇92 | 韩日激情视频 | 五月婷婷综合在线视频 | 欧美制服在线 | 女人18毛片一区二区三区 | 国语自产精品视频在 视频 亚洲人成网在线 | 99精品久久99久久久久胖女人 | 久久精品国产亚洲无删除 | 亚洲三区视频 | 大中国免费视频大全在线观看 | 青青久久av北条麻妃黑人 | 日韩精品无码免费专区网站 | 天天射天天干天天 | 免费av在线播放网址 | 美女裸体自慰在线观看 | 成年免费在线视频 |