流:流分為字節(jié)流(以字節(jié)為單位)和字符流(以字符為單位)粪摘。字節(jié)流和字符流又有一個共性徘意,兩個都有輸入流和輸出椎咧。本章主要講解字節(jié)流勤讽。
字節(jié)輸出流:使用字節(jié)輸出流必須用到一個類,這個類是所有輸出流的基類:OutputStream向臀。
下面介紹一下OutputStream類的所有方法:
·public abstract void write(int b) throws IOException:
【向指定的文件中寫入內容飒硅,每次寫入一個字節(jié)三娩,因為字節(jié)可以自動轉換成int類型,但是這里需要使用到循環(huán)寫入】
·public void write(byte[] b) throws IOException
【將內容轉換成字節(jié)數(shù)組雀监,之后再寫入】
·public void write(byte[] b, int off, int len) throws IOException
【將字節(jié)數(shù)組的部分輸出,off表示輸出的內容的起始下標匾竿,len表示輸出的長度】
·public void close() throws IOException
【關閉流岭妖,避免浪費資源】
public void flush() throws IOException
【刷新此輸出流并強制寫出所有緩沖的輸出字節(jié)昵慌≌剩】
示例:要想使用字節(jié)輸出流還需要實現(xiàn)OutputStream的子類淳蔼,這個子類java中已近給我們提供了:FileOutputStream
package com.zhaoqian.outputstream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class Demo2 {
private static final String LINE_SEPARATOR = System.getProperty("line.separator");
public static void main(String[] args) throws Exception {
File f = new File("D:"+File.separator+"Demo"+File.separator+"test.txt");
if (!f.getParentFile().exists()) {
f.getParentFile().mkdirs();
f.createNewFile();
}
// 要寫入文件中的內容鹉梨,換行輸出
String str = LINE_SEPARATOR+"這是一個測試java字節(jié)輸出流的文件";
// 實例化一個流對象
OutputStream os = new FileOutputStream(f,true); // 如果不加true進行追加的化析桥,后的內容會覆蓋前面的內容
//將字符串轉換成字節(jié)數(shù)組
byte[] by = str.getBytes();
// 第一種寫入方法
for(byte b:by){
os.write(b);
}
// 第二種方法,寫入一個字節(jié)數(shù)組的內容(把所有內容存放在字節(jié)數(shù)組中)
// os.write(by);
// 第三種寫法:部分寫入
// os.write(by, 0, 5);
// 刷新數(shù)據(jù)
os.flush();
// 關閉資源
os.close();
}
}
上面是java中字節(jié)輸出流泡仗,下面是字節(jié)輸入流娩怎,和字節(jié)輸出流一樣截亦,輸出流也有一個基類:InputStream.所有的輸入流都是繼承了這個類袍啡。
而要實現(xiàn)字節(jié)輸入流也需要實現(xiàn)InputStream的子類却桶,這個子類同樣java中提供了:FileInputStream:
下面先介紹一下InputStream的常用的方法:
·public abstract int read() throws IOException:
【將文件中的內容讀取出來颖系,每次讀取一個字節(jié)嗅剖,會自動將byte轉換成int返回,如果沒有數(shù)據(jù)返回-1】
·public int read(byte[] b) throws IOException:
【每次讀取一個字節(jié)數(shù)組長度的內容嘁扼,返回的是讀取到的長度信粮,如果沒有數(shù)據(jù)返回-1】
·public int read(byte[] b, int off, int len) throws IOException:
【將內容讀取到數(shù)組的部分元素,off表示起始下標趁啸,len表示長度强缘,返回的是讀取到的長度,如果沒有數(shù)據(jù)返回-1】
示例:
package com.zhaoqiang.inputstream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class Demo2 {
public static void main(String[] args) throws Exception {
File f = new File("D:"+File.separator+"Demo"+File.separator+"test.txt");
if (!f.getParentFile().exists()) {
f.getParentFile().mkdirs();
f.createNewFile();
}
// 實例化一個字節(jié)輸入流對象
InputStream is = new FileInputStream(f);
byte[] by = new byte[2];
int len = 0;
test2(is, by);
// test1(is);
}
private static void test2(InputStream is, byte[] by) throws IOException {
int len;
StringBuffer sb = new StringBuffer();
while((len = is.read(by)) != -1){
sb.append(new String(by,0,len));
// System.out.println(new String(by,0,len));
}
System.out.println(sb);
is.close();
}
private static void test1(InputStream is) throws IOException {
// 定義一個字節(jié)數(shù)組.用于接受讀取到的字節(jié),數(shù)組長度必須大于或等于所讀內容的字節(jié)數(shù)
//byte[] by = new byte[1024];
// 一個自己數(shù)組和文件字節(jié)大小一樣莲绰,不建議這樣使用.因為一個文件過大,內存容易溢出
byte[] by = new byte[is.available()];
int temp = 0;
int index = 0;
while((temp = is.read()) != -1){
by[index++] = (byte)temp;
}
// 將一個字節(jié)數(shù)組轉換成字符串輸出
// System.out.println(new String(by));
System.out.println(new String(by,0,index));
is.close();
}
}
IO中異常處理示例:
package com.zhaoqiang.inputstream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class Demo3 {
/*
* 異常處理
* */
public static void main(String[] args) {
File file = new File("D:"+File.separator+"Demo"+File.separator+"test.txt");
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
OutputStream os = null;
try {
os = new FileOutputStream(file);
os.write("測試數(shù)據(jù)".getBytes());
} catch (IOException e) {
// e.printStackTrace();
System.out.println(e.toString());
throw new RuntimeException("文件創(chuàng)建錯誤");
}finally{
// 關閉資源時候發(fā)生了IO異常
if (os == null) {
System.out.println("文件創(chuàng)建失敗");
}else{
try {
// 這個地方的情況必須是文件創(chuàng)建成功之后
os.close();
} catch (IOException e) {
throw new RuntimeException("底層出錯");
}
}
}
}
}
示例:通過字節(jié)流復制文件
package com.zhaoqiang.inputstream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class Demo4 {
/*
* 用字節(jié)流復制一個文件
* */
public static void main(String[] args) throws IOException {
// 源文件
File file = new File("D:"+File.separator+"Demo"+File.separator+"1.jpg");
// 目的地
File fe = new File("F:"+File.separator+"Demo"+File.separator+"11.jpg");
![無標題.png](http://upload-images.jianshu.io/upload_images/5193081-3420e89a5143b87a.png)
// 創(chuàng)建流
OutputStream os = new FileOutputStream(fe);
InputStream in = new FileInputStream(file);
// 使用輸入流的讀取方式讀取字節(jié)姑丑,并將字節(jié)寫入到目的中
int len = 0;
byte[] by = new byte[1024];
// 讀一個寫一個
while((len = in.read(by))!=-1){
os.write(by);
}
// 關閉資源
in.close();
os.close();
}
}
上面的代碼解釋圖形: