通過JAVA——IO流 篇一、JAVA——IO流 篇二兩篇文章可以瞭解到關於字符流的操作。
下面是對字節流的操作。InputStream、OutputStream分別是字節輸入流和字節輸出流的基類。在基類下面有很多子類是對於文件等流進行操作,例如FileOutputStream是用來將數據寫入到輸出流文件。用於寫入諸如圖像數據的原始字節流。
例如:將字符通過字節流寫入bytedemo.txt文件。
private static void writeTest() throws Exception
{
//1.創建字節輸出流對象,用於操作文件
FileOutputStream fileOutputStream = new FileOutputStream("bytedemo.txt");
//2.寫數據,直接寫入到了目的地中
fileOutputStream.write("abcdefghijklmn".getBytes());
//fileOutputStream.flush();
//3.關閉資源
fileOutputStream.close();
}
字節流不需要編解碼,可以直接進行存儲。因此不需要通過flush()方法進行刷新。但是需要close()方法進行關閉,以釋放與此流相關聯的任何系統資源。
void write(byte[] b) 將 b.length個字節從指定的字節數組寫入此文件輸出流。
void write(byte[] b, int off, int len) 將 len字節從位於偏移量 off的指定字節數組寫入此文件輸出流。
void write(int b) 將指定的字節寫入此文件輸出流。
FileInputStream從文件獲取輸入字節,用於讀取諸如圖像數據的原始字節流。
例如:從bytedemo.txt文件中讀出數據。
private static void readTest() throws Exception
{
//1.創建字節讀取流對象,和指定文件相關聯
FileInputStream fileInputStream = new FileInputStream("bytedemo.txt");
//2.讀取數據 (無法讀取中文)
int ch = 0;
while((ch = fileInputStream.read()) != -1)
{
System.out.println((char)ch);
}
//關閉資源
fileInputStream.close();
}
第二步讀取數據的形式多種多樣,如下也可
byte[] by = new byte[1024];
int len;
while((len = fileInputStream.read(by)) != -1)
{
System.out.println(new String(by));
}
byte[] by = new byte[fileInputStream.available()];
int len;
while((len = fileInputStream.read(by)) != -1)
{
System.out.println(new String(by));
}
fileInputStream.available();用於獲取文件的字節數,但是對於大文件,不適宜將byte數字建的和其一樣大,而是一部分一部分讀取。
字節流的重點不是讀取一個文本文件,而是用於讀取如圖像數據的原始字節流。下面例程是用於複製一個MP3文件。
private static void copyMp3()
{
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
//創建讀取Mp3的字節流對象
fileInputStream = new FileInputStream("F:\\tiny-heart-master\\birthday-basic\\music\\1.mp3");
//創建寫入Mp3的字節流對象
fileOutputStream = new FileOutputStream("F:\\1.mp3");
//創建字節數組
byte[] b = new byte[1024];
int len;
//讀取MP3文件
while((len = fileInputStream.read(b)) != -1)
{
//將讀取的字節寫入輸出流
fileOutputStream.write(b,0,len);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//關閉流
if(fileOutputStream != null)
{
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fileInputStream != null)
{
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("操作完成");
}
}
和上面的一樣讀取數據的形式多種多樣,也可如下:
private static void copyMp3Low() throws Exception
{
//創建讀取Mp3的字節流對象
FileInputStream fileInputStream = new FileInputStream("F:\\tiny-heart-master\\birthday-basic\\music\\1.mp3");
//創建寫入Mp3的字節流對象
FileOutputStream fileOutputStream = new FileOutputStream("F:\\1.mp3");
int ch;
while((ch = fileInputStream.read()) != -1)
{
fileOutputStream.write(ch);
}
fileInputStream.close();
fileOutputStream.close();
System.out.println("操作完成");
}
通過read()讀取的效率太低。
private static void copyMp3Availavle() throws Exception
{
//創建讀取Mp3的字節流對象
FileInputStream fileInputStream = new FileInputStream("F:\\tiny-heart-master\\birthday-basic\\music\\1.mp3");
//創建寫入Mp3的字節流對象
FileOutputStream fileOutputStream = new FileOutputStream("F:\\1.mp3");
int size = fileInputStream.available();
byte[] b = new byte[size];
fileInputStream.read(b);
fileOutputStream.write(b);
fileInputStream.close();
fileOutputStream.close();
System.out.println("操作完成");
}
通過 fileInputStream.available()的大小定義byte[]大小不適合讀取大文件。
前面字具有緩衝區,那麼相應的字節流也具有其緩衝區,輸入流的緩衝區爲BufferedInputStream、輸出流的緩衝區爲BufferedOutputStream
。
給上面的複製MP3文件添加緩衝區對象則如下:
private static void copyMp3()
{
BufferedInputStream bufferedInputStream = null;
BufferedOutputStream bufferedOutputStream = null;
try {
//創建讀取Mp3的字節流對象
FileInputStream fileInputStream = new FileInputStream("F:\\tiny-heart-master\\birthday-basic\\music\\1.mp3");
//創建讀取Mp3的字節流緩衝區對象
bufferedInputStream = new BufferedInputStream(fileInputStream);
//創建寫入Mp3的字節流對象
FileOutputStream fileOutputStream = new FileOutputStream("F:\\1.mp3");
//創建寫入Mp3的字節流緩衝區對象
bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
//創建字節數組
byte[] b = new byte[1024];
int len;
//讀取MP3文件
while((len = bufferedInputStream.read(b)) != -1)
{
//將讀取的字節寫入輸出流
bufferedOutputStream.write(b,0,len);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
//關閉流
if(bufferedOutputStream != null)
{
try {
bufferedOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(bufferedInputStream != null)
{
try {
bufferedInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("操作完成");
}
}