JAVA基礎【字節流】史上最簡單的字節流操作演示
前言:

其實字符流的底層還是使用的字節流,因為計算機只識別二進制,雖然我們輸出字符流的時候,里面寫的是字符但是最終還是轉換成字節流然后在進行存儲或讀取。并且還使用到了一個中間轉換的類OutputStreamWriter和InputStreamReader,一個是在輸出到本地的時候可以把字符流轉換成字節流輸出,還有一個是在本地讀取字節流的內容,然后轉換成字符流輸出到程序的控制臺或者存儲到指定的容器里。
概述:
本篇博客會先從什么是IO流的概念開始介紹,然后才是例子演示。所以前面一部分理論可能會有點枯燥,不過沒有理論的例子是沒有靈魂的。如果沒有理論指導,即使把例子實現了也不會真正的理解什么是IO流?什么是字節流?什么是字符流?所以先從概念開始,然后依次是讀取本地文件和把用戶輸入的內容輸出到指定的硬盤位置。最后會有一個小小的擴展圖片復制(本片博客例子部分只列出了字節流的操作,字符流的詳細操作敬請期待下一篇博客。)
目錄
IO流
概念:
分類:
數據的流向分為:輸入流和輸出流。
數據的類型分為:字節流和字符流。
IO流圖解流向說明
讀取
單個讀取
數組讀取
寫出
單個寫出
數組寫出
圖片復制
IO流
概念:
生活中,你肯定經歷過這樣的場景。當你編輯一個文本文件,忘記了 ctrl+s ,可能文件就白白編輯了。當你電腦 上插入一個U盤,可以把一個視頻,拷貝到你的電腦硬盤里。那么數據都是在哪些設備上的呢?鍵盤、內存、硬 盤、外接設備等等。 我們把這種數據的傳輸,可以看做是一種數據的流動,按照流動的方向,以內存為基準,分為 輸入input 和 輸出 output ,即流向內存是輸入流,流出內存的輸出流。 Java中I/O操作主要是指使用 Java.io 包下的內容,進行輸入、輸出操作。輸入也叫做讀取數據,輸出也叫做作寫 出數據。
分類:
數據的流向分為:輸入流和輸出流。
輸入流 :把數據從 其他設備 上讀取到 內存 中的流。
輸出流 :把數據從 內存 中寫出到 其他設備 上的流。
數據的類型分為:字節流和字符流。
字節流 :以字節為單位,讀寫數據的流。
字符流 :以字符為單位,讀寫數據的流。
IO流圖解流向說明
讀取
單個讀取
package com.itheima.demo02.Reader;
import java.io.FileInputStream;
import java.io.IOException;
/*
* 使用字節流讀取中文文件
* 1個中文
* GBK:占用兩個字節
* UTF-8:占用三個字節
* */
public class Demo01InputStream {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("F:\虛擬機共享文件\Stream\康世行.txt");
int len=0;
while ((len=fis.read())!=-1){
System.out.println(len);
}
fis.close();
}
}
數組讀取
package com.itheima.demo02.Reader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.IOException;
/*
* 2. 使用字節數組讀取: read(byte[] b) ,每次讀取b的長度個字節到數組中,返回讀取到的有效字節個數,讀
取到末尾時,返回 -1
* */
public class Demo02Reader {
public static void main(String[] args) throws IOException {
// 使用文件名稱創建流對象.
FileInputStream fis = new FileInputStream("read.txt"); // 文件中為abcde
// 定義變量,作為有效個數
int len ;
// 定義字節數組,作為裝字節數據的容器
byte[] b = new byte[2];
// 循環讀取
while (( len= fis.read(b))!=‐1) {
// 每次讀取后,把數組變成字符串打印
System.out.println(new String(b));
}
// 關閉資源
fis.close();
}
}
寫出
單個寫出
package com.itheima.demo01.OutputStream;
import java.io.*;
/*
*java.io.OutputStream此抽象類是表示輸出字節流的所有類的超類
* public void close() :關閉此輸出流并釋放與此流相關聯的任何系統資源。
public void flush() :刷新此輸出流并強制任何緩沖的輸出字節被寫出。
public void write(byte[] b) :將 b.length字節從指定的字節數組寫入此輸出流。
public void write(byte[] b, int off, int len) :從指定的字節數組寫入 len字節,從偏移量 off開始輸
出到此輸出流。
public abstract void write(int b) :將指定的字節輸出流
* 繼承者 java.io.FileOutputStream 文件字節輸出流
* 構造方法
* FileOutputStream(File file)
創建一個向指定 File 對象表示的文件中寫入數據的文件輸出流。
FileOutputStream(String name)
創建一個向具有指定名稱的文件中寫入數據的輸出文件流。
參數: 寫入數據的目的地
* File file 目的地是一個文件(對象)
* String name 目的地是一個文件路徑
* 作用
* 1.創建一個FileoutputStream對象
* 2.會根據構造方法中 傳遞的文件/文件路徑,創建一個空文件
* 3.會把Fileoutputstream對象指向創建好的文件
* */
public class Demo01OutputStream {
public static void main(String[] args) {
//使用File對象創建流對象
File file=new File("F:\虛擬機共享文件\Stream\康世行.txt");
try {
//輸出到指定位置
FileOutputStream fos=new FileOutputStream(file,true);
//讀取指定文件內容
FileInputStream finput=new FileInputStream(file);
//向文件里寫入數據
fos.write('s');
finput.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
數組寫出
package com.itheima.demo01.OutputStream;
import java.io.*;
/*
*java.io.OutputStream此抽象類是表示輸出字節流的所有類的超類
* public void close() :關閉此輸出流并釋放與此流相關聯的任何系統資源。
public void flush() :刷新此輸出流并強制任何緩沖的輸出字節被寫出。
public void write(byte[] b) :將 b.length字節從指定的字節數組寫入此輸出流。
public void write(byte[] b, int off, int len) :從指定的字節數組寫入 len字節,從偏移量 off開始輸
出到此輸出流。
public abstract void write(int b) :將指定的字節輸出流
* 繼承者 java.io.FileOutputStream 文件字節輸出流
* 構造方法
* FileOutputStream(File file)
創建一個向指定 File 對象表示的文件中寫入數據的文件輸出流。
FileOutputStream(String name)
創建一個向具有指定名稱的文件中寫入數據的輸出文件流。
參數: 寫入數據的目的地
* File file 目的地是一個文件(對象)
* String name 目的地是一個文件路徑
* 作用
* 1.創建一個FileoutputStream對象
* 2.會根據構造方法中 傳遞的文件/文件路徑,創建一個空文件
* 3.會把Fileoutputstream對象指向創建好的文件
* */
public class Demo01OutputStream {
public static void main(String[] args) {
//使用File對象創建流對象
File file=new File("F:\虛擬機共享文件\Stream\康世行.txt");
try {
//輸出到指定位置
FileOutputStream fos=new FileOutputStream(file,true);
//讀取指定文件內容
FileInputStream finput=new FileInputStream(file);
//使用字節數組
byte[] b="康世行".getBytes();
fos.write(b);//寫出數據
fos.write(';');
//讀取指定文件內容
//使用字節數組讀取
int len;//定義變量,作為有效個數(標記)
//定義字節數組,作為封裝字節數據的容器
byte[] b1=new byte[2];
while ((len=finput.read(b1))!=-1){
//每次讀取后,把數組變成字符串打印(也可以寫入到指定文件里)
System.out.println(new String(b1,0,len));
fos.write(b1);//寫出數據
}
//關閉資源
finput.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
圖片復制
思路:
圖片復制挺簡單的,核心思想就是一讀一寫。
利用FileInputStream類里的read()方法讀取本地指定的文件內容,
這里讀取的是圖片(也可以是其它的文件)。
然后把讀取的數據流,使用FileOutputStream類里的write()方法輸出到指定的硬盤位置。
package com.itheima.demo01.OutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 練習:圖片復制
* */
public class CopyImage {
public static void main(String[] args) throws IOException {
//開始時間
long s=System.currentTimeMillis();
//1創建流對象
//指定數據源
FileInputStream fis=new FileInputStream("F:\\虛擬機共享文件\\Stream\\timg.jfif");
//指定目的地
FileOutputStream fos=new FileOutputStream("F:\\虛擬機共享文件\\Stream\\image\\ksh.jpg");
//2讀寫數據
//定義有效數據標記
int len;
//定義字節數組,用于封裝字節和數據暫存。
byte[] b=new byte[1024];
//讀取數據
while ((len=fis.read(b))!=-1){
//寫出數據
fos.write(b,0,len);
}
//3釋放資源
fos.close();
fis.close();
long e=System.currentTimeMillis();
System.out.println("復制用時"+(e-s)+"毫秒");
}
}
Java 數據結構
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。