1. 程式人生 > >java中常見的輸入輸出流案例學習(一)

java中常見的輸入輸出流案例學習(一)

位元組輸入輸出流

1.FileInputStream[檔案位元組輸入流]->讀取檔案內容

用途:從檔案系統中的檔案獲得輸入位元組,常用於讀取影象、聲音等原始位元組流,讀取字元流可考慮使用FileReader

構造方法:

構造方法摘要

          通過開啟一個到實際檔案的連線來建立一個 FileInputStream,該檔案通過檔案系統中的 File 物件file 指定。

          通過使用檔案描述符 fdObj 建立一個 FileInputStream,該檔案描述符表示到檔案系統中某個實際檔案的現有連線。

          通過開啟一個到實際檔案的連線來建立一個 FileInputStream
,該檔案通過檔案系統中的路徑名 name 指定。
常用方法:
方法摘要

          返回下一次對此輸入流呼叫的方法可以不受阻塞地從此輸入流讀取(或跳過)的估計剩餘位元組數。
close()
          關閉此檔案輸入流並釋放與此流有關的所有系統資源。

          確保在不再引用檔案輸入流時呼叫其 close 方法。
getFD()
          返回表示到檔案系統中實際檔案的連線的 FileDescriptor 物件,該檔案系統正被此 FileInputStream 使用。
read()
          從此輸入流中讀取一個數據位元組。
read
(byte[] b)

          從此輸入流中將最多 b.length 個位元組的資料讀入一個 byte 陣列中。
read(byte[] b, int off, int len)
          從此輸入流中將最多 len 個位元組的資料讀入一個 byte 陣列中。
skip(long n)
          從輸入流中跳過並丟棄 n 個位元組的資料。

這裡介紹一個最常見的方法:

read(byte[] b, int off, int len)
          從此輸入流中將最多 len 個位元組的資料讀入一個 byte 陣列中。

->off:b位元組陣列中的偏移量

小知識:陣列偏移量,比如a[1,2,3,4,5]陣列,預設陣列第一個應該指向a[0],若偏移量為2,則指向a[1]

案例:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			int b;
			// 建立輸入流
			FileInputStream readfile = new FileInputStream("E:\\test.txt");
			byte buffer[] = new byte[2500];// 建立位元組陣列
			// 從輸入流中讀取位元組並存入buffer陣列中,最長讀取2500個位元組,返回值b為實際讀取的長度
			b = readfile.read(buffer, 1, 2000);// 1為buffer陣列中的起始偏移量
			String str = new String(buffer, 0, b, "Default");
			System.out.println(str);
			System.out.println(b);
			readfile.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

2014年8月18日22:14:01

2.FileOutputStream[檔案位元組輸出流]->向檔案寫入資訊

用途:可以向影象等原始位元組檔案中寫入資訊

建構函式:


          建立一個向指定 File 物件表示的檔案中寫入資料的檔案輸出流,覆蓋原有資料
(File file, boolean append)
          建立一個向指定 File 物件表示的檔案中寫入資料的檔案輸出流,append為true,保持原有資料,追加至末尾

          建立一個向指定檔案描述符處寫入資料的輸出檔案流,該檔案描述符表示一個到檔案系統中的某個實際檔案的現有連線。

          建立一個向具有指定 name 的檔案中寫入資料的輸出檔案流,,append為true,保持原有資料,追加至末尾
常用方法:
方法摘要
close()
          關閉此檔案輸出流並釋放與此流有關的所有系統資源。

          清理到檔案的連線,並確保在不再引用此檔案輸出流時呼叫此流的 close 方法。
getFD()
          返回與此流有關的檔案描述符。
write(byte[] b)
          將 b.length 個位元組從指定 byte 陣列寫入此檔案輸出流中。
write(byte[] b, int off, int len)
          將指定 byte 陣列中從偏移量 off 開始的 len 個位元組寫入此檔案輸出流。
write(int b)
          將指定位元組寫入此檔案輸出流。
