更新時間:2020-11-19 17:32:23 來源:動力節(jié)點 瀏覽1076次
從流的內(nèi)容來講,有字節(jié)和字符之分。顧名思義,字節(jié)流是由字節(jié)組成的,字符流是由字符組成的。IO字節(jié)流是Java IO流中非常重要的一種IO流,本文我們就通過實例一起來學(xué)習(xí)IO字節(jié)流。
IO字節(jié)流主要是操作byte類型數(shù)據(jù),以byte數(shù)組為準(zhǔn),主要操作類就是OutputStream、InputStream。
一、字節(jié)輸出流:OutputStream
OutputStream是整個IO包中字節(jié)輸出流的最大父類,此類的定義如下:
public abstract class OutputStream extends Object implements Closeable,Flushable
從以上的定義可以發(fā)現(xiàn),此類是一個抽象類,如果想要使用此類的話,則首先必須通過子類實例化對象,那么如果現(xiàn)在要操作的是一個文件,則可以使用:FileOutputStream類。通過向上轉(zhuǎn)型之后,可以為OutputStream實例化
Closeable表示可以關(guān)閉的操作,因為程序運行到最后肯定要關(guān)閉
Flushable:表示刷新,清空內(nèi)存中的數(shù)據(jù)
FileOutputStream類的構(gòu)造方法如下:
public FileOutputStream(File file)throws FileNotFoundException
寫數(shù)據(jù):
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Test11 {
public static void main(String[] args) throws IOException {
File f = new File("d:" + File.separator+"test.txt");
OutputStream out=new FileOutputStream(f);//如果文件不存在會自動創(chuàng)建
String str="Hello World";
byte[] b=str.getBytes();
out.write(b);//因為是字節(jié)流,所以要轉(zhuǎn)化成字節(jié)數(shù)組進行輸出
out.close();
}
}
也可以一個字節(jié)一個字節(jié)進行輸出,如下:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Test11 {
public static void main(String[] args) throws IOException {
File f = new File("d:" + File.separator+"test.txt");
OutputStream out=new FileOutputStream(f);//如果文件不存在會自動創(chuàng)建
String str="Hello World";
byte[] b=str.getBytes();
for(int i=0;i<b.length;i++){< p="">
out.write(b[i]);
}
out.close();
}
}
以上輸出只會進行覆蓋,如果要追加的話,請看FileOutputStream類的另一個構(gòu)造方法:
public FileOutputStream(File file,boolean append)throws FileNotFoundException
在構(gòu)造方法中,如果將append的值設(shè)置為true,則表示在文件的末尾追加內(nèi)容。
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Test11 {
public static void main(String[] args) throws IOException {
File f = new File("d:" + File.separator+"test.txt");
OutputStream out=new FileOutputStream(f,true);//追加內(nèi)容
String str="\r\nHello World";
byte[] b=str.getBytes();
for(int i=0;i<b.length;i++){< p="">
out.write(b[i]);
}
out.close();
}
}
文件中換行為:\r\n
二、字節(jié)輸入流:InputStream
既然程序可以向文件中寫入內(nèi)容,則就可以通過InputStream從文件中把內(nèi)容讀取進來,首先來看InputStream類的定義:
public abstract class InputStream extends Object implements Closeable
與OutputStream類一樣,InputStream本身也是一個抽象類,必須依靠其子類,如果現(xiàn)在是從文件中讀取,就用FileInputStream來實現(xiàn)。
觀察FileInputStream類的構(gòu)造方法:
public FileInputStream(File file)throws FileNotFoundException
讀文件:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class Test12 {
public static void main(String[] args) throws IOException {
File f = new File("d:" + File.separator+"test.txt");
InputStream in=new FileInputStream(f);
byte[] b=new byte[1024];
int len=in.read(b);
in.close();
System.out.println(new String(b,0,len));
}
}
但以上方法是有問題的,用不用開辟這么大的一個字節(jié)數(shù)組,明顯是浪費嘛,我們可以根據(jù)文件的大小來定義字節(jié)數(shù)組的大小,F(xiàn)ile類中的方法:public long length()
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class Test13 {
public static void main(String[] args) throws IOException {
File f = new File("d:" + File.separator+"test.txt");
InputStream in=new FileInputStream(f);
byte[] b=new byte[(int) f.length()];
in.read(b);
in.close();
System.out.println(new String(b));
}
}
我們換種方式,一個字節(jié)一個字節(jié)讀入~
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class Test14 {
public static void main(String[] args) throws IOException {
File f = new File("d:" + File.separator+"test.txt");
InputStream in=new FileInputStream(f);
byte[] b=new byte[(int) f.length()];
for(int i=0;i<b.length;i++){< p="">
b[i]=(byte) in.read();
}
in.close();
System.out.println(new String(b));
}
}
但以上情況只適合知道輸入文件的大小,不知道的話用如下方法:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class Test15 {
public static void main(String[] args) throws IOException {
File f = new File("d:" + File.separator+"test.txt");
InputStream in=new FileInputStream(f);
byte[] b=new byte[1024];
int temp=0;
int len=0;
while((temp=in.read())!=-1){//-1為文件讀完的標(biāo)志
b[len]=(byte) temp;
len++;
}
in.close();
System.out.println(new String(b,0,len));
}
}
實際上IO字節(jié)流和IO字符流的使用是非常相似的,但字節(jié)流在操作的時候本身是不會用到緩沖區(qū)(內(nèi)存)的,是與文件本身直接操作的,而字符流在操作的時候是使用到緩沖區(qū)的。學(xué)完了IO字節(jié)流,想要學(xué)習(xí)IO字符流的小伙伴可以觀看本站的Java教程學(xué)習(xí),對比兩種IO流我們學(xué)習(xí)起來也能事半功倍哦。