字節流主要操作byte類型數據,以byte數組爲準,主要操作類是OutputStream類和InputStream類。
1、字節輸出流:OutputStream
OutputStrem類是一個抽象類,要使用必須通過子類實例化對象,要操作文件,則使用FileOutputStream類轉型,在實例化。
【OutputStream類常用方法】
* public void close() throws IOException 關閉輸出流
* public void flush() throws IOException 刷新緩衝區
* public void write(byte[] b) throws IOException 將一個byte數組寫入數據流
* public void write(byte[] b,int off,int len) throws IOException 將一個指定範圍的byte數組寫入數據流
* public void write(int b) throws IOException 將一個字節數據寫入數據流
實例一、向文件中寫入數據
public class OutputStreamDemo {
/*向文件中寫入字符串*/
public static void main(String[] args) {
//在file類中找到一個文件
File f = new File("D:"+File.separator+"test.txt");
try {
//通過子類實例化父類對象
OutputStream out = new FileOutputStream(f);
String str = "Hello world !";
//直接將字符串變爲byte數組,然後寫入文件
byte b[] = str.getBytes();
//數據寫入
out.write(b);
//關閉輸出流
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
耶可以通過循環把每一個字節一個個的寫入到文件
public class OutputStreamDemo {
/*向文件中寫入字符串*/
public static void main(String[] args) {
//在file類中找到一個文件
File f = new File("D:"+File.separator+"test.txt");
try {
//通過子類實例化父類對象
OutputStream out = new FileOutputStream(f);
String str = "Hello world !";
//將字符串變爲byte數組
byte b[] = str.getBytes();
//數據寫入
for (int i = 0; i < b.length; i++) {
out.write(b[i]);
}
//關閉輸出流
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
實例二:向文件中追加新的數據
通過FileOutputStream向文件中追加新內容。通過構造方法實現:
public FileOutputStream(File file,boolean append) throws FileFoundException,在構造方法中獎append的值設置爲true,則表示在文件的末尾追加內容。
public class OutputStreamDemo {
/*向文件中寫入字符串*/
public static void main(String[] args) {
//在file類中找到一個文件
File f = new File("D:"+File.separator+"test.txt");
try {
//通過子類實例化父類對象
OutputStream out = new FileOutputStream(f,true);
String str = "\r\nHello world !";
//將字符串變爲byte數組
byte b[] = str.getBytes();
//數據寫入
for (int i = 0; i < b.length; i++) {
out.write(b[i]);
}
//關閉輸出流
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2、字節輸入流:InputStream
也是一個抽象類,需要通過FileInputStream子類進行實例化
* 【InputStream類的常用方法】
* public int available() throws IOException 可以取得輸入文件的大小
* public void close() throws IOException 關閉輸入流
* public abstract int read() throws IOExcrption 讀取內容,以數組方式讀取
* public int read(byte[] b) throws IOExcrption 將內容讀到byte數組中同時返回讀入的個數
實例:讀取文件數據
public class InputStream {
public static void main(String[] args) {
/*1、使用File找到一個文件*/
File f = new File("D:"+File.separator+"test.txt");
/*2、通過子類實例化對象*/
try {
FileInputStream input = new FileInputStream(f);
/*3、開始讀取操作*/
byte b[] = new byte[1024]; //將所有內容讀取到數組
input.read(b);
/*關閉輸入流*/
input.close();
/*把byte數字當做字符串輸出*/
System.out.println("讀取內容:"+new String(b));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
上述代碼在讀取數據的時候會帶有很多空格的,我們可以指定byte數組範圍,如下修正
public class InputStream {
public static void main(String[] args) {
/*1、使用File找到一個文件*/
File f = new File("D:"+File.separator+"test.txt");
/*2、通過子類實例化對象*/
try {
FileInputStream input = new FileInputStream(f);
/*3、開始讀取操作*/
byte b[] = new byte[1024]; //將所有內容讀取到數組
int len = input.read(b);
/*關閉輸入流*/
input.close();
/*把byte數字當做字符串輸出*/
System.out.println("讀取內容:"+new String(b,0,len));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
雖然不在出現空格,但是在數組中開闢了過多的無效內存,佔用很多空間。我們可以根據文件的數量來開闢相應的內容空間。
public class InputStream {
public static void main(String[] args) {
/*1、使用File找到一個文件*/
File f = new File("D:"+File.separator+"test.txt");
/*2、通過子類實例化對象*/
try {
FileInputStream input = new FileInputStream(f);
/*3、開始讀取操作*/
//將所有內容讀取到數組,數組大小由文件內容大小決定
byte b[] = new byte[(int) f.length()];
input.read(b);
/*關閉輸入流*/
input.close();
/*把byte數字當做字符串輸出*/
System.out.println("讀取內容:"+new String(b));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
上面代碼是一次性讀取出文件中的所有內容,我們也可以一個字節一個字節的來讀取,修改如下代碼:
在知曉數組具體大小的情況下:
public class InputStream {
public static void main(String[] args) {
/*1、使用File找到一個文件*/
File f = new File("D:"+File.separator+"test.txt");
/*2、通過子類實例化對象*/
try {
FileInputStream 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();
}
/*關閉輸入流*/
input.close();
/*把byte數字當做字符串輸出*/
System.out.println("讀取內容:"+new String(b));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
在不知曉數組具體大小的情況下,只能通過判斷是否讀取到文件末尾來進行內容讀取:
public class InputStream {
public static void main(String[] args) {
/*1、使用File找到一個文件*/
File f = new File("D:"+File.separator+"test.txt");
/*2、通過子類實例化對象*/
try {
FileInputStream input = new FileInputStream(f);
/*3、開始讀取操作*/
//將所有內容讀取到數組,數組大小由文件內容大小決定
byte b[] = new byte[1024];
int temp = 0; //接收讀取的內容
int len = 0; //記錄讀取的數據個數
while ((temp=input.read())!=-1) {
//將每次讀取的內容給temp變量,如過temp不等於-1.表示還沒讀取完
b[len]=(byte)temp;
len++;
}
/*關閉輸入流*/
input.close();
/*把byte數字當做字符串輸出*/
System.out.println("讀取內容:"+new String(b,0,len));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}