IO流下:位元組流、流操作規律(java基礎)
一、位元組流
1.概述:
1、位元組流和字元流的基本操作是相同的,但是要想操作媒體流就需要用到位元組流。
2、位元組流因為操作的是位元組,所以可以用來操作媒體檔案。(媒體檔案也是以位元組儲存的)
3、讀寫位元組流:InputStream 輸入流(讀)和OutputStream 輸出流(寫)
4、位元組流操作可以不用重新整理流操作。
5、InputStream特有方法:
int available();//返回檔案中的位元組個數
注:可以利用此方法來指定讀取方式中傳入陣列的長度,從而省去迴圈判斷。但是如果檔案較大,而虛擬機器啟動分配的預設記憶體一般為64M。當檔案過大時,此陣列長度所佔記憶體空間就會溢位。所以,此方法慎用,當檔案不大時,可以使用。練習:
需求:複製一張圖片F:\java_Demo\day9_28\1.BMP到F:\java_Demo\day9_28\2.bmp
import java.io.*;
class CopyPic {
public static void main(String[] args){
copyBmp();
System.out.println("複製完成");
}
public static void copyBmp() {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("F:\\java_Demo\\day9_28\\1.bmp"); //寫入流關聯檔案
fos = new FileOutputStream("F:\\java_Demo\\day9_28\\2.bmp"); //讀取流關聯檔案
byte[] copy = new byte[1024];
int len = 0;
while((len=fis.read(copy))!=-1) {
fos.write(copy,0,len);
}
}
catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("複製檔案異常");
}
finally {
try {
if(fis!=null) fis.close();
}
catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("讀取流");
}
}
}
}
2. 位元組流緩衝區
* 位元組流緩衝區跟字元流緩衝區一樣,也是為了提高效率。
注意事項:
1. read():會將位元組byte()提升為int型值
2. write():會將int型別轉換為byte()型別,保留最後的8位。
練習:
1.複製MP3檔案 1.MP3 --> 2.MP3
2.自己寫一個MyBufferedInputStream緩衝類,提升複製速度
程式碼:
import java.io.*;
//自己的BufferedInputStream
class MyBufferedInputStream {
private InputStream in; //定義一個流物件
private byte [] buf = new byte[1024*4];
private int count = 0,pos = 0;
public MyBufferedInputStream(InputStream in){
this.in = in;
}
public int MyRead() throws IOException{
if(count==0) { //當陣列裡的資料為空時候,讀入資料
count = in.read(buf);
pos = 0;
byte b = buf[pos];
count--;
pos++;
return b&255; //提升為int型別,在前面三個位元組補充0。避免1111 1111 1111 1111
}
else if(count > 0) {
byte b = buf[pos];
pos++;
count--;
return b&0xff; //提升為int型別,在前面三個位元組補充0。避免1111 1111 1111 1111
}
return -1;
}
public void myClose() throws IOException{
in.close();
}
}
class BufferedCopyDemo {
public static void main(String[] args) {
long start = System.currentTimeMillis();
copy();
long end = System.currentTimeMillis();
System.out.println("時間:"+(end-start)+"ms");
start = System.currentTimeMillis();
copy1();
end = System.currentTimeMillis();
System.out.println("時間:"+(end-start)+"ms");
}
public static void copy1() { // 應用自己的緩衝區緩衝資料
MyBufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
bis = new MyBufferedInputStream(new FileInputStream("馬旭東-入戲太深.mp3"));//匿名類,傳入一個InputStream流物件
bos = new BufferedOutputStream(new FileOutputStream("3.mp3"));
int buf = 0;
while((buf=bis.MyRead())!=-1) {
bos.write(buf);
}
}
catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("複製失敗");
}
finally {
try {
if(bis!=null) {
bis.myClose();
bos.close();
}
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}
二、流操作規律
1. 鍵盤讀取,控制檯列印。
System.out: 對應的標準輸出裝置:控制檯 //它是PrintStream物件,(PrintStream:列印流。OutputStream的子類)
System.in: 對應的標準輸入裝置:鍵盤 //它是InputStream物件
示例:
/*================從鍵盤錄入流,列印到控制檯上================*/
public static void InOutDemo(){
//鍵盤的最常見的寫法
BufferedReader bufr = null;
BufferedWriter bufw = null;
try {
/*InputStream ips = System.in; //從鍵盤讀入輸入位元組流
InputStreamReader fr = new InputStreamReader(ips); //將位元組流轉成字元流
bufr = new BufferedReader(fr); */ //將字元流加強,提升效率
bufr = new BufferedReader(new InputStreamReader(System.in)); //匿名類。InputSteamReader:讀取位元組並將其解碼為字元
bufw = new BufferedWriter(new OutputStreamWriter(System.out)); //OutputStreamWriter:要寫入流中的字元編碼成位元組
String line = null;
while((line = bufr.readLine())!=null){
if("over".equals(line)) break;
bufw.write(line.toUpperCase()); //列印
bufw.newLine(); //為了相容,使用newLine()寫入換行符
bufw.flush(); //必須要重新整理。不然不會顯示
}
if(bufw!=null) {
bufr.close();
bufw.close();
}
}
catch (IOException e) {
e.printStackTrace();
}
}
}
2. 整行錄入
1.從鍵盤錄入資料,並儲存到檔案中。
2. 我們在鍵盤錄入的是時候,read()方法是一個一個錄入的,能不能整行的錄入呢?這時候我們想到了BufferedReader中ReadLine()方法。
3. 轉換流
為了讓位元組流可以使用字元流中的方法,我們需要轉換流。
1. InputStreamReader:位元組流轉向字元流;
a、獲取鍵盤錄入物件。InputStream in=System.in;
b、將位元組流物件轉成字元流物件,使用轉換流。
InputStreamReaderisr=new InputStreamReader(in);
c、為了提高效率,將字串進行緩衝區技術高效操作。使用BufferedReader
BufferedReaderbr=new BufferedReader(isr);
//鍵盤錄入最常見寫法
BufferedReaderin=new BufferedReader(new InputStreamReader(System.in));
2.OutputStreamWriter:字元流通向位元組流
示例:
/*================把鍵盤錄入的資料存到一個檔案中==============*/
public static void inToFile() {
//鍵盤的最常見的寫法
BufferedReader bufr = null;
BufferedWriter bufw = null;
try {
/*InputStream ips = System.in; //從鍵盤讀入輸入位元組流
InputStreamReader fr = new InputStreamReader(ips); //將位元組流轉成字元流
bufr = new BufferedReader(fr); */ //將字元流加強,提升效率
bufr = new BufferedReader(new InputStreamReader(System.in)); //匿名類。InputSteamReader:讀取位元組並將其解碼為字元
bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("out.txt"))); //OutputStreamWriter:要寫入流中的字元編碼成位元組
String line = null;
while((line = bufr.readLine())!=null){
if("over".equals(line)) break;
bufw.write(line.toUpperCase()); //列印
bufw.newLine(); //為了相容,使用newLine()寫入換行符
bufw.flush(); //必須要重新整理。不然不會顯示
}
if(bufw!=null) {
bufr.close();
bufw.close();
}
}
catch (IOException e) {
e.printStackTrace();
}
}
4. 流操作基本規律
為了控制格式我將其寫入了java程式碼段中,如下:
示例1:文字 ~ 文字
/*
流操作的基本規律。
一、兩個明確:(明確體系)
1. 明確源和目的
源:輸入流 InputStream Reader
目的:輸出流 OutputStream Writer
2. 操作的資料是否是純文字
是: 字元流
否: 位元組流
二、明確體系後要明確具體使用的物件
通過裝置區分:記憶體,硬碟,鍵盤
目的裝置:記憶體,硬碟,控制檯
示例1:將一個文字檔案中的資料儲存到另一個檔案中: 複製檔案
一、明確體系
源:檔案-->讀取流-->(InputStream和Reader)
是否是文字:是-->Reader
目的:檔案-->寫入流-->(OutputStream Writer)
是否純文字:是-->Writer
二、 明確裝置
源:Reader
裝置:硬碟上一個文字檔案 --> 子類物件為:FileReader
FileReader fr = new FileReader("Goods.txt");
是否提高效率:是-->加入Reader中的緩衝區:BufferedReader
BufferedReader bufr = new BufferedReader(fr);
目的:Writer
裝置:鍵盤上一個文字檔案 --> 子類物件:FileWriter
FileWriter fw = new FileWriter("goods1.txt");
是否提高效率:是-->加入Writer的緩衝區:BufferedWriter
BufferedWriter bufw = new BufferedWriter(fw);
示例2:將一個圖片檔案資料複製到另一個檔案中:複製檔案
一、明確體系
源:檔案-->讀取流-->(InputStream和Reader)
是否是文字:否-->InputStream
目的:檔案-->寫入流-->(OutputStream Writer)
是否純文字:否-->OutputStream
二、 明確裝置
源:InputStream
裝置:硬碟上一個媒體檔案 --> 子類物件為:FileInputStream
FileInputStream fis = new FileInputStream("Goods.txt");
是否提高效率:是-->加入InputStream中的緩衝區:BufferedInputStream
BufferedInputStream bufi = new BufferedInputStream(fis);
目的:OutputStream
裝置:鍵盤上一個媒體檔案 --> 子類物件:FileOutputStream
FileOutputStream fos = new FileOutputStream("goods1.txt");
是否提高效率:是-->加入OutputStream的緩衝區:BufferedOutputStream
BufferedOutputStream bufo = new BufferedOutputStream(fw);
示例3:將鍵盤錄入的資料儲存到一個文字檔案中
一、明確體系
源:鍵盤-->讀取流-->(InputStream和Reader)
是否是文字:是-->Reader
目的:檔案-->寫入流-->(OutputStream Writer)
是否純文字:是-->Writer
二、 明確裝置
源:InputStream
裝置:鍵盤 --> 對用物件為:System.in --> InputStream
為了操作方便,轉成字元流Reader --> 使用Reader中的轉換流:InputStreamReader
InputStreamReader isr = new InputStreamReader(System.in);
是否提高效率:是-->加入Reader中的緩衝區:BufferedReader
BufferedReader bufr = new BufferedReader(isr);
目的:Writer
裝置:鍵盤上一個文字檔案 --> 子類物件:FileWriter
FileWriter fw = new FileWriter("goods1.txt");
是否提高效率:是-->加入Writer的緩衝區:BufferedWriter
BufferedWriter bufw = new BufferedWriter(fw);
5.指定編碼表(轉換流可以指定編碼表)
要求:用UTF-8編碼儲存一個文字檔案
import java.io.*;
public class IOStreamLaw {
/**
* @param args
*/
public static void main(String[] args) throws IOException {
//鍵盤的最常見寫法
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("goods1.txt"),"UTF-8"));
String line = null;
while((line=bufr.readLine())!=null){
if("over".equals(line)) break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
bufr.close();
}
}
相關文章
- Java基礎(八)——IO流1_位元組流、字元流Java字元
- Java提高篇(二):IO位元組流、字元流和處理流Java字元
- Java零基礎學java之IO流--05InputStream位元組輸入流Java
- JAVA_基礎IO流物件流(三)Java物件
- Java基礎(八)——IO流2_緩衝流、轉換流Java
- java入門(字元流、位元組流)Java字元
- 傳智黑馬java基礎學習——day23(位元組流、字元流)Java字元
- IO流的位元組輸入輸出流(InputStream,OutputStream)
- Java基礎 Java-IO流 深入淺出Java
- java基礎學習_io流之FileInputStreamJava
- Java位元組流和字元流,是時候總結一下IO流了Java字元
- java基礎(四):談談java中的IO流Java
- Java基礎14-java進階(5)【IO流】Java
- Java基礎之IO轉換流學習Java
- 位元組流
- 阿里Java學習路線:階段 1:Java語言基礎-Java語言高階特性:第16章:位元組流與字元流:課時77:位元組流與字元流的區別阿里Java字元
- Java的位元組流,字元流和緩衝流對比探究Java字元
- Java基礎知識回顧之六 —– IO流Java
- Java程式設計基礎23——IO(其他流)&PropertiesJava程式設計
- Java基礎知識回顧之六 ----- IO流Java
- IO流上:概述、字元流、緩衝區(java基礎)字元Java
- java -IO流Java
- Java IO流Java
- Java IO: 流Java
- Java IO流Java
- java - IO流Java
- [java]利用IO流中的位元組流和緩衝流寫一個複製資料夾的小程式Java
- 面試必問的 Java 位元組流與字元流面試Java字元
- IO流之 檔案操作字元流字元
- [Java基礎]Stream流Java
- Java的IO流Java
- [java IO流]之 IO概述Java
- Java緩衝輸出位元組流BufferedOutputStreamJava
- 緩衝位元組流#
- 位元組陣列流陣列
- JS 位元組流 解析JS
- android IO流操作總結Android
- java處理流 和節點流(在位元組流和字元流中,又分為處理流和節點流)Java字元
- File類的特點?如何建立File類物件?Java中如何操作檔案內容,什麼是Io流Io流如何讀取和寫入檔案?位元組緩衝流使用原則?物件Java