IO流,也就是輸入和輸出流,可分爲字節流和字符流。
1. 字節流
(1). InputStream 輸入流,用於讀取文件
輸入流常用API:
inputStream.read() 讀取一個字節
inputStream.read(byte[] buffer) 讀取數據填充字節數組
inputStream.read(byte[] buffer, int start, int size) 讀取數據到字節數組buffer中,從buffer的start位置開始,到size長度的數據
(2). OutputStream 輸出流, 用於寫入文件
輸出流常用API:
outputStream.write(int b) 寫一個字節到流中
outputStream.write(byte[] buffer) 寫一個字節的數據到流中
outputStream.write(byte[] buffer, int start, int size) 寫字節數據buffer從start位置開始到size長度的字節到流中
(3). 常用實現類
<1>. FileInputStream 文件輸入流,封裝了從磁盤讀取文件到流中的操作,事例代碼如下:
package com.dcz.io;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class IOUtil {
/**
* 文件輸入流的DEMO-1
* 讀取指定文件內容,按照16進制輸出到控制檯
* 輸出10個byte換行
* @param fileName
* @throws IOException
*/
public static void printHex(String fileName) throws IOException{
InputStream ins = new FileInputStream(fileName);
int b;
int i = 1;
// 讀取到-1說明讀取結束
while((b = ins.read()) != -1){
// 讀取每一個字節轉換成16進制顯示
System.out.print(Integer.toHexString(b) + " ");
if(i++ % 10 == 0){
System.out.println();
}
}
ins.close();
}
/**
* 文件輸入流的DEMO-2
* 讀取指定文件內容,按照16進制輸出到控制檯
* 輸出10個byte換行
* @param fileName
* @throws IOException
*/
public static void printHexByByteArray(String fileName) throws IOException{
InputStream ins = new FileInputStream(fileName);
// 第一種寫法,因爲有可能這個字節數組放不下。 一次性讀取
/* byte[] buffer = new byte[20 * 1024];
int byteSize = ins.read(buffer, 0, buffer.length);
int j=1;
for(int i=0; i<byteSize; i++){
System.out.print(Integer.toHexString(buffer[i]) + " ");
if(j++ % 10 == 0){
System.out.println();
}
}*/
// 第二種寫法,循環讀取
int j = 1;
int b;
byte[] buffer = new byte[10];
while((b = ins.read(buffer, 0, buffer.length)) != -1){
for(int i=0; i<b; i++){
System.out.print(Integer.toHexString(buffer[i]) + " ");
if(j++ % 10 == 0){
System.out.println();
}
}
}
ins.close();
}
public static void main(String[] args) {
try {
IOUtil.printHexByByteArray("E:\\demo.txt");
} catch (IOException e) {
e.printStackTrace();
}
}
}
<2>. FillOutputStream 文件輸出流。封裝了從輸入流中寫入文件到磁盤操作。事例代碼如下:
package com.dcz.io;
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 IOUtil {
/**
* 將內容寫到指定文件中
* @param fileName
* @throws IOException
*/
public static void writeToFile(String fileName) throws IOException{
OutputStream os = new FileOutputStream(fileName);
os.write('a');
os.write('b');
int i = 10;
os.write(i >>> 24);
os.write(i >>> 16);
os.write(i >>> 8);
os.write(i);
String str = "中國人";
byte[] b = str.getBytes("gbk");
os.write(b);
os.close();
}
/**
* 簡單的文件拷貝操作
* @param src
* @param desc
* @throws Exception
*/
public static void copyFile(File src, File dest) throws Exception{
if(!src.exists()){
throw new IllegalAccessException("文件不存在!");
}
// 創建文件輸入流對象
InputStream inputstream = new FileInputStream(src);
// 創建文件輸出流對象
OutputStream outputStream = new FileOutputStream(dest);
int b;
byte[] buffer = new byte[2048];
// 循環讀取文件內容到字節序列中,直到讀取結束
while((b = inputstream.read(buffer, 0, buffer.length)) != -1){
// 寫入一個緩衝字節序列到磁盤中
outputStream.write(buffer);
outputStream.flush();
}
outputStream.close();
inputstream.close();
}
public static void main(String[] args) {
File scrFile = new File("D:\\cglib-3.1.jar");
File destFile = new File("E:\\abc.jar");
try {
//IOUtil.writeToFile(fileName);
//IOUtil.printHex(fileName);
IOUtil.copyFile(scrFile, destFile);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}