流的概念:
在程序中全部的數據都是以流的形式進行傳輸和保存的,程序須要數據的時候要使用輸入流讀取數據,而當程序須要將數據保存起來的時候,就要使用輸出流完成。
字節流與字符流
在Java.io中操做文件內容的主要有兩大類:字符流和字節流,兩類都分爲輸入和輸出操做。
字節流:
輸出-------OutputStream
輸入-------InputStream
字符流:
輸出-------Writer
輸入-------Reader
操做流程-----以文件操做爲例
1.使用File類打開一個文件
2.經過字節流或字符流的子類,指定輸出的位置(由於其父類爲抽象類)
3.進行讀/寫操做
4.關閉輸入/輸出
注意:
io操做屬於資源操做,在操做結束後必須關閉。
字節流的使用概述
字節流主要操做的是byte類型數據,以byte數組爲準,主要操做類就是:
字節流:
輸出流-------OutputStream
輸入流-------InputStream
寫文件:
import java.io.File ;
import java.io.OutputStream ;
import java.io.FileOutputStream ;
public
class OutputStreamDemo01{
public
static
void main(String args[])
throws Exception{
// 異常拋出,不處理
// 第1步、使用File類找到一個文件
File f=
new File(
"d:" + File.separator +
"test.txt") ;
// 聲明File對象
// 第2步、經過子類實例化父類對象
OutputStream out =
null ;
// 準備好一個輸出的對象
out =
new FileOutputStream(f) ;
// 經過對象多態性,進行實例化
// 第3步、進行寫操做
String str =
"Hello World!!!" ;
// 準備一個字符串
byte b[] = str.getBytes() ; // 只能輸出byte數組,因此將字符串變爲byte數組
out.write(b) ;
// 將內容輸出,保存文件
// 第4步、關閉輸出流
out.close() ;
// 關閉輸出流
}
};
import java.io.File ;
import java.io.OutputStream ;
import java.io.FileOutputStream ;
public
class OutputStreamDemo02{
public
static
void main(String args[])
throws Exception{
// 異常拋出,不處理
// 第1步、使用File類找到一個文件
File f=
new File(
"d:" + File.separator +
"test.txt") ;
// 聲明File對象
// 第2步、經過子類實例化父類對象
OutputStream out =
null ;
// 準備好一個輸出的對象
out =
new FileOutputStream(f) ;
// 經過對象多態性,進行實例化
// 第3步、進行寫操做
String str =
"Hello World!!!" ;
// 準備一個字符串
byte b[] = str.getBytes() ;
// 只能輸出byte數組,因此將字符串變爲byte數組
for(
int i=0;i<b.length;i++){
// 採用循環方式寫入
out.write(b[i]) ; // 每次只寫入一個內容
}
// 第4步、關閉輸出流
out.close() ;
// 關閉輸出流
}
};
import java.io.File ;
import java.io.OutputStream ;
import java.io.FileOutputStream ;
public
class OutputStreamDemo03{
public
static
void main(String args[])
throws Exception{
// 異常拋出,不處理
// 第1步、使用File類找到一個文件
File f=
new File(
"d:" + File.separator +
"test.txt") ;
// 聲明File對象
// 第2步、經過子類實例化父類對象
OutputStream out =
null ;
// 準備好一個輸出的對象
out = new FileOutputStream(f,true) ; // 此處表示在文件末尾追加內容
// 第3步、進行寫操做
String str =
"Hello World!!!" ;
// 準備一個字符串
byte b[] = str.getBytes() ;
// 只能輸出byte數組,因此將字符串變爲byte數組
for(
int i=0;i<b.length;i++){
// 採用循環方式寫入
out.write(b[i]) ;
// 每次只寫入一個內容
}
// 第4步、關閉輸出流
out.close() ;
// 關閉輸出流
}
};
import java.io.File ;
import java.io.OutputStream ;
import java.io.FileOutputStream ;
public
class OutputStreamDemo04{
public
static
void main(String args[])
throws Exception{
// 異常拋出,不處理
// 第1步、使用File類找到一個文件
File f=
new File(
"d:" + File.separator +
"test.txt") ;
// 聲明File對象
// 第2步、經過子類實例化父類對象
OutputStream out =
null ;
// 準備好一個輸出的對象
out =
new FileOutputStream(f,
true) ;
// 此處表示在文件末尾追加內容
// 第3步、進行寫操做
String str = "\r\nHello World!!!" ; // 準備一個字符串 \r\n--表示換行
byte b[] = str.getBytes() ;
// 只能輸出byte數組,因此將字符串變爲byte數組
for(
int i=0;i<b.length;i++){
// 採用循環方式寫入
out.write(b[i]) ;
// 每次只寫入一個內容
}
// 第4步、關閉輸出流
out.close() ;
// 關閉輸出流
}
};
讀文件:
import java.io.File ;
import java.io.InputStream ;
import java.io.FileInputStream ;
public
class InputStreamDemo03{
public
static
void main(String args[])
throws Exception{
// 異常拋出,不處理
// 第1步、使用File類找到一個文件
File f=
new File(
"d:" + File.separator +
"test.txt") ;
// 聲明File對象
// 第2步、經過子類實例化父類對象
InputStream input =
null ;
// 準備好一個輸入的對象
input =
new FileInputStream(f) ;
// 經過對象多態性,進行實例化
// 第3步、進行讀操做
byte b[] = new byte[(int)f.length()] ; // 數組大小由文件決定
int len = input.read(b) ;
// 讀取內容
// 第4步、關閉輸出流
input.close() ;
// 關閉輸出流\
System.out.println(
"讀入數據的長度:" + len) ;
System.out.println(
"內容爲:" +
new String(b)) ;
// 把byte數組變爲字符串輸出
}
};
以上使用的是byte讀取數據,以下使用read()方法,看代碼
import java.io.File ;
import java.io.InputStream ;
import java.io.FileInputStream ;
public
class InputStreamDemo04{
public
static
void main(String args[])
throws Exception{
// 異常拋出,不處理
// 第1步、使用File類找到一個文件
File f=
new File(
"d:" + File.separator +
"test.txt") ;
// 聲明File對象
// 第2步、經過子類實例化父類對象
InputStream input =
null ;
// 準備好一個輸入的對象
input =
new FileInputStream(f) ;
// 經過對象多態性,進行實例化
// 第3步、進行讀操做
byte b[] =
new
byte[(
int)f.length()] ;
// 數組大小由文件決定
for(
int i=0;i<b.length;i++){
b[i] = (byte)input.read() ; // 讀取內容
}
// 第4步、關閉輸出流
input.close() ;
// 關閉輸出流\
System.out.println(
"內容爲:" +
new String(b)) ;
// 把byte數組變爲字符串輸出
}
};
在不是數據長度的狀況下,要使用一下方法讀取數據
import java.io.File ;
import java.io.InputStream ;
import java.io.FileInputStream ;
public
class InputStreamDemo05{
public
static
void main(String args[])
throws Exception{
// 異常拋出,不處理
// 第1步、使用File類找到一個文件
File f=
new File(
"d:" + File.separator +
"test.txt") ;
// 聲明File對象
// 第2步、經過子類實例化父類對象
InputStream input =
null ;
// 準備好一個輸入的對象
input =
new FileInputStream(f) ;
// 經過對象多態性,進行實例化
// 第3步、進行讀操做
byte b[] =
new
byte[1024] ;
// 數組大小由文件決定
int len = 0 ;
int temp = 0 ;
// 接收每個讀取進來的數據
while((temp=input.read())!=-1){
// 表示還有內容,文件沒有讀完
b[len] = (byte)temp ;
len++ ;
}
// 第4步、關閉輸出流
input.close() ;
// 關閉輸出流\
System.out.println(
"內容爲:" +
new String(b,0,len)) ;
// 把byte數組變爲字符串輸出
}
};
字符流的使用概述
在程序中一個字符等於兩個字節,Java提供了Writer和Reader兩個專門操做字符流的類。
字符輸出流:Writer
字符輸入流:Reader
字符輸出流
import java.io.File ;
import java.io.Writer ;
import java.io.FileWriter ;
public
class WriterDemo01{
public
static
void main(String args[])
throws Exception{
// 異常拋出,不處理
// 第1步、使用File類找到一個文件
File f=
new File(
"d:" + File.separator +
"test.txt") ;
// 聲明File對象
// 第2步、經過子類實例化父類對象
Writer out = null ; // 準備好一個輸出的對象
out = new FileWriter(f) ; // 經過對象多態性,進行實例化
// 第3步、進行寫操做
String str = "Hello World!!!" ; // 準備一個字符串
out.write(str) ; // 將內容輸出,保存文件
// 第4步、關閉輸出流
out.close() ;
// 關閉輸出流
}
};
字符輸入流
import java.io.File ;
import java.io.Reader ;
import java.io.FileReader ;
public
class ReaderDemo01{
public
static
void main(String args[])
throws Exception{
// 異常拋出,不處理
// 第1步、使用File類找到一個文件
File f=
new File(
"d:" + File.separator +
"test.txt") ;
// 聲明File對象
// 第2步、經過子類實例化父類對象
Reader input =
null ;
// 準備好一個輸入的對象
input =
new FileReader(f) ;
// 經過對象多態性,進行實例化
// 第3步、進行讀操做
char c[] =
new
char[1024] ;
// 全部的內容都讀到此數組之中
int len = input.read(c) ;
// 讀取內容
// 第4步、關閉輸出流
input.close() ;
// 關閉輸出流
System.out.println(
"內容爲:" +
new String(c,0,len)) ;
// 把字符數組變爲字符串輸出
}
};
import java.io.File ;
import java.io.Reader ;
import java.io.FileReader ;
public
class ReaderDemo02{
public
static
void main(String args[])
throws Exception{
// 異常拋出,不處理
// 第1步、使用File類找到一個文件
File f=
new File(
"d:" + File.separator +
"test.txt") ;
// 聲明File對象
// 第2步、經過子類實例化父類對象
Reader input =
null ;
// 準備好一個輸入的對象
input =
new FileReader(f) ;
// 經過對象多態性,進行實例化
// 第3步、進行讀操做
char c[] =
new
char[1024] ;
// 全部的內容都讀到此數組之中
int temp = 0 ;
// 接收每個內容
int len = 0 ;
// 讀取內容
while((temp=input.read())!=-1){
// 若是不是-1就表示還有內容,能夠繼續讀取
c[len] = (
char)temp ;
len++ ;
}
// 第4步、關閉輸出流
input.close() ;
// 關閉輸出流
System.out.println(
"內容爲:" +
new String(c,0,len)) ;
// 把字符數組變爲字符串輸出
}
};
字符流與字節流的區別
字節流在操做的時候,自己是不會用到緩存區的,是與文件自己直接操做(
驗證方法就是將close()省略試試看效果如何),而字符流在操做的時候會用到緩存區,即會使用內存。
在開發中使用字符流和字節流哪一個好?
在全部的硬盤上保存文件或是進行數據傳輸的時候,都是以字節的方式進行的,包括圖片也是用字節完成,而字符是隻有在內存中才會產生的,全部使用字節的時候是最多的。