1.InputStream
InputStream的常用方法
方法聲明 | 功能描述 |
---|---|
int read( ) | 從輸入流讀取一個8位的字節,把它轉換爲0~255之間的整數,並返回這一個整數 |
int read( byte[ ] b) | 從輸入流讀取若干個字節,將它們保存到參數b指定的字節數組中,返回的整數表示讀取字節的數目 |
int read( byte[ ] b,int off ,int len ) | 從輸入流讀取若干個字節,將它們保存到參數b指定的字節數組中,off指定字節數組開始保存數據的起始下標,len表示讀取的字節數目 |
void close() | 關閉輸入流並釋放與該流關聯的所有系統資源 |
2.OutputStream
OutputStream的常用方法
方法聲明 | 功能描述 |
---|---|
int write( ) | 向輸出流寫入一個字節 |
int write( byte[ ] b) | 把參數b指定的字符數組的所有字節寫到輸出流 |
int write( byte[ ] b,int off ,int len ) | 將指定byte數組中的從偏移量off開始的len個字節寫入輸出流 |
void close() | 關閉此輸出流並釋放與此流相關的所有系統資源 |
3.字節流文件的讀寫操作
關於文件地址的問題:
1.先打開一個文件的屬性界面:
2.我們需要寫入的地址就是文件的位置加上文件名,上面的地址就是
C:\Users\86191\Desktop\新建文本文檔.txt
3.寫入的文件不一定需要存在,因爲找不到,系統會自動在當前目錄下創建一個文件,但是要注意的,我們是詳細到一個文檔,而不是一個文件,否則可能會出現拒絕訪問的錯誤,這個要注意一下
1.FileInputStream
FileInputStream是InputStream的子類,它是操作文件的字節輸入流,專門用於讀取文件中的數據,由於從文件中讀取數據是重複的操作,因此需要通過循環語句來實現數據的持續讀取
例子:
import java.io.FileInputStream;
public class FileInOut {
public static void main(String[] args) throws Exception {
//創建一個文件字節輸入流
FileInputStream in=new FileInputStream("D:\\Java\\first\\IO\\src\\text");//雙引號裏面的內容是你所讀取文件的地址
int b=0;//定義一個int類型的變量b,是爲了記住每次讀取的一個字節
while(true) {
b=in.read();//保存讀取的一個字節
if(b==-1) {//如果讀取的字節爲-1,就跳出while循環語句
break;
}
System.out.println(b);//否則就把b輸出
}
in.close();//關閉輸入流
}
}
2.FileOutputStream
FileOutputStream是OutputStream的子類,它是操作文件的字節輸出流,專門用於把數據寫入文件。
例子:
import java.io.FileOutputStream;
public class FileOutPutStream {
public static void main(String[] args) throws Exception {
//創建一個文件字節輸出流
FileOutputStream out=new FileOutputStream("D:\\Java\\first\\IO\\src\\text");//雙引號裏面的是你所要寫入的文件
String str="Hello world";//所要寫入的字符串
byte[] b=str.getBytes();//將此字符串轉換爲字節數組
for(int i=0;i<b.length;i++) {
out.write(b[i]);//一個字節一個字節存儲到所要寫入文件
}
out.close();//關閉輸出流
}
}
4.文件的拷貝
在應用程序中,IO流經常都是成對出現的,即輸入流和輸出一起使用。例如文件的拷貝就需要通過輸入流來讀取文件中的數據,通過輸出流將數據寫入文件
例子1:使用read( ),write( )單個字節拷貝
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileInOut {
public static void main(String[] args) throws Exception {
//創建一個文件字節輸入流
FileInputStream in=new FileInputStream("D:\\Java\\first\\IO\\src\\text");
//創建一個文件字節輸出流
FileOutputStream out=new FileOutputStream("D:\\Java\\first\\IO\\src\\text1");
int b=0;//定義一個變量來暫存讀取的文件裏面的字節
long begintime=System.currentTimeMillis();//程序執行到這裏的時間
while(b!=-1) {//當讀取到-1跳出循環
b=in.read();//把讀取的字節存儲到b中
out.write(b);//在把字節b讀入到寫入的文件
}
long endtime=System.currentTimeMillis();//程序執行到這裏的時間
System.out.println("耗費時間爲:"+(endtime-begintime)+"毫秒");
in.close();
out.close();
}
}
例子2:使用read( byte[ ] b) ,write(byte[ ] b) 多個字節拷貝
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileInOut {
public static void main(String[] args) throws Exception {
FileInputStream in=new FileInputStream("D:\\Java\\first\\IO\\src\\text");
FileOutputStream out=new FileOutputStream("D:\\Java\\first\\IO\\src\\text1");
byte[] b=new byte[10000];//定義一個byte【】數組來暫存字節
long begintime=System.currentTimeMillis();
while(in.read(b)!=-1) {//如果讀取到-1跳出循環
out.write(b);//把字節數組b寫入文件
}
long endtime=System.currentTimeMillis();
System.out.println("耗費時間爲:"+(endtime-begintime)+"毫秒");
in.close();
out.close();
}
}
例子3:使用read( byte[ ] b,int off ,int len ),write( byte[ ] b,int off ,int len )多個字節拷貝
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileInOut {
public static void main(String[] args) throws Exception {
//創建一個
FileInputStream in=new FileInputStream("D:\\Java\\first\\IO\\src\\text");
FileOutputStream out=new FileOutputStream("D:\\Java\\first\\IO\\src\\text1");
byte[] b=new byte[10000];
long begintime=System.currentTimeMillis();
while(in.read(b,0,10000)!=-1) {//讀取文件中的字節數組大小爲0,到10000大小的字節數組
out.write(b,0,10000);//寫入10000大小字節數組大小的到文件中
}
long endtime=System.currentTimeMillis();
System.out.println("耗費時間爲:"+(endtime-begintime)+"毫秒");
in.close();
out.close();
}
}
總結歸納:
- .第二種方法和第三種方法近乎相同,可以任意組合
- 我們可以通過輸出結果發現read( byte[ ] b)和read( byte[ ] ,int off,int len)拷貝的速度遠遠大於read(),但是當你將byte[ ]數組的大小改爲1時,實際的時間還是和read()幾乎一樣,通過這個現象,我們可以總結出來一點:
——真正影響拷貝速度的是緩衝區的大小,也就是byte[ ]數組的大小
注:那是不是byte[ ] 數組越大越好呢,答案是不對的,經我自己實驗,byte[ ] 數組定的過大也會使拷貝速度變長。byte[ ] 數組定的過小也會使拷貝速度變長
- 那既然定大也不是,定小也不是,我們byte數組的大小怎麼才能使速度達到最大呢,這時候我們就需要和電腦配置以及應用的需求相關聯等和多查點兒資料
5.字節緩衝流
在IO包中提供兩個帶緩衝的字節流,分別是BufferedInputStream和BufferedOutputStream,它們的構造方法中分別接受的InputStream和OutputStream類型的參數作爲對象,在讀寫數據時提供緩衝功能。所以使用字節緩衝流的時候,應用程序是通過緩衝流來完成數據讀寫的,而緩衝流又是通過底層的字節流與設備進行關聯的
例子:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileInOut {
public static void main(String[] args) throws Exception {
//創建帶緩衝區的輸入流
BufferedInputStream in=new BufferedInputStream(new FileInputStream("D:\\Java\\first\\IO\\src\\text"));
//創建帶緩衝區的輸出流
BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream("D:\\Java\\first\\IO\\src\\text1"));
int b=0;
long begintime=System.currentTimeMillis();
while(b!=-1) {
b=in.read();
out.write(b);
}
long endtime=System.currentTimeMillis();
System.out.println("耗費時間爲:"+(endtime-begintime)+"毫秒");
in.close();
out.close();
}
}
總結歸納:
爲什麼使用了字節緩衝流之後再使用read()方法,速度比直接使用read()方法的速度快了很多
——因爲在BufferedInputStream裏面的read()方法默認的緩衝區大小是1024。而在FileInputStream裏面的read()方法默認的緩衝區大小是8,所以當你用read(byte[ ] ,int off,int len)裏面的off爲0,長度爲1024/8的話,得到的速度和BufferedInputStream裏面的read()幾乎相似
- BufferedInputStream和BufferedOutputStream可以使用上面的所以方法,所以也有很多種拷貝方法,不單單是樣例中的一種