1. 程式人生 > >位元組流與字元流的詳解,檔案流,資料流

位元組流與字元流的詳解,檔案流,資料流

首先看一下File類的常用方法

•File類的物件不但可以表示檔案,還可以表示目錄,在程式中一個File類物件可以代表一個檔案或目錄; •當建立一個檔案物件後,就可以利用它來對檔案或目錄的屬性進行操作,如:檔名、最後修改日期、檔案大小等等; 需要注意的是,File物件並不能直接對檔案進行讀/寫操作,只能檢視檔案的屬性;

方 法 原 型

說    明

boolean exists()

判斷檔案是否存在,存在返回true,否則返回false

boolean isFile()

判斷是否為檔案,是檔案返回true,否則返回false

boolean isDirectory()

判斷是否為目錄,是目錄返回true,否則返回false

String getName()

獲得檔案的名稱

String getAbsolutePath()

獲得檔案的絕對路徑

long length()

獲得檔案的長度(位元組數

boolean createNewFile()

throws IOException

建立新檔案,建立成功返回true,否則返回false,有可能丟擲IOException異常,必須捕捉

boolean delete()

刪除檔案,刪除成功返回true,否則返回false

File[] listFiles()

返回資料夾內的子檔案與子資料夾的陣列

File類示例

package file;


import java.io.File;


public class FileDemo {


public static void main(String[] args) {
File file = new File("test.txt");
System.out.println("檔案或目錄是否存在:"+file.exists());
System.out.println("是檔案嗎:"+file.isFile());
System.out.println("是目錄嗎:"+file.isDirectory());
System.out.println("名稱:"+file.getName());
System.out.println("絕對路徑:"+file.getAbsolutePath());
System.out.println("檔案大小:"+file.length());
System.out.println("獲取自由空間的大小"+file.getFreeSpace());
System.out.println("有資料夾嗎"+file.mkdirs());
System.out.println("有父檔案嗎"+file.getParentFile());
System.out.println("可以寫嗎"+file.canWrite());
System.out.println("是可執行檔案嗎"+file.setExecutable(false));
}


}

•根據流動方同,流分為輸入流向的不和輸出流; •對於輸入和輸出流,由於傳輸格式的不同,又分為位元組流和字元流: –位元組流是指8位的通用位元組流,以位元組為基本單位,在java.io包中,對於位元組流進行操作的類大部分繼承於InputStream(輸入位元組流)類和OutputStream(輸出位元組流)類; –字元流是指16位的Unicode字元流,以字元(兩個位元組)為基本單位,非常適合處理字串和文字,對於字元流進行操作的類大部分繼承於Reader(讀取流)類和Writer(寫入流)類。
•FileInputStream類稱為檔案輸入流,繼承於InputStream類,是進行檔案讀操作的最基本類; •它的作用是將檔案中的資料輸入到記憶體中,我們可以利用它來讀檔案; •由於它屬於位元組流,因此在讀取Unicode字元(如中文)的檔案時可能會出現問題。
•FileInputStream類和FileOutputStream類是成對出現的,一個進行輸入(讀檔案)操作,一個進行輸出(寫檔案)操作; •由於採用位元組方式進行資料傳輸,不必考慮資料的格式問題,這兩個類對檔案操作的效率較高; •可以使用這兩個類完成複製檔案的操作。

複製檔案示例

publicclass CopyFileDemo {

  public static void main(String[] args)throws IOException {

    File srcFile =new File("src.dat");    //原始檔物件

    File destFile =new File("dest.dat");  //目標檔案物件

    if (!(destFile.exists())){  //判斷目標檔案是否存在

      destFile.createNewFile();  //如果不存在則建立新檔案

    }

    //使用原始檔物件建立檔案輸入流物件

    FileInputStreamfis =new FileInputStream(srcFile);

    //使用目標檔案物件建立檔案輸出流物件

    FileOutputStreamfos =new FileOutputStream(destFile);

    byte[] buf =new byte[1024];  //建立位元組陣列,作為臨時緩衝

    System.out.println("開始複製檔案...");

    while (fis.read(buf) !=-1) {  //迴圈從檔案輸入流中讀取資料

      fos.write(buf);    //寫入到檔案輸出流中

    }

    System.out.println("檔案複製成功!");

    fis.close();    //關閉流

    fos.close();

  }

}

***************************************************************************************下面來看字元流***************************************************************************

•FileInputStream類和FileOutputStream類雖然可以高效率地讀/寫檔案,但對於Unicode編碼的檔案,使用它們有可能出現亂碼;
•考慮到Java是跨平臺的語言,要經常操作Unicode編碼的檔案,使用字元流操作檔案是有必要的;
•使用字元流將涉及到以下4個類:
–FileReader類和FileWriter類;
BufferedReader類和BufferedWriter類

FileReader類稱為檔案讀取流,允許以字元流的形式對檔案進行讀操作
•該類將從檔案中逐個地讀取字元,效率比較低下,因此一般將該類物件包裝到緩衝流中進行操作。BufferedReader類主要為字元流提供緩衝

FileReader配合BufferedReader讀檔案

public class RraderDemo

{

  public static voidmain(String[] args)throws IOException

  {

    File file =new File("test.txt");

    //通過檔案物件建立檔案讀取流物件

    FileReaderfr =new FileReader(file);

    //將檔案讀取流包裝成緩衝讀取流

    BufferedReaderbr =new BufferedReader(fr);

    String str;

    while ((str = br.readLine())!= null)  //逐行讀取資料

    {

      System.out.println(str);

    }

    br.close();   //關閉流

    fr.close();   //關閉流

  }

}

FileWriter類稱為檔案寫入流,以字元流的形式對檔案進行寫操作
與FileReader類相似,FileWriter類同樣需要使用緩衝流進行包裝FileWriter配合BufferedWriter寫檔案示例

public class WriterDemo

{

  public static voidmain(String[] args)throws IOException

  {

    File file =new File("test.txt");

    //通過檔案物件建立檔案輸出字元流物件

    FileWriterfw =new FileWriter(file);

    //將檔案輸出字元流包裝成緩衝流

    BufferedWriterbw =new BufferedWriter(fw);

    bw.write("大家好!");

    bw.write("我正在學習Java。");

    bw.newLine();    //換個新行

    bw.write("請多多指教。");

    bw.newLine();    //換新行

    bw.write("[email protected]");

    bw.close();      //關閉流

    fw.close();      //關閉流

  }

}

從控制檯接受輸入

•System.in的read方法可以從控制檯接受輸入;
•但由於in實際上是一個InputStream類的物件,它只能以位元組形式接收資料,並且一次只能接受一個位元組,這使輸入操作很不便;
•必須將System.in進行處理,才可以順利地從控制檯接受輸入,這將使用到:
–InputStreamReader類
–BufferedReader類

InputStreamReader類用於將InputStream型別的位元組輸入流物件轉換成Reader型別的字元讀取流物件;

•可以使用它來轉換System.in,如:

  InputStreamReaderisr =new InputStreamReader(System.in);

•這樣的字元流效率很低,再使用BufferedReader類來為其建立緩衝,如:

   BufferedReaderbr =new BufferedReader(isr);

•這樣,就可以從控制檯接受輸入了。

從控制檯接受輸入示例

publicclass ConsoleInputDemo

{

  public static void main(String[] args)throws IOException

  {

    //將System.in轉化成字元流物件

    InputStreamReaderisr =new InputStreamReader(System.in);

    //用緩衝流進行包裝

    BufferedReaderbr =new BufferedReader(isr);

    System.out.println("請輸入您的姓名:");

    String name = br.readLine();  //接受輸入

    System.out.println("請輸入您的年齡:");

    int age= Integer.parseInt(br.readLine());  //接受輸入

    System.out.println("您的姓名:"+ name);

    System.out.println("您的年齡:"+ age);

    br.close();   //關閉流

    isr.close();  //關閉流

  }

}

從控制檯輸入並寫入到檔案示例

/*本例從控制檯接受輸入,然後寫入到檔案中,直到使用者輸入"!!!"為止*/

File file =new File("input.txt");   //建立檔案物件

if (!file.exists())                  //判斷該檔案是否存在,如果不存在則建立新檔案

{

    file.createNewFile();

}

FileWriterfr =new FileWriter(file);   //針對檔案物件建立檔案寫入流物件

BufferedWriterbw =new BufferedWriter(fr);   //為檔案寫入流建立緩衝流

//將控制檯輸入物件轉化成字元流,並建立緩衝流

BufferedReader bin = new BufferedReader(new InputStreamReader(System.in));

String str = bin.readLine();    //接受從控制檯輸入的一行字串

while (!(str.equals("!!!")))    //如果輸入"!!!"則代表輸入結束

{

    bw.write(str);              //將從控制檯輸入的字串寫入到檔案中

    bw.newLine();               //換新行

    str = bin.readLine();       //再從控制檯接受輸入

}

//關閉所有已經開啟的流

bw.close();

fr.close();

bin.close();

基本資料型別的讀/寫

•FileInputStream和FileOutputStream在讀寫檔案時不考慮資料的型別;
•FileWriter和FileReader在讀寫檔案時,將所有的資料都看做字元;
但有時候,我們需要將各種型別的資料寫入檔案或是從檔案中讀取,DataInputStream類和DataOutputStream類可以滿足需要

DataInputStream類

•DataInputStream類可以輸入任何型別的資料,但它不可以單獨使用,需要要配合其它位元組輸入流一起使用;

//將檔案輸入流包裝成資料輸入流,以便從檔案中讀取各種型別的資料
  FileInputStream fis = newFileInputStream("data.dat");
  DataInputStreamdis = new DataInputStream(fis);

DataInputStream類的常用方法

方 法 原 型

說    明

final boolean readBoolean()

throws IOException

從資料輸入流中讀取一個boolean型資料

final char readChar()

throws IOException

從資料輸入流中讀取一個char型資料

final int readInt()

throws IOException

從資料輸入流中讀取一個int型資料

final long readLong()

throws IOException

從資料輸入流中讀取一個long型資料

final float readFloat()

throws IOException

從資料輸入流中讀取一個float型資料

final double readDouble()

throws IOException

從資料輸入流中讀取一個double型資料


•DataOutputStream類可以輸出任何型別的資料,同樣也需要配合其他位元組輸出流一起使用;//將檔案輸出流包裝成資料輸出流,以便往檔案中寫入各種型別的資料
  FileOutputStreamfos = new FileOutputStream("data.dat");
  DataOutputStream dos = new DataOutputStream(fos);

DataOutputStream類的常用方法

方 法 原 型

說    明

final void writeBoolean(boolean v)

throws IOException

往資料輸出流中寫入一個boolean型資料

final void writeChar(char v)

throws IOException

往資料輸出流中寫入一個char型資料

final void writeInt(int v)

throws IOException

往資料輸出流中寫入一個int型資料

final void writeLong(long v)

throws IOException

往資料輸出流中寫入一個long型資料

final void writeFloat(float v)

throws IOException

往資料輸出流中寫入一個float型資料

final void writeDouble(double v)

throws IOException

往資料輸出流中寫入一個double型資料

總結:

•java.io包是Java內建的包,其中包含一系列對輸入/輸出進行操作的類;
•File類的物件可以訪問檔案(或目錄)的屬性,但不可以進行讀/寫操作;
•從方向上講,流分為輸入流和輸出流,但從格式上區分的話,流分為位元組流和字元流
•使用FileInputStream類和FileOutputStream類以位元組流方式對檔案進行讀/寫操作,這是操作檔案最基本的兩個類;

•FileReader類和FileWriter類配合BufferedReader類和BufferedWriter類可以以字元流方式對檔案進行讀/寫操作;
•從控制檯接受輸入要使用到InputStreamReader類和BufferedReader類;
•DataInputStream類和DataOutputStream類允許讀/寫各種基本資料型別;
絕大部分的IO操作都可能丟擲IOException

相關推薦

C++ 字串字元陣列

在C++中,有兩種型別的字串表示形式: C-風格字串 C++引入的string類 C-風格字串 C 風格的字串起源於 C 語言,並在 C++ 中繼續得到支援。字串實際上是使用 null 字元 ‘\0’ 終止的一維字元陣列。因此,一個以 null 結

位元組位元序

位元組序的定義 位元組序就是說一個物件的多個位元組在記憶體中如何排序存放,比如我們要想往一個地址a中寫入一個整形資料0x12345678,那麼最後在記憶體中是如何存放這四個位元組的呢?  0x12這個位元組值為最高有效位元組,也就是整數值的最高位(在

串列埠引數:波特率資料停止位奇偶校驗位

簡介 串列埠是一種非常通用的裝置通訊的協議(不要與通用序列匯流排Universal Serial Bus(USB)混淆)。大多數計算機包含兩個基於RS232的串列埠。串列埠同時也是儀器儀表裝置通用的通訊協議;很多GPIB相容的裝置也帶有RS-232口。同時,串列埠通訊協

位元組字元,檔案資料

首先看一下File類的常用方法 •File類的物件不但可以表示檔案,還可以表示目錄,在程式中一個File類物件可以代表一個檔案或目錄; •當建立一個檔案物件後,就可以利用它來對檔案或目錄的屬性進行操作,如:檔名、最後修改日期、檔案大小等等; 需要注意的是,File物件

位元組字元的區別

位元組流與字元流 先來看一下流的概念: 在程式中所有的資料都是以流的方式進行傳輸或儲存的,程式需要資料的時候要使用輸入流讀取資料,而當程式需要將一些資料儲存起來的時候,就要使用輸出流完成。 程式中的輸入輸出都是以流的形式儲存的,流中儲存的實際上全都是位元組檔案。 位元組流與字元流

位元組字元區別

先來看一下流的概念: 在程式中所有的資料都是以流的方式進行傳輸或儲存的,程式需要資料的時候要使用輸入流讀取資料,而當程式需要將一些資料儲存起來的時候,就要使用輸出流完成。 程式中的輸入輸出都是以流的形式儲存的,流中儲存的實際上全都是位元組檔案。 位元組流與字元流

Java位元組字元的區別

先來看一下流的概念: 在程式中所有的資料都是以流的方式進行傳輸或儲存的,程式需要資料的時候要使用輸入流讀取資料,而當程式需要將一些資料儲存起來的時候,就要使用輸出流完成。 程式中的輸入輸出都是以流的形式儲存的,流中儲存的實際上全都是位元組檔案。 位元組流與字元流

位元組字元位元組字元的使用哪個多? java 讀寫操作大檔案 BufferedReader和RandomAccessFile

一 首先我們要知道 在程式中所有的資料都是以流的方式進行傳輸或儲存的   而流有兩種 位元組流用來處理位元組或二進位制物件 字元流主要用來處理字元或字串,一個字元佔兩個位元組 而上一篇的java 讀寫操作大檔案 BufferedReader和RandomAccessFile Buf

檔案時輸入ifstream中函式tellg()seekg()的示例

讀取檔案時有時會需要回退 比如讀完第n行想回退到第n-1行再讀一次n行 或者讀字元時想回退到n個字元之前都可以使用tellg()和seekg() tellg() 用於在輸入流中獲取位置 seekg()用於設定在輸入流中的位置 其實本質上檔案讀寫就是一個指標指向檔案中某個

java 位元組字元的區別 什麼是緩衝區

位元組流與和字元流的使用非常相似,兩者除了操作程式碼上的不同之外,是否還有其他的不同呢?實際上位元組流在操作時本身不會用到緩衝區(記憶體),是檔案本身直接操作的,而字元流在操作時使用了緩衝區,通過緩衝區再操作檔案,如圖所示。   下面以兩個寫檔案的操作為主進行比較,但是在操作時位元組流和字元流的

雜談——探祕位元組字元

正所謂,一切事情皆有緣由。而程式中的所有資料,自然也有它自己的流。(哈哈,強行押韻最為致命 ヽ(✿゚▽゚)ノ) 今天我們要認識的就是位元組流和字元流這兩個小兔崽子。 想要認識它們,我們就得先獲得“流”這本祕籍,去看看“流”到底是什麼。 1.流是什麼呢? 要知道,在程式中所有的資

Java之路:位元組字元

儘管可以使用File進行檔案的操作,但是如果要進行檔案內容的操作,在Java之中就必須通過兩類流操作完成。 Java的流操作分為位元組流和字元流兩種。 字元流處理的物件單元是Unicode字元,每個Unicode字元佔據2個位元組,而位元組流輸入輸出的資料是以單個位元組(Byte

位元組字元的區別

要把一段二進位制資料資料逐一輸出到某個裝置中,或者從某個裝置中逐一讀取一段二進位制資料,不管輸入輸出裝置是什麼,我們要用統一的方式來完成這些操作,用一種抽象的方式進行描述,這個抽象描述方式起名為IO流,對應的抽象類為OutputStream和InputStream,不同的實現

Java 高階程式設計-IO位元組字元

1. 簡介 2. 位元組輸出流OutputStream 3. 位元組輸入流InputStream 4. 字元輸出流Writer 5. 字元輸入流Reader 6. 位元組流與字元流的區別 7. 轉

java 位元組字元的區別

位元組流與和字元流的使用非常相似,兩者除了操作程式碼上的不同之外,是否還有其他的不同呢? 實際上位元組流在操作時本身不會用到緩衝區(記憶體),是檔案本身直接操作的,而字元流在操作時使用了緩衝區,通過緩衝區再操作檔案,如圖12-6所示。 下面以兩個寫檔案的操作為主進行比較,但是

javaI/O——位元組字元

位元組流與字元流 一、流操作簡介 在java.io包中流分為兩種: (1)位元組流:InputStream、OutputStream 注意區分我們的InputStream和OutputStream, OutputStream:這是輸出內容到檔案中(就相當於是我們的Writer寫東西到檔案中)

io學習之位元組字元之間的轉換

一、 public class TypeToChar { /** 位元組流轉換成字元流* * 1、位元組流轉換成位元組流的物件,(InputStreamReader(叫做轉換流):作用:就是位元組流通* 向字元流之間轉換的橋樑,位元組流和字元流的轉換存在著編碼的方式。*

位元組字元的區別及相互轉換

轉載:http://www.cnblogs.com/sjjsh/p/5269781.html 先來看一下流的概念:      在程式中所有的資料都是以流的方式進行傳輸或儲存的,程式需要資料的時候要使用輸入流讀取資料,而當程式需要將一些資料儲存起來的時候,就要使用輸出流完成。      程式中的輸入輸出都是以

javaCV開發之4:轉器實現(也可作為本地收器、推新增新增圖片及文字水印視訊影象幀儲存)實現rtsp/rtmp/本地檔案轉發到rtmp媒體伺服器(基於javaCV-FFMPEG)

javaCV系列文章: 補充篇: 歡迎大家積極開心的加入討論群 javacpp-ffmpeg: 前言: 本章基於javaCV實現轉流器和收流器功能,測試採用監控rtsp地址轉發至rtmp伺服器地址 新增openCV儲存圖片功能。 補充:

黑馬程式設計師:位元組字元的轉換/ObjectOutputStream;ObjectInputStream

ObjectInputStream和 ObjectOutputStream這兩個包裝類,              用於從底層輸入流中讀取物件型別的資料和將物件型別的資料寫入到底層輸出流。ObjectInputStream與ObjectOutputSream類所讀寫的物件必須