案例:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Test {
	public static void main(String[] args) {
		try {
			int b;
			File file = new File("E:\\test.txt");
			// 建立輸入流
			FileInputStream readfile = new FileInputStream(file);
			byte buffer[] = new byte[2500];// 建立位元組陣列
			// 從輸入流中讀取位元組並存入buffer陣列中,最長讀取2500個位元組,返回值b為實際讀取的長度
			b = readfile.read(buffer, 1, 2000);// 1為buffer陣列中的起始偏移量
			String str = new String(buffer, 0, b, "Default");
			System.out.println(str);
			readfile.close(); // 關閉流
			// 建立一個輸出流,true表示保留檔案原有資料,新資料追加到結尾處
			FileOutputStream writefile = new FileOutputStream(file, true);
			writefile.write(buffer, 0, b);
			writefile.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

字元輸入輸出流

1.FileReader[字元輸入流]->以字元為單位讀取檔案內資料資訊

2.FileWriter[字元輸出流]->以字元為單位向輸出流中寫入資訊

上述兩個流操作,構造方法,常用函式均與位元組流類似,只不過一個處理位元組,一個處理字元,使用方法也很相近,主要是針對文字化的檔案進行操作,而位元組流主要處理影象,視訊,聲音等原始位元組檔案資料,直接貼一個程式碼吧!

import java.io.FileReader;
import java.io.FileWriter;

public class Test {
	public static void main(String[] args) {
		try {
			// 字元輸入流,讀取檔案資訊
			FileReader fileread = new FileReader("F:\\test.txt");
			char[] cbuf = new char[500];
			int b = fileread.read(cbuf, 0, 500);
			System.out.println(String.valueOf(cbuf));
			fileread.close();
			// 字元輸出流,想輸出流中寫入資訊,並且保留原有資料,追加資料值末尾處
			FileWriter filewriter = new FileWriter("F:\\test.txt", true);
			filewriter.write(cbuf);
			filewriter.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

2014年8月21日23:31:09

這篇文章寫到這,我突然感覺,我一直忽略了一個很重要的類:File

檔案類File:

我們首先介紹一下檔案,我想,檔案這個名詞,很抽象,但是缺非常容易理解,小弟不才沒法用文字描述出來呢,在這裡我介紹一下檔案的簡單分類吧:

檔案的分類:根據我們程式對檔案的訪問方式不同,大致的可以分為一下三個類別:

1.順序檔案(Sequential File):這一類檔案一行代表一條資料,按序排列的,每條資料或者記錄的長度是不限制的,可長可段,訪問檔案內容必須追條進行訪問。

2.隨機檔案(Random Access File):這種型別檔案最大的特點就是每條資料或者記錄的長度是固定一樣的,可以任意次序的對檔案中記錄進行操作,同時,每一條記錄都有一個唯一的記錄號(ID)與之對應,也就是說,只要知道記錄號就可以對其進行訪問的。

3.二進位制檔案(Binary File):這個在我們電腦中最常見不過了,它是位元組的集合,直接存取的是二進位制碼,對於二進位制檔案的訪問時通過位元組數來定位資料的,沒有資料型別。

介紹了檔案的分類,就切入正題吧,File類的一些基本資訊

在Java語言中,訪問檔案或者目錄,我們都可以通過File類來訪問,甚至可以訪問一個壓根不存在的東西,或者說什麼都不是也行,我們建立了一個File的例項,也就是File物件之後,如果是一個目錄,那麼我們可以建立和刪除目錄,也可以顯示這個目錄下的檔案清單,如果這個物件時檔案物件話,這點需要注意,這裡我們只可以訪問儲存的目錄資訊,檔案基本屬性,比如檔名和檔案型別,修改檔名資訊等,是不能夠進行檔案的複製,讀取,也就是說我們是不能夠對檔案的內容進行操作的,這個就屬於流操作了,下面簡單介紹一下File的簡單建構函式和常用的方法吧!作為一個初學者,這些東西,我都是在API裡面看的,我也是E文盲,我只能看大牛們翻譯的啦!

File類基礎資訊:

1.建構函式資訊:

構造方法摘要
File(File parent,String child)
          根據 parent 抽象路徑名和 child 路徑名字串建立一個新 File 例項。
File(String pathname)
          通過將給定路徑名字串轉換為抽象路徑名來建立一個新 File 例項。----這個方法最常用了,我覺得
File(String parent,String child)
          根據 parent 路徑名字串和 child 路徑名字串建立一個新 File 例項。
File(URI uri)
          通過將給定的 file: URI 轉換為一個抽象路徑名來建立一個新的 File 例項。
2.常用欄位介紹
欄位摘要

          與系統有關的路徑分隔符,為了方便,它被表示為一個字串。

          與系統有關的預設名稱分隔符,為了方便,它被表示為一個字串。WIN下是"\",Linux下是“/”,這個最常用
3.常用方法
方法摘要

          測試應用程式是否可以執行此抽象路徑名錶示的檔案。

          測試應用程式是否可以讀取此抽象路徑名錶示的檔案。

          測試應用程式是否可以修改此抽象路徑名錶示的檔案。
(File pathname)
          按字母順序比較兩個抽象路徑名。

          當且僅當不存在具有此抽象路徑名指定名稱的檔案時,不可分地建立一個新的空檔案。

          在預設臨時檔案目錄中建立一個空檔案,使用給定字首和字尾生成其名稱。

           在指定目錄中建立一個新的空檔案,使用給定的字首和字尾字串生成其名稱。

          刪除此抽象路徑名錶示的檔案或目錄。

          在虛擬機器終止時,請求刪除此抽象路徑名錶示的檔案或目錄。

          測試此抽象路徑名與給定物件是否相等。

          測試此抽象路徑名錶示的檔案或目錄是否存在。

          返回此抽象路徑名指定的分割槽中未分配的位元組數。

          返回由此抽象路徑名錶示的檔案或目錄的名稱。

          返回此抽象路徑名父目錄的路徑名字串;如果此路徑名沒有指定父目錄,則返回 null

          返回此抽象路徑名父目錄的抽象路徑名;如果此路徑名沒有指定父目錄,則返回 null

          將此抽象路徑名轉換為一個路徑名字串。

          返回此抽象路徑名指定的分割槽上可用於此虛擬機器的位元組數。

          計算此抽象路徑名的雜湊碼。

          測試此抽象路徑名是否為絕對路徑名。

          測試此抽象路徑名錶示的檔案是否是一個目錄

          測試此抽象路徑名錶示的檔案是否是一個標準檔案

          測試此抽象路徑名指定的檔案是否是一個隱藏檔案。

          返回此抽象路徑名錶示的檔案最後一次被修改的時間。這個經常用到,比如我們通過定時修改檔案資訊,我寫過一個關於定時生成Html的文章,這裡用到了

          返回由此抽象路徑名錶示的檔案的長度。
list()
          返回一個字串陣列,這些字串指定此抽象路徑名錶示的目錄中的檔案和目錄

          返回一個字串陣列,這些字串指定此抽象路徑名錶示的目錄中滿足指定過濾器的檔案和目錄。

          返回一個抽象路徑名陣列,這些路徑名錶示此抽象路徑名錶示的目錄中的檔案。返回一個File陣列

          返回抽象路徑名陣列,這些路徑名錶示此抽象路徑名錶示的目錄中滿足指定過濾器的檔案和目錄。

          返回抽象路徑名陣列,這些路徑名錶示此抽象路徑名錶示的目錄中滿足指定過濾器的檔案和目錄。
mkdir()
          建立此抽象路徑名指定的目錄。

          建立此抽象路徑名指定的目錄,包括所有必需但不存在的父目錄。

          重新命名此抽象路徑名錶示的檔案。

          設定此抽象路徑名所有者執行許可權的一個便捷方法。
(boolean executable, boolean ownerOnly)
          設定此抽象路徑名的所有者或所有使用者的執行許可權。

          設定此抽象路徑名指定的檔案或目錄的最後一次修改時間。
(boolean readable)
          設定此抽象路徑名所有者讀許可權的一個便捷方法。
(boolean readable, boolean ownerOnly)
          設定此抽象路徑名的所有者或所有使用者的讀許可權。

          標記此抽象路徑名指定的檔案或目錄,從而只能對其進行讀操作。
(boolean writable)
          設定此抽象路徑名所有者寫許可權的一個便捷方法。
(boolean writable, boolean ownerOnly)
          設定此抽象路徑名的所有者或所有使用者的寫許可權。

          返回此抽象路徑名的路徑名字串。
toURI()
          構造一個表示此抽象路徑名的 file: URI。
看這些沒用的,還是要自己動手操作的,下面是我自己寫的一個簡單案例:
import java.io.File;
import java.io.IOException;

public class Test {
	public static void main(String[] args) throws IOException {
		// 例項化一個File物件,注意這個目錄是不存在的,我們重新建立
		File mydir = new File("F:\\mydir");
		if (!mydir.exists()) {
			mydir.mkdir(); // 建立這個目錄
		} // 那麼我們訪問以下目錄名試試
		System.out.println(mydir.getName());
		System.out.println(mydir.getAbsolutePath());
		System.out.println(mydir.separator);
		// 我們給這個目錄下建立一個檔案吧
		File myfile = new File("F:\\mydir\\file.txt");
		if (!myfile.exists()) {
			myfile.createNewFile();
		}
		// 我們通過目錄來訪問目錄下的這個檔案
		File files[] = mydir.listFiles();
		for (int i = 0; i < files.length; i++) {
			System.out.println(files[i].getName());
			System.out.println(files[i].lastModified());
		}
	}
}
其實這幾天挺迷茫的,前幾周實習感覺挺有方向的,這幾天沒有給我安排具體的任務,突然感覺很空洞,夜深的時候,思考自己,我想要什麼,當思考明確了自己的目標的時候,迷茫這個詞語在腦海中是不存在的,但是這種迷茫也隨這你的生活變化,隨時都可能再次出現,所以在這裡,我給我自己一句話,再苦再累,自己選的路,當你不想走下去的時候,請回頭看看已經老去的爸媽,然後跪著走完這條路!!!

加油,沒有過不去砍,認真學,慢慢學,彆著急速度,給自己一個理想化的學習態度和一份真誠踏實的心,一路走下去即可!呵呵

突然覺得這樣的上述的流操作,只能進行單一的讀檔案或者向檔案寫入資料,很單一,單向的操作,不用擔心,java強大的不可挑剔,RandomAccessFile就可以滿足我的這個小小願望:

RandomAccessFile[隨機存取位元組流]->可以任意的存和取資料,按照特定的資料型別進行寫入或者讀取操作,可以指定位元組跳躍流所指向的檔案指標位置

建構函式資訊:

構造方法摘要

          建立從中讀取和向其中寫入(可選)的隨機訪問檔案流,該檔案由 File 引數指定。

          建立從中讀取和向其中寫入(可選)的隨機訪問檔案流,該檔案具有指定名稱。
上述mode取值可以是“r”只讀,“w”只寫或者“rw”讀寫
常用方法:(方法有很多但是都很類似,唯一區別不同就是資料型別不同,也就意味著存取時,流所指向的檔案指標跳躍的位元組個數不同)


          返回此檔案的長度,位元組數

read()
          從此檔案中讀取一個數據位元組

read(byte[] b)
          將最多 b.length 個數據位元組從此檔案讀入 byte 陣列

read(byte[] b, int off, int len)
          將最多 len 個數據位元組從此檔案讀入 byte 陣列,off為陣列偏移量


          從此檔案讀取一個字元,這是一個典型的,還有很多,比如readInt(),readBoolean()等等資料型別

seek(long pos)
          設定到此檔案開頭測量到的檔案指標偏移量,在該位置發生下一個讀取或寫入操作


          嘗試跳過輸入的 n 個位元組以丟棄跳過的位元組

write(byte[] b)
          將 b.length 個位元組從指定 byte 陣列寫入到此檔案,並從當前檔案指標開始

write(byte[] b, int off, int len)
          將 len 個位元組從指定 byte 陣列寫入到此檔案,並從偏移量 off 處開始


          按單位元組值將 boolean 寫入該檔案,還可以有很多,比如writeInt()等等

寫一個超級簡單的例子吧:

import java.io.IOException;
import java.io.RandomAccessFile;

public class Test {
	public static void main(String[] args) throws IOException {
		// 建立一個RAF流,mode型別為“rw”,可寫入可讀取
		RandomAccessFile raf = new RandomAccessFile("F:\\test.txt", "rw");
		int num[] = { 1, 2, 3, 4, 5 };
		for (int i = 0; i < num.length; i++) {
			raf.writeInt(num[i]);// 寫入int型別資料
		}
		raf.seek(0L);// 重新定位流所指向的檔案指標位置
		for (int i = 0; raf.getFilePointer() < raf.length(); i++) {
			raf.seek(i * 4);// 這裡的int佔四個位元組,定位值按照位元組定位的
			System.out.println(raf.readInt());
		}
		raf.close();
	}
}

未完待續,還有很多常用的流操作,以後會一一補充,很晚了,該睡覺了,每天抽一點時間學習學習,慢慢積累,I can do it!!

相關推薦

java常見輸入輸出案例學習

位元組輸入輸出流 1.FileInputStream[檔案位元組輸入流]->讀取檔案內容 用途:從檔案系統中的檔案獲得輸入位元組,常用於讀取影象、聲音等原始位元組流,讀取字元流可考慮使用FileReader 構造方法: 構造方法摘要           通過開啟一個

C語言輸入輸出和緩衝區重點詳解

導讀: C語言中我們用到的最頻繁的輸入輸出方式就是scanf()與printf()。 scanf(): 從標準輸入裝置(鍵盤)讀取資料,並將值存放在變數中。 printf(): 將指定的文字/字串輸出到標準輸出裝置(螢幕)。注意寬度輸出和精度 輸出控制。 C語言藉助了相應的緩衝區

Java資料輸入輸出——DataInputStream和DataOutputStream

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

java標準輸入輸出

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.i

java 使用輸入+輸出對對象序列化

mage urn NPU 分享圖片 get found otf spa class 對象: 註意記得實現 Serializable package com.nf147.sim.entity; import java.io.Serializable; public

Java標準輸入輸出的重定向

一、問題的引入: 一般情況下,System.in代表的是鍵盤、System.out是代表的控制檯(顯示器)。當程式通過System.in來獲取輸入的時候,預設情況下,是從鍵盤讀取輸入;當程式試圖通過System.out執行輸出時,程式總是輸出到顯示器。如果我們想對這樣的情況

Activiti工作學習——Activiti簡介以及maven環境搭建

一、工作流簡述 工作流(Workflow),就是通過計算機對業務流程自動化執行管理。它主要解決的是“使在多個參與者之間按照某種預定義的規則自動進行傳遞文件、資訊或任務的過程,從而實現某個預期的業務目標,或者促使此目標的實現”。 工作流就是通過計算機技術對業務流程進行自動化管理。實現多個參與者

.NET使用Redis之ServiceStack.Redis學習安裝與簡單的運行

arraylist write client cli ring blog 控制臺 創建 spa 1.下載ServiceStack.Redis PM> Install-Package ServiceStack.Redis 2.vs中創建一個控制臺程序 class Pro

Java的深拷貝與淺拷貝

概述 JAVA中物件的拷貝分兩種:深拷貝和淺拷貝。 物件的拷貝在記憶體中的體現即是在堆中新開闢一片空間,然後將要拷貝的物件拷貝一份到新開闢的空間上來。要拷貝的物件可能有各種基本資料型別的成員變數,也可

演算法常見的Math類問題總結

演算法中Math(數學類問題總結一) Nim Game(分石頭),A和B輪流分石頭,每人每次只能分1到3個,什麼樣的策略可以保證A總是贏的。 思路:若是A第一個拿並且總的石頭數多於3,那麼希望最終留下的是4個,因為剩4個時,無論B怎麼拿,A都是贏的

Activiti工作框架學習之通用資料表詳細介紹

文/朱季謙 Activiti工作流引擎自帶了一套資料庫表,這裡面有一個需要注意的地方: 低於5.6.4的MySQL版本不支援時間戳或毫秒級的日期。更糟糕的是,某些版本在嘗試建立此類列時將引發異常,而其他版本則不會。執行自動建立/升級時,引擎將在執行DDL時更改它。使用DDL檔案方法時,既可以使用常規版本也可以

Java學習筆記10--位元組 ;字元 ;序列 ;物件的輸入輸出;Properties配置檔案類;列印;編碼

∆ 位元組流、字元流 ∆ SequenceInputStream(序列流) 序列流,對多個流進行合併。 SequenceInputStream 表示其他輸入流的邏輯串聯。它從輸入流的有序集合開始,並從第一個輸入流開始讀取,直到到達

java輸入輸出詳細講解入門經典,詳細講解JAVA的IO

今天我們開始進入學習 java 中比較讓人頭疼的事, 那就是 I/O 流、多執行緒、網路程式設計。這裡對 I/O 流的一個詳細講解。希望對大家有點用吧。(不看後悔哦) 一、什麼是IO Java中I/O操作主要是指使用Java進行輸入,輸出操作。 Java所有的I/O機制都是基於資料流進行輸入

ObjectInputStream || ObjectOutputStream 序列化對象輸入輸出Demo 學習

圖形 new 顯示 獲取 || 數組 所有 make 聲明 A:Api 說明: ObjectOutputStream 寫入的基本數據和對象 *(內存 到 硬盤 對象的 存儲!!) ObjectInputStream 對以前使用 ObjectOutputStream 寫入的基

c++IO輸入輸出總結<二>

操作 clu 文件 blog trunc pub filename binary team 1 文件的打開和關閉 1.1 定義流對象   ifsteam iflie;//文件輸入流對象   ifsteam iflie;//文件輸出流對象   fsteam iflie;//文

Javaio學習ByteArrayInputStream和ByteArrayOutputStream

ByteArrayInputStream(記憶體輸入流)繼承於InputStream,ByteArrayOutputStream(記憶體輸出流)繼承於OutputStream。記憶體流是關不掉的,一般用來存放一些臨時性的資料,理論值是記憶體大小。 常用的方法是:read(),一系列read方法,

Java輸入/輸出

位元組流和字元流 位元組流和字元流的操作幾乎完全一樣,不同的是位元組流操作的資料單元是位元組,而字元流操作的是字元。 InputStream和Reader InputStream和Reader是所有輸入流的抽象基類。 在InputStream裡包含的三個方法: i

Javaio學習PrintStream和PrintWriter

PrintStream(可以將位元組流封裝成列印流)繼承於FilterOutputStream,FilterOutputStream是繼承於OutputStream的;PrintWriter(可以將位元組流、字元流封裝成列印流)繼承於Writer的。 其中可以使用Print

JAVA輸入/輸出程式例題檔案和目錄、位元組、字元

一.檔案和目錄 1.顯示檔案的基本資訊。 2.顯示目錄的基本資訊。 3.在指定目錄下建立單個檔案。 4.指定目錄下建立多個臨時檔案。 二、位元組流 1.生成ZIP壓縮檔案 2.解壓縮zip檔案 3.生成Excel檔案 4.讀取excel檔案 5.生成PDF檔案 6.讀取P

關於socket與serversocket輸入輸出【轉載】

關於socket與serversocket中的輸入輸出流 1,客戶端的socket連線到伺服器的套接字 socket mysocket=new socket(“127.0.0.1”,30000);用埠號30000連線到本機,當然這裡可能發生io異常,注意拋異常 當套