字節(jié)輸出流OutputStream
IO流用來處理設(shè)備之間的數(shù)據(jù)傳輸
Java對數(shù)據(jù)的操作是通過流的方式
Java用于操作流的類都在IO包中
流按流向分為兩種:輸入流镣陕,輸出流。
流按操作類型分為兩種:
字節(jié)流 : 字節(jié)流可以操作任何數(shù)據(jù),因為在計算機中任何數(shù)據(jù)都是以字節(jié)的形式存儲的
字符流 : 字符流只能操作純字符數(shù)據(jù),比較方便。
.IO流常用父類
* 字節(jié)流的抽象父類:
* InputStream
* OutputStream
-
字符流的抽象父類:
* Reader * Writer
-
IO程序書寫
* 使用前,導入IO包中的類 * 使用時抱既,進行IO異常處理 * 使用后,釋放資源
void close(): 關(guān)閉此輸出流并釋放與此流有關(guān)的所有系統(tǒng)資源扁誓。
void write(byte[] b): 將 b.length 個字節(jié)從指定的 byte 數(shù)組寫入此輸出流\
void write(byte[] b, int off, int len) :將指定 byte 數(shù)組中從偏移量 off 開始的 len 個字節(jié)寫入此輸出流防泵。
abstract void write(int b) : 將指定的字節(jié)寫入此輸出流。
字節(jié)輸出流FileOutputStream寫字節(jié)
FileOutputStream構(gòu)造方法
作用:綁定輸出的輸出目的
FileOutputStream(File file)
創(chuàng)建一個向指定 File 對象表示的文件中寫入數(shù)據(jù)的文件輸出流跋理。
FileOutputStream(File file, boolean append)
創(chuàng)建一個向指定 File 對象表示的文件中寫入數(shù)據(jù)的文件輸出流择克,以追加的方式寫入。
FileOutputStream(String name)
創(chuàng)建一個向具有指定名稱的文件中寫入數(shù)據(jù)的輸出文件流前普。
FileOutputStream(String name, boolean append)
創(chuàng)建一個向具有指定 name 的文件中寫入數(shù)據(jù)的輸出文件流肚邢,以追加的方式寫入。
: 流對象使用步驟
1. 創(chuàng)建流子類的對象,綁定數(shù)據(jù)目的
2. 調(diào)用流對象的方法write寫
3. close釋放資源
: 注意事項
流對象的構(gòu)造方法,可以創(chuàng)建文件,如果文件存在,直接覆蓋
/*
* FileOutputStream
* 寫入數(shù)據(jù)文件,學習父類方法,使用子類對象
*
* 子類中的構(gòu)造方法: 作用:綁定輸出的輸出目的
* 參數(shù):
* File 封裝文件
* String 字符串的文件名
*
* 流對象使用步驟
* 1\. 創(chuàng)建流子類的對象,綁定數(shù)據(jù)目的
* 2\. 調(diào)用流對象的方法write寫
* 3\. close釋放資源
*
* 流對象的構(gòu)造方法,可以創(chuàng)建文件,如果文件存在,直接覆蓋
*/
public class FileOutputStreamDemo {
public static void main(String[] args)throws IOException {
FileOutputStream fos = new FileOutputStream("c:\\a.txt");
//流對象的方法write寫數(shù)據(jù)
//寫1個字節(jié)
fos.write(97);
//關(guān)閉資源
fos.close();
}
}
字節(jié)輸出流FileOutputStream寫字節(jié)數(shù)組
void write(byte[] b): 將 b.length 個字節(jié)從指定的 byte 數(shù)組寫入此輸出流
void write(byte[] b, int off, int len) :將指定 byte 數(shù)組中從偏移量 off 開始的 len 個字
/*
* FileOutputStream
* 寫入數(shù)據(jù)文件,學習父類方法,使用子類對象
*
* 子類中的構(gòu)造方法: 作用:綁定輸出的輸出目的
* 參數(shù):
* File 封裝文件
* String 字符串的文件名
*
* 流對象使用步驟
* 1\. 創(chuàng)建流子類的對象,綁定數(shù)據(jù)目的
* 2\. 調(diào)用流對象的方法write寫
* 3\. close釋放資源
*
* 流對象的構(gòu)造方法,可以創(chuàng)建文件,如果文件存在,直接覆蓋
*/
public class FileOutputStreamDemo {
public static void main(String[] args)throws IOException {
FileOutputStream fos = new FileOutputStream("c:\\a.txt");
//流對象的方法write寫數(shù)據(jù)
//寫字節(jié)數(shù)組
byte[] bytes = {65,66,67,68};
fos.write(bytes);
//寫字節(jié)數(shù)組的一部分,開始索引,寫幾個
fos.write(bytes, 1, 2);
//寫入字節(jié)數(shù)組的簡便方式
//寫字符串
fos.write("hello".getBytes());
//關(guān)閉資源
fos.close();
}
}
文件的續(xù)寫和換行符號
文件的續(xù)寫
- FileOutputStream構(gòu)造方法, 的第二個參數(shù)中,加入true
換行符號
在文件中,寫入換行,符號換行 \r\n
\r\n 可以寫在上一行的末尾, 也可以寫在下一行的開頭
/*
* FileOutputStream 文件的續(xù)寫和換行問題
* 續(xù)寫: FileOutputStream構(gòu)造方法, 的第二個參數(shù)中,加入true
* 在文件中,寫入換行,符號換行 \r\n
* \r\n 可以寫在上一行的末尾, 也可以寫在下一行的開頭
*/
public class FileOutputStreamDemo1 {
public static void main(String[] args)throws IOException {
File file = new File("c:\\b.txt");
FileOutputStream fos = new FileOutputStream(file,true);
fos.write("hello\r\n".getBytes());
fos.write("world".getBytes());
fos.close();
}
}
字節(jié)輸入流InputStream
abstract int read() :
從輸入流中讀取數(shù)據(jù)的下一個字節(jié)拭卿。
int read(byte[] b)
從輸入流中讀取一定數(shù)量的字節(jié)骡湖,并將其存儲在緩沖區(qū)數(shù)組 b 中。
int read(byte[] b, int off, int len)
將輸入流中最多 len 個數(shù)據(jù)字節(jié)讀入 byte 數(shù)組峻厚。
void close()
關(guān)閉此輸入流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源响蕴。
字節(jié)輸入流FileInputStream讀取字節(jié)
a: 方法介紹
abstract int read() :
從輸入流中讀取數(shù)據(jù)的下一個字節(jié),返回-1表示文件結(jié)束
int read(byte[] b)
從輸入流中讀取一定數(shù)量的字節(jié)惠桃,并將其存儲在緩沖區(qū)數(shù)組 b 中浦夷。
讀入緩沖區(qū)的字節(jié)總數(shù),如果因為已經(jīng)到達文件末尾而沒有更多的數(shù)據(jù)辜王,則返回 -1劈狐。
int read(byte[] b, int off, int len)
將輸入流中最多 len 個數(shù)據(jù)字節(jié)讀入 byte 數(shù)組。
void close()
關(guān)閉此輸入流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源呐馆。
/*
* FileInputStream讀取文件
*
* 構(gòu)造方法: 為這個流對象綁定數(shù)據(jù)源
*
* 參數(shù):
* File 類型對象
* String 對象
* 輸入流讀取文件的步驟
* 1\. 創(chuàng)建字節(jié)輸入流的子類對象
* 2\. 調(diào)用讀取方法read讀取
* 3\. 關(guān)閉資源
*
* read()方法,
* read()執(zhí)行一次,就會自動讀取下一個字節(jié)
* 返回值,返回的是讀取到的字節(jié), 讀取到結(jié)尾返回-1
*/
public class FileInputStreamDemo {
public static void main(String[] args) throws IOException{
FileInputStream fis = new FileInputStream("c:\\a.txt");
//讀取一個字節(jié),調(diào)用方法read 返回int
//使用循環(huán)方式,讀取文件, 循環(huán)結(jié)束的條件 read()方法返回-1
int len = 0;//接受read方法的返回值
while( (len = fis.read()) != -1){
System.out.print((char)len);
}
//關(guān)閉資源
fis.close();
}
}
/*
* int i = fis.read();
System.out.println(i);
i = fis.read();
System.out.println(i);
i = fis.read();
System.out.println(i);
i = fis.read();
System.out.println(i);
*/
字節(jié)輸入流FileInputStream讀取字節(jié)數(shù)組
int read(byte[] b)
從輸入流中讀取一定數(shù)量的字節(jié)肥缔,并將其存儲在緩沖區(qū)數(shù)組 b 中。
讀入緩沖區(qū)的字節(jié)總數(shù)汹来,如果因為已經(jīng)到達文件末尾而沒有更多的數(shù)據(jù)续膳,則返回 -1改艇。
int read(byte[] b, int off, int len)
將輸入流中最多 len 個數(shù)據(jù)字節(jié)讀入 byte 數(shù)組。
/*
* FileInputStream讀取文件
* 讀取方法 int read(byte[] b) 讀取字節(jié)數(shù)組
* 數(shù)組作用: 緩沖的作用, 提高效率
* read返回的int,表示什么含義 讀取到多少個有效的字節(jié)數(shù)
*/
public class FileInputStreamDemo1 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("c:\\a.txt");
// 創(chuàng)建字節(jié)數(shù)組
byte[] b = new byte[2];
int len = fis.read(b);
System.out.println(new String(b));// ab
System.out.println(len);// 2
len = fis.read(b);
System.out.println(new String(b));// cd
System.out.println(len);// 2
len = fis.read(b);
System.out.println(new String(b));// ed
System.out.println(len);// 1
len = fis.read(b);
System.out.println(new String(b));// ed
System.out.println(len);// -1
fis.close();
}
}
字節(jié)輸入流FileInputStream讀取字節(jié)數(shù)組的實現(xiàn)原理
public class FileInputStreamDemo1 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("c:\\a.txt");
//創(chuàng)建字節(jié)數(shù)組
byte[] b = new byte[1024];
int len = 0 ;
while( (len = fis.read(b)) !=-1){
System.out.print(new String(b,0,len));
}
fis.close();
}
}
文件復制原理
/*
* 將數(shù)據(jù)源 c:\\a.txt
* 復制到 d:\\a.txt 數(shù)據(jù)目的
* 字節(jié)輸入流,綁定數(shù)據(jù)源
* 字節(jié)輸出流,綁定數(shù)據(jù)目的
*
* 輸入,讀取1個字節(jié)
* 輸出,寫1個字節(jié)
*/
public class Copy {
public static void main(String[] args) {
//定義兩個流的對象變量
FileInputStream fis = null;
FileOutputStream fos = null;
try{
//建立兩個流的對象,綁定數(shù)據(jù)源和數(shù)據(jù)目的
fis = new FileInputStream("c:\\t.zip");
fos = new FileOutputStream("d:\\t.zip");
//字節(jié)輸入流,讀取1個字節(jié),輸出流寫1個字節(jié)
int len = 0 ;
while((len = fis.read())!=-1){
fos.write(len);
}
}catch(IOException ex){
System.out.println(ex);
throw new RuntimeException("文件復制失敗");
}finally{
try{
if(fos!=null)
fos.close();
}catch(IOException ex){
throw new RuntimeException("釋放資源失敗");
}finally{
try{
if(fis!=null)
fis.close();
}catch(IOException ex){
throw new RuntimeException("釋放資源失敗");
}
}
}
}
}
字節(jié)流復制文件讀取字節(jié)數(shù)組
/*
* 字節(jié)流復制文件
* 采用數(shù)組緩沖提高效率
* 字節(jié)數(shù)組
* FileInputStream 讀取字節(jié)數(shù)組
* FileOutputStream 寫字節(jié)數(shù)組
*/
public class Copy_1 {
public static void main(String[] args) {
long s = System.currentTimeMillis();
FileInputStream fis = null;
FileOutputStream fos = null;
try{
fis = new FileInputStream("c:\\t.zip");
fos = new FileOutputStream("d:\\t.zip");
//定義字節(jié)數(shù)組,緩沖
byte[] bytes = new byte[1024*10];
//讀取數(shù)組,寫入數(shù)組
int len = 0 ;
while((len = fis.read(bytes))!=-1){
fos.write(bytes, 0, len);
}
}catch(IOException ex){
System.out.println(ex);
throw new RuntimeException("文件復制失敗");
}finally{
try{
if(fos!=null)
fos.close();
}catch(IOException ex){
throw new RuntimeException("釋放資源失敗");
}finally{
try{
if(fis!=null)
fis.close();
}catch(IOException ex){
throw new RuntimeException("釋放資源失敗");
}
}
}
long e = System.currentTimeMillis();
System.out.println(e-s);
}
}
字符輸出流寫文本FileWriter類
void write(int c)
寫入單個字符
void write(String str)
寫入字符串
void write(String str, int off, int len)
寫入字符串的某一部分
void write(char[] cbuf)
寫入字符數(shù)組
abstract void write(char[] cbuf, int off, int len)
寫入字符數(shù)組的某一部分
/*
* 字符輸出流
* java.io.Writer 所有字符輸出流的超類
* 寫文件,寫文本文件
*
* 寫的方法 write
* write(int c) 寫1個字符
* write(char[] c)寫字符數(shù)組
* write(char[] c,int,int)字符數(shù)組一部分,開始索引,寫幾個
* write(String s) 寫入字符串
*
* Writer類的子類對象 FileWriter
*
* 構(gòu)造方法: 寫入的數(shù)據(jù)目的
* File 類型對象
* String 文件名
*
* 字符輸出流寫數(shù)據(jù)的時候,必須要運行一個功能,刷新功能
* flush()
*/
public class WriterDemo {
public static void main(String[] args) throws IOException{
FileWriter fw = new FileWriter("c:\\1.txt");
//寫1個字符
fw.write(100);
fw.flush();
//寫1個字符數(shù)組
char[] c = {'a','b','c','d','e'};
fw.write(c);
fw.flush();
//寫字符數(shù)組一部分
fw.write(c, 2, 2);
fw.flush();
//寫如字符串
fw.write("hello");
fw.flush();
fw.close();
}
}
字符輸入流讀取文本FileReader類
/*
* 字符輸入流讀取文本文件,所有字符輸入流的超類
* java.io.Reader
* 專門讀取文本文件
*
* 讀取的方法 : read()
* int read() 讀取1個字符
* int read(char[] c) 讀取字符數(shù)組
*
* Reader類是抽象類,找到子類對象 FileReader
*
* 構(gòu)造方法: 綁定數(shù)據(jù)源
* 參數(shù):
* File 類型對象
* String文件名
*/
public class ReaderDemo {
public static void main(String[] args) throws IOException{
FileReader fr = new FileReader("c:\\1.txt");
/*int len = 0 ;
while((len = fr.read())!=-1){
System.out.print((char)len);
}*/
char[] ch = new char[1024];
int len = 0 ;
while((len = fr.read(ch))!=-1){
System.out.print(new String(ch,0,len));
}
fr.close();
}
}
字符流復制文本文件
/*
* 字符流復制文本文件,必須文本文件
* 字符流查詢本機默認的編碼表,簡體中文GBK
* FileReader讀取數(shù)據(jù)源
* FileWriter寫入到數(shù)據(jù)目的
*/
public class Copy_2 {
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null;
try{
fr = new FileReader("c:\\1.txt");
fw = new FileWriter("d:\\1.txt");
char[] cbuf = new char[1024];
int len = 0 ;
while(( len = fr.read(cbuf))!=-1){
fw.write(cbuf, 0, len);
fw.flush();
}
}catch(IOException ex){
System.out.println(ex);
throw new RuntimeException("復制失敗");
}finally{
try{
if(fw!=null)
fw.close();
}catch(IOException ex){
throw new RuntimeException("釋放資源失敗");
}finally{
try{
if(fr!=null)
fr.close();
}catch(IOException ex){
throw new RuntimeException("釋放資源失敗");
}
}
}
}
}