Java學習--InputStream和OutputStream
一個流可以理解為一個數據的序列,輸入了表示從一個源讀取資料,輸出流表示向一個目標寫資料。
Java.io 包幾乎包含了所有操作輸入、輸出需要的類。所有這些流類代表了輸入源和輸出目標。
(轉自:http://blog.csdn.net/wangbaochu/article/details/53484042)
位元組流
1. InputStream和 OutputStream
InputStream 和 OutputStream為各種輸入輸出位元組流的基類,所有位元組流都繼承這兩個基類。
關於InputStream和OutputStream的輸入輸出方向的理解
(轉自:http://blog.csdn.net/guizaijianchic/article/details/71348482)
InputStream輸入類,首先需要讀取的內容轉化成輸入流,再從它那裡進行讀取,先關聯源;之後過程中關聯目的,這樣形成了流;
把要讀取的內容輸入到輸入流,再從輸入流進行讀取,所以是read()
OutputStream輸出類,首先需要與寫入的目的地相關聯,然後通過它進行寫入,首先關聯的是流的目的;之後的過程中再關聯源,這樣形成了流
把要輸出的東西通過輸出流輸出到目的地,所以是write()
下面的例子就是將f中的內容讀至byte陣列中,在例項化的時候,先關聯的是f,也就是讀取的源,然後input.read(b),關聯了目的,也就是陣列b
File f = new File("d:"+File.separator+"test.txt");
InputStream input = new FileInputStream(f);
byte b[] = new byte[1024];
//讀入陣列b中
int len = input.read(b);
input.close();
System.out.println(new String(b,0,len));
先關聯的是目的,檔案f,然後out.write(b),指明瞭源
File f = new File("d:"+File.separator+"test.txt" );
OutputStream out = new FileOutputStream(f);
String str = "hello,world";
byte b[] = str.getBytes();
out.write(b);
out.close();
2. FileInputStream 和 FileOutputStream
是對檔案的位元組流操作,是最常見的IO操作流
[java] view plain copy- /*
- * 以位元組為單位讀取檔案,常用於讀二進位制檔案,如圖片、聲音、影像等檔案。
- */
- public static void readFileByBytes(String inFile, String outFile) {
- File file = new File(fileName);
- InputStream in = null;
- OutputStream out = null;
- try {
- byte[] tempbytes = new byte[100];
- int byteread = 0;
- in = new FileInputStream(inFile);
- out = new FileOutputStream(outFile);
- while ((byteread = in.read(tempbytes)) != -1) {
- out.write(tempbytes, 0, byteread);
- }
- } catch (Exception e1) {
- e1.printStackTrace();
- } finally {
- if (in != null) {
- try {
- in.close();
- } catch (IOException e1) {
- }
- try {
- out.close();
- } catch (IOException e1) {
- }
- }
- }
- }
3.DataInputStream和DataOutputStream
DataInputStream 是資料輸入流,它繼承於FilterInputStream。
DataOutputStream 是資料輸出流,它繼承於FilterOutputStream。
二者配合使用,“允許應用程式以與機器無關方式從底層輸入流中讀寫基本 Java 資料型別”。
[java] view plain copy view plain view plain copy copy- /**
- * DataOutputStream的API測試函式
- */
- private static void testDataOutputStream() {
- DataOutputStream out = null;
- try {
- File file = new File("file.txt");
- out = new DataOutputStream(new FileOutputStream(file));
- out.writeBoolean(true);
- out.writeByte((byte)0x41);
- out.writeChar((char)0x4243);
- out.writeShort((short)0x4445);
- out.writeInt(0x12345678);
- out.writeLong(0x0FEDCBA987654321L);
- out.writeUTF("abcdefg");
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (SecurityException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- out.close();
- } catch(IOException e) {
- }
- }
- }
- /**
- * DataInputStream的API測試函式
- */
- private static void testDataInputStream() {
- DataInputStream in = null;
- try {
- File file = new File("file.txt");
- in = new DataInputStream(new FileInputStream(file));
- System.out.printf("byteToHexString(0x8F):0x%s\n", byteToHexString((byte)0x8F));
- System.out.printf("charToHexString(0x8FCF):0x%s\n", charToHexString((char)0x8FCF));
- System.out.printf("readBoolean():%s\n", in.readBoolean());
- System.out.printf("readByte():0x%s\n", byteToHexString(in.readByte()));
- System.out.printf("readChar():0x%s\n", charToHexString(in.readChar()));
- System.out.printf("readShort():0x%s\n", shortToHexString(in.readShort()));
- System.out.printf("readInt():0x%s\n", Integer.toHexString(in.readInt()));
- System.out.printf("readLong():0x%s\n", Long.toHexString(in.readLong()));
- System.out.printf("readUTF():%s\n", in.readUTF());
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (SecurityException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- in.close();
- } catch(IOException e) {
- }
- }
- }
4.BufferedInputStream 和 BufferedOutputStream
BufferedInputStream是帶緩衝區的輸入流,它繼承於FilterInputStream。預設緩衝區大小是8M,能夠減少訪問磁碟的次數,提高檔案讀取效能。
BufferedOutputStream是帶緩衝區的輸出流,它繼承於FilterOutputStream,能夠提高檔案的寫入效率。
它們提供的“緩衝功能”本質上是通過一個內部緩衝區陣列實現的。例如,在新建某輸入流對應的BufferedInputStream後,當我們通過read()讀取輸入流的資料時,BufferedInputStream會將該輸入流的資料分批的填入到緩衝區中。每當緩衝區中的資料被讀完之後,輸入流會再次填充資料緩衝區;如此反覆,直到我們讀完輸入流資料。
[java] view plain copy- public static void readAndWrite(String[] args) {
- try {
- BufferedInputStream bis = new BufferedInputStream(new FileInputStream("f:/a.mp3"));
- BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("f:/b.mp3"));
- byte[] b=new byte[1024];
- int len=0;
- while(-1!= (len = bis.read(b, 0, b.length))) {
- bos.write(b, 0, len);
- }