Java Api之IO流輸入與輸出
1輸入與輸出
input |
某個裝置或者環境進行資料的輸入 |
output |
某個裝置或者環境進行資料的輸出 |
在java中,java將輸入輸出抽象為流物件(IO流)來解決,我們以檔案裝置來解釋:
輸入流 |
從檔案讀取資料或者從鍵盤輸入資料 |
輸出流 |
向檔案寫入資料 |
Io流在java中又分為位元組流和字元流:
位元組流 |
所有檔案的儲存是都是位元組(byte)的儲存,在磁碟上保留的並不是檔案的字元而是先把字元編碼成位元組,再儲存這些位元組到磁碟。在讀取檔案(特別是文字檔案)時,也是一個位元組一個位元組地讀取以形成位元組序列 |
字元流 |
字元流處理的單元為2個位元組的Unicode字元,分別操作字元、字元陣列或字串,而位元組流處理單元為1個位元組,操作位元組和位元組陣列。所以字元流是由Java虛擬機器將位元組轉化為2個位元組的Unicode字元為單位的字元而成的,所以它對多國語言支援性比較好! |
2、字元流
字元輸出流超類 |
字元輸出流子類 |
Writer |
FileWriter |
BufferedWriter |
字元輸入流超類 |
字元輸入流子類 |
Reader |
FileReader |
BufferedReader |
(1) 字元輸出流FileWriter
FileWriter的構造方法:
FileWriter(File file) |
根據給定的file物件構造一個FileWriter物件 |
FileWriter(String filename) |
根據給定的檔名物件構造一個FileWriter物件 |
舉例:使用字元流向一個檔案輸出Hello World!
步驟:
1) 建立檔案;
2) 建立輸出流物件;
3) 把輸出流物件指向檔案;
4) 清空快取。
5) 關閉輸出流
package com.file; import java.io.File; import java.io.FileWriter; import java.io.IOException; public class FileCreate { public static void main(String[] args) { //建立file物件 File file=null; FileWriter fw=null; try { //建立檔案 file=new File("D:/test/newFile.txt"); file.createNewFile(); //建立檔案輸出流 fw=new FileWriter(file); //把內容寫入檔案 fw.write("Hello World!"); //清空快取,把內容寫入檔案 } catch (IOException e) { e.printStackTrace(); }finally { if (fw!=null){ try { //關閉輸出流 fw.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
當我們每次使用輸出流向檔案裡寫輸出資料的時候,寫入資料會覆蓋檔案裡原有資料,若是我們想要檔案裡原有資料不被覆蓋,我們可使用FileWrite的追加構造方法:
FileWriter(File file,boolean append) |
構造方法的第二個boolean引數用來表示是否追加 |
FileWriter(String filename, boolean append) |
例如我們再向上例中Hello World!後追加Hello China!
package com.file;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class FileCreate {
public static void main(String[] args) {
//建立file物件
File file=null;
FileWriter fw=null;
try {
//建立檔案
file=new File("D:/test/newFile.txt");
file.createNewFile();
//建立檔案輸出流,輸出資料將追加在檔案中原有資料後面
fw=new FileWriter(file,true);
//把內容寫入檔案
fw.write("Hello China!");
//清空快取,把內容寫入檔案
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fw!=null){
try {
//關閉輸出流
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
從上裡可以看出,兩次輸入的資料(Hello World!Hello China!)是在一行,如果我們想讓追加後的資料另起一行呢
在輸入資料時“\r\n”表示換行,效果如下:
package com.file;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
public class FileCreate {
public static void main(String[] args) {
//建立file物件
File file=null;
FileWriter fw=null;
try {
//建立檔案
file=new File("D:/test/newFile.txt");
file.createNewFile();
//建立檔案輸出流,輸出資料將追加在檔案中原有資料後面
fw=new FileWriter(file,true);
//把內容寫入檔案,並換行
fw.write("Hello Beijing!\r\n");
//清空快取,把內容寫入檔案
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fw!=null){
try {
//關閉輸出流
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
在windows系統中“\r\n”表示換行
在Linux系統中“\n”表示換行
在ios系統中“\r”表示換行
FilterWriter的writer方法還有其他寫入功能:
writer(Char[ ] chuf) |
寫入字元陣列 |
writer(Char[ ] chuf,int offset,int length) |
寫入字元陣列的某一部分 |
writer(int i) |
寫入單個字元(int轉換為ASCII) |
writer(String str) |
寫入字串 |
writer(String [ ] str,int offset,int length) |
寫入字串的某一一部分 |
(2)字元輸入流FileReader
FileReader的構造方法:
FileReader(File file) |
在給定從中讀取資料的File的情況下傳建一個新的FileReader |
FileReader(String fileName) |
在給定從中讀取資料的File檔名的情況下傳建一個新的FileReader |
舉例:使用字元流從一個檔案讀取資料!
步驟:
1) 建立輸入流物件;
2) 把輸出流物件指向檔案;
3) 讀取資料;
4) 關閉輸入流。
package com.file;
import java.io.*;
public class FileIO {
public static void main(String[] args) {
//建立FileReader物件
FileReader fr=null;
try {
//把輸入流指向需要讀取的檔案
fr=new FileReader("D:/test/newFile.txt");
//建立字元陣列
char[] chars=new char[1024];
int num=-1;
//讀取資料,如果讀取完畢,則num將返回-1
while ((num=fr.read(chars))!=-1){
//將字元陣列中資料轉換為字串並輸出到控制檯
String str=new String(chars,0,num);
System.out.println(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fr!=null){
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
(3)字元輸入流之BufferedReade
BufferedReader 由Reader類擴充套件而來,提供通用的緩衝方式文字讀取,而且提供了很實用的readLine,讀取一個文字行,從字元輸入流中讀取文字,緩衝各個字元,從而提供字元、陣列和行的高效讀取。
BufferedReader提供了readLine()方法來讀取一行資料
package com.file;
import java.io.*;
public class FileIO {
public static void main(String[] args) {
//建立FileReader物件
FileReader fr=null;
//BufferedReader
BufferedReader br=null;
try {
//把輸入流指向需要讀取的檔案
fr=new FileReader("D:/test/newFile.txt");
//用BufferedReader包裝FileReader
br=new BufferedReader(fr);
//建立字串
String str=null;
//讀取資料,如果讀取完畢,則str將返回null
while ((str=br.readLine())!=null){
//將字串輸出到控制檯
System.out.println(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fr!=null){
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
(4)字元輸入流之BufferedWriter
將文字寫入字元輸出流,緩衝各個字元,從而提供單個字元、陣列和字串的高效寫入。可以指定緩衝區的大小,或者接受預設的大小。在大多數情況下,預設值就足夠大了。 該類提供了 newLine() 方法,它使用平臺自己的行分隔符概念。
package com.file;
import java.io.*;
public class FileCreate {
public static void main(String[] args) {
//建立file物件
File file=null;
FileWriter fw=null;
BufferedWriter bw=null;
try {
//建立檔案
file=new File("D:/test/newFile.txt");
if (!file.exists()){
file.createNewFile();
}
//建立檔案輸出流,輸出資料將追加在檔案中原有資料後面
fw=new FileWriter(file,true);
//用BufferedWriter包裝FileWriter
bw=new BufferedWriter(fw);
//把內容寫入檔案,並換行
bw.write("Hello Xian!");
bw.newLine();
bw.write("Hello madi");
//清空快取,把內容寫入檔案
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (fw!=null){
try {
//關閉輸出流
bw.close();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3、位元組流
(1)位元組輸出流OutputStream
OutputStream是整個IO包中位元組輸出流的最大父類,此類是一個抽象類,如果想要使用此類的話,則首先必須通過子類例項化物件,那麼如果現在要操作的是一個檔案,則可以使用:FileOutputStream類。通過向上轉型之後,可以為OutputStream例項化。具體事例如下:
package com.file;
import java.io.*;
public class OutputStreamDemo {
public static void main(String[] args) {
//建立檔案物件
File file = new File("D:/test/newFile2.txt");
//宣告輸出流
OutputStream os=null;
try {
//將輸出流指向檔案物件
os=new FileOutputStream(file);
String str="Hello World";
byte[] bytes=str.getBytes();
//向指定檔案輸出資料
os.write(bytes);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(os!=null){
try {
//關閉輸出流
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}}}
(2)位元組輸入流InputStream
既然程式可以向檔案中寫入內容,則就可以通過InputStream從檔案中把內容讀取進來,
與OutputStream類一樣,InputStream本身也是一個抽象類,必須依靠其子類,如果現在是從檔案中讀取,就用FileInputStream來實現。具體事例如下:
package com.file;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class InputStreamDemo {
public static void main(String[] args) {
//構造一個檔案輸入流物件
InputStream is=null;
try {
//將輸入流物件指向檔案
is=new FileInputStream("D:/test/newFile2.txt");
byte[] bytes=new byte[1024];
//temp用來儲存讀入的位元組長度
int temp;
//迴圈讀取資料
while ((temp=is.read(bytes))!=-1){
String str=new String(bytes,0,temp);
System.out.print(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (is!=null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
(3)位元組輸入流之InputStreamReader
InputStreamReader將位元組流轉換為字元流。是位元組流通向字元流的橋樑。如果不指定字符集編碼,該解碼過程將使用平臺預設的字元編碼。
構造方法:
構造一個預設編碼集的InputStreamReader類 |
InputStreamReader isr = new InputStreamReader(InputStream in); |
構造一個指定編碼集的InputStreamReader類 |
InputStreamReader isr = new InputStreamReader(InputStream in,String charsetName); |
package com.file;
import java.io.*;
public class InputStreamDemo {
public static void main(String[] args) {
//構造一個檔案輸入流物件
InputStream is=null;
InputStreamReader isr=null;
try {
//將輸入流物件指向檔案
is=new FileInputStream("D:/test/newFile2.txt");
//用InputStreamReader包裝FileInputStream
isr=new InputStreamReader(is);
char[] chars=new char[1024];
//temp用來儲存讀入的位元組長度
int temp;
//迴圈讀取資料
while ((temp = isr.read(chars))!= -1){
String str=new String(chars,0,temp);
System.out.print(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (isr!=null){
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is!=null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
(4)位元組輸出流之OutputStreamWriter
OutputStreamWriter將位元組流轉換為字元流。是位元組流通向字元流的橋樑。如果不指定字符集編碼,該解碼過程將使用平臺預設的字元編碼。
構造方法:
構造一個預設編碼集的OutputStreamWriter類 |
OutputStreamWriter osw = new OutputStreamWriter(OutputStream out); |
構造一個指定編碼集的OutputStreamWriter類 |
OutputStreamWriter osw = new OutputStreamWriter(OutputStream out,String charsetName); |
package com.file;
import java.io.*;
public class OutputStreamDemo {
public static void main(String[] args) {
//建立檔案物件
File file = new File("D:/test/newFile2.txt");
//宣告輸出流
OutputStream os=null;
//宣告OutputStreamWriter物件
OutputStreamWriter osw=null;
try {
//將輸出流指向檔案物件
os=new FileOutputStream(file,true);
//用OutputStreamWriter包裝OutputStream
osw=new OutputStreamWriter(os);
String str="\r\nHello China!";
//向指定檔案輸出資料
osw.write(str);
osw.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if (osw!=null){
try {
osw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(os!=null){
try {
//關閉輸出流
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
相關推薦
Java Api之IO流輸入與輸出
1輸入與輸出 input 某個裝置或者環境進行資料的輸入 output 某個裝置或者環境進行資料的輸出 在java中,java將輸入輸出抽象為流物件(IO流)來解決,我們以檔案裝置來解釋: 輸入流 從檔案讀取資料或者從鍵盤輸入資料 輸出流
python之路--day1--輸入與輸出&&數據類型
test 整體 lis 相同 msg app 字符類型 身份證 [] 輸入與輸出 輸出print() 在括號中加上字符,輸出相應字符。 >>>print("hello world!") hello world! 多行輸出 >>>pr
Java學習之IO流
今天 bit string轉換 tin path 編碼表 父類 二進制 指定編碼 轉載鏈接:https://blog.csdn.net/zhaoyanjun6/article/details/54292148 Java流類圖結構: 流的概念和作用 流是一組有順序的,有起點
java基礎之IO流(一)
目標 構造方法 play pub io流 ted ima str 有一個 java基礎之IO流(一)之字節流 IO流體系太大,涉及到的各種流對象,我覺得很有必要總結一下。 那什麽是IO流,IO代表Input、Output,而流就是原始數據源與目標媒介的數據傳輸的一種
Linux命令列使用之命令列輸入與輸出
與DOS類似,Shell 程式通常自動開啟3個標準文件:標準輸入文件(stdin)、標準輸出文件(stdout)和標準錯誤輸出文件(stderr)。其中 stdin 一般對應終端鍵盤,stdout 和 stderr 對應終端螢
Java基礎之IO流小結
Java程式中對於資料的輸入和輸出操作是以流的方式進行的。一個流可以被定義為一個數據序列。我們可以理解為:流是用來讀寫資料的。Java語言提供的java.io包可以很方便的讓我們對資料進行輸入和輸出操作。本文將和大家分享學習Java IO流的相關基礎知識。 一、
java學習之IO流(11.25)
今天學習了通過FileInputStream的int read(byte[] bytes)方法,一次讀取多個位元組,期間回顧了通過String的構造方法將byte陣列轉換成String型別。通過while迴圈和read方法傳入byte陣列,迴圈讀取較大檔案,以及
Java基礎之IO流(位元組流、字元流、記憶體流、帶快取的流、序列化和反序列化)
File類:File類提供了對檔案的操作,可以通過字串或URI來構建一個File類物件。通過物件,可以實現檔案的建立(createNewFile)、刪除(delete)、獲得檔名(getName)、獲得父目錄物件(getParentFile)、獲得父目錄名稱(
java原始碼之 io 流原始碼解讀(一)
剛剛喝了一波毒雞湯,其中印象最深的就是這兩個: 沒有人能夠讓你放棄夢想,自己想想就放棄了。 找物件的時候不能光看對方的外表。。。。 還要看看自己的外表 哈哈哈~~ 吸收了這一大波精氣之後,我感覺我的
黑馬程式設計師--JAVA基礎之IO流
一 IO流的三種分類方式: 1.按照流向來分: 輸入流:只能從中讀取位元組資料,不能向其寫出資料 輸出流:只能向其寫入位元組資料,不能從中讀取資料 2.按照流所處理的資料型別劃分:可分為: 位元組流:用於處理位元組
java程式設計之——IO流應用總結
------- android培訓、java培訓、期待與您交流! --------- IO流(掌握) (1)IO流的分類: A:位元組流 位元組輸入流 InputStream 位元組輸出流 OutputStream B:字元流 字元輸入流 Reader 字元輸出流 Wri
java基礎之IO流及遞歸理解
示例代碼 font hid 再次 調用方法 反斜杠 filter amp 遞歸 一、IO流(簡單理解是input/output流,數據流內存到磁盤或者從磁盤到內存等) 二、File類(就是操作文件和文件夾的) 1、FIleFile類構造方法 註意:通過構造方法創建的f
Java基礎學習之IO流模擬輸入複製貼上功能
學習了IO流後,瞭解其IO體系: 字元流: Reader:輸入流 讀取 進入記憶體 Writer:輸出流 寫入 進硬碟 位元組流: InputStream:輸入流 讀取 進記憶體 OutputStream:輸出流 寫入 進硬碟 下面通過字元流的輸入流(FileReader)以及輸出流(F
java io 流 輸入輸出 大牛經典總結(轉載)
轉載出處:https://www.cnblogs.com/shaohz2014/p/3652548.html java io 流 輸入輸出 大牛經典總結 在軟體開發中,資料流和資料庫操作佔據了一個很重要的位置,所以,熟
JAVA 的輸入與輸出流當中,什麼時候該使用字元流?什麼時候該使用位元組流?
1. InputStream 和OutputStream,兩個是為位元組流設計的,主要用來處理位元組或二進位制物件, 2. Reader和 Writer.兩個是為字元流(一個字元佔兩個位元組)設計的,主要用來處理字元或字串. 字元流處理的單元為2個位元組的Unicode字元,分別操作字元、字元陣列或字串,而位
JAVA 的輸入與輸出流當中,什麽時候該使用字符流?什麽時候該使用字節流?
enc href nic 文件 功能 byte[] 字節數 .com 字節 1. InputStream 和OutputStream,兩個是為字節流設計的,主要用來處理字節或二進制對象, 2. Reader和 Writer.兩個是為字符流(一個字符占兩個字節)設計的,
【我要程式設計】Java技術手冊之根據圖片連結把圖片轉化為io流,並輸出到頁面上的方法
適用場景:A程式只能內網訪問,B程式可以外網訪問,只有B程式可以訪問A程式,使用者需要通過B程式訪問A程式的圖片資源。這是可以使用該方法。 @RequestMapping("/getImageByPath") public void getImageByTomcat(St
java之IO流(序列化流與反序列化流)
一.物件序列化流ObjectOutputStream 用於向流中寫入物件的操作流 ObjectOutputStream 稱為 序列化流 ObjectOutputStream 將 Java 物件的基本資料型別和圖形寫入 OutputStream。可以使用 Object
java輸入輸出流詳細講解(入門經典),詳細講解JAVA中的IO流
今天我們開始進入學習 java 中比較讓人頭疼的事, 那就是 I/O 流、多執行緒、網路程式設計。這裡對 I/O 流的一個詳細講解。希望對大家有點用吧。(不看後悔哦) 一、什麼是IO Java中I/O操作主要是指使用Java進行輸入,輸出操作。 Java所有的I/O機制都是基於資料流進行輸入
【 I/O流】檔案輸入與輸出(Scanner)& Scanner和io流讀寫有何區別?(待填坑)
對檔案進行讀取,僅需要用File物件構造一個Scanner物件Scanner in= new Scanner(Paths.get("myfile.tet"),"UTF-8");如果檔名中含反斜槓符號,需要在每個反斜槓之前加一個額外的反斜槓如:“c:\\mydirectory\