Java IO流——位元組流
阿新 • • 發佈:2019-01-01
1.InputStream、OutputStream
InputStream抽象了應用程式讀取資料的方式
OutputStream抽象了應用程式寫出資料的方式
2.EOF = End 讀到-1就讀到結尾
3.輸入流基本方法
int b = in.read(); //讀取一個位元組無符號填充到int低八位.-1是 EOF
in.read(byte[] buf)
in.read(byte[] buf,int start,int size)
4.輸出流基本方法
out.write(int b); //寫出一個byte到流,b的低8位 out.write(byte[] buf); //將buf位元組陣列都寫入到流 out.write(byte[] buf,int start,int size)
5.FileInputStream—>具體實現了在檔案上讀取資料
6.FileOutputStream 實現了向檔案中寫出byte資料的方法
7.DataOutputStream/DataInputStream
對"流"功能的擴充套件,可以更加方面的讀取int,long,字元等型別資料
DataOutputStream
writeInt()/writeDouble()/writeUTF()
8.BufferedInputStream&BufferedOutputStream
這兩個流類位IO提供了帶緩衝區的操作,一般開啟檔案進行寫入 或讀取操作時,都會加上緩衝,這種流模式提高了IO的效能 從應用程式中把輸入放入檔案,相當於將一缸水倒入到另一個缸中: FileOutputStream--->write()方法相當於一滴一滴地把水“轉移”過 DataOutputStream-->writeXxx()方法會方便一些,相當於一瓢一瓢把水“轉移”過去 BufferedOutputStream--->write方法更方便,相當於一瓢一瓢先放入桶中,再從桶中倒入到另一個缸中,效能提高了
package com.sample.io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class IOUtil {
/**
* 讀取指定檔案內容,按照16進位制輸出到控制檯
* 並且每輸出10個byte換行
* @param fileName
* 單位元組讀取不適合大檔案,大檔案效率很低
*/
public static void printHex(String fileName)throws IOException{
//把檔案作為位元組流進行讀操作
FileInputStream in = new FileInputStream(fileName);
int b ;
int i = 1;
while((b = in.read())!=-1){
if(b <= 0xf){
//單位數前面補0
System.out.print("0");
}
System.out.print(Integer.toHexString(b)+" ");
//每10個換行
if(i++%10==0){
System.out.println();
}
}
in.close();
}
/**
* 批量讀取,對大檔案而言效率高,也是我們最常用的讀檔案的方式
* @param fileName
* @throws IOException
*/
public static void printHexByByteArray(String fileName)throws IOException{
FileInputStream in = new FileInputStream(fileName);
byte[] buf = new byte[8 * 1024];
/*從in中批量讀取位元組,放入到buf這個位元組陣列中,
* 從第0個位置開始放,最多放buf.length個
* 返回的是讀到的位元組的個數
*/
/*
int bytes = in.read(buf,0,buf.length);//一次性讀完,說明位元組陣列足夠大
int j = 1;
for(int i = 0; i < bytes;i++){
//通過&0xff 將高24位清零
System.out.print(Integer.toHexString(buf[i] & 0xff)+" ");
//每10個換行
if(j++%10==0){
System.out.println();
}
}*/
int bytes = 0;
int j = 1;
while((bytes = in.read(buf,0,buf.length))!=-1){
for(int i = 0 ; i < bytes;i++){
System.out.print(Integer.toHexString(buf[i] & 0xff)+" ");
if(j++%10==0){
System.out.println();
}
}
}
in.close();
}
/**
* 檔案拷貝,位元組批量讀取
* @param srcFile
* @param destFile
* @throws IOException
*/
public static void copyFile(File srcFile,File destFile)throws IOException{
if(!srcFile.exists()){
throw new IllegalArgumentException("檔案:"+srcFile+"不存在");
}
if(!srcFile.isFile()){
throw new IllegalArgumentException(srcFile+"不是檔案");
}
FileInputStream in = new FileInputStream(srcFile);
FileOutputStream out = new FileOutputStream(destFile);
byte[] buf = new byte[8*1024];
int b ;
while((b = in.read(buf,0,buf.length))!=-1){
out.write(buf,0,b);
out.flush();//最好加上
}
in.close();
out.close();
}
/**
* 進行檔案的拷貝,利用帶緩衝的位元組流
* @param srcFile
* @param destFile
* @throws IOException
*/
public static void copyFileByBuffer(File srcFile,File destFile)throws IOException{
if(!srcFile.exists()){
throw new IllegalArgumentException("檔案:"+srcFile+"不存在");
}
if(!srcFile.isFile()){
throw new IllegalArgumentException(srcFile+"不是檔案");
}
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(srcFile));
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(destFile));
int c ;
while((c = bis.read())!=-1){
bos.write(c);
bos.flush();//重新整理緩衝區
}
bis.close();
bos.close();
}
/**
* 單位元組,不帶緩衝進行檔案拷貝
* @param srcFile
* @param destFile
* @throws IOException
*/
public static void copyFileByByte(File srcFile,File destFile)throws IOException{
if(!srcFile.exists()){
throw new IllegalArgumentException("檔案:"+srcFile+"不存在");
}
if(!srcFile.isFile()){
throw new IllegalArgumentException(srcFile+"不是檔案");
}
FileInputStream in = new FileInputStream(srcFile);
FileOutputStream out = new FileOutputStream(destFile);
int c ;
while((c = in.read())!=-1){
out.write(c);
out.flush();
}
in.close();
out.close();
}
}
DataOutputStream/DataInputStream的使用
package com.sample.io;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class DosDemo {
public static void main(String[] args) throws IOException {
String file = "demo/dos.dat";
DataOutputStream dos = new DataOutputStream(
new FileOutputStream(file));
dos.writeInt(10);
dos.writeInt(-10);
dos.writeLong(10l);
dos.writeDouble(10.5);
//採用utf-8編碼寫出
dos.writeUTF("中國");
//採用utf-16be編碼寫出
dos.writeChars("中國");
dos.close();
IOUtil.printHex(file);
}
}
package com.sample.io;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class DisDemo {
/**
* 把上面寫的內容讀出來
*/
public static void main(String[] args) throws IOException{
String file = "demo/dos.dat";
IOUtil.printHex(file);
DataInputStream dis = new DataInputStream(
new FileInputStream(file));
int i = dis.readInt();
System.out.println(i);
i = dis.readInt();
System.out.println(i);
long l = dis.readLong();
System.out.println(l);
double d = dis.readDouble();
System.out.println(d);
String s = dis.readUTF();
System.out.println(s);
dis.close();
}
}