1. 程式人生 > >java流:列印流,序列流,資料流,記憶體流

java流:列印流,序列流,資料流,記憶體流

列印流:位元組列印流PrintStream

package com.qianfeng.test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;

/*
 * 列印流:除了擁有輸出流的特點之外,還有列印的功能,比如println,print等方法。
 * 分成兩種:
 * 位元組列印流:PrintStream
 * 字元列印流:PrintWriter
 * 
 * 位元組列印流:
 * 可以直接關聯的裝置(傳入的引數)
 * 1.File型別的檔案
 * 2.字串型別的檔案
 * 3.位元組輸出流
 * 
 */
public class Demo5 {

	public static void main(String[] args) throws IOException {
		
//		 * 1.File型別的檔案
		//PrintStream printStream = new PrintStream(new File("D:\\workspace\\32\\BigData1715N21\\src\\com\\qianfeng\\test\\Demo1.java"));
		
//		 * 2.字串型別的檔案
		//PrintStream printStream = new PrintStream("temp3.txt");//對於當前的檔案,如果不存在,會自動建立。
		
//		 * 3.位元組輸出流
		PrintStream printStream = new PrintStream(new FileOutputStream("temp3.txt"));
		
		//講解print()方法的原理
		printStream.write(97);//00000000 00000000 00000000 01100001 在列印的時候將前面三個位元組砍掉了,得到a
		printStream.write(353);//00000000 00000000 00000001 01100001 在列印的時候將前面三個位元組砍掉了,得到a
		
		printStream.print(353);
		//先將353轉成字串再轉成位元組陣列
		printStream.write(String.valueOf(353).getBytes());
		
		printStream.close();
		
	}
}

列印流:字元列印流PrintWriter

package com.qianfeng.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;

/*
 * 字元列印流:
 * 可以直接關聯的裝置(傳入的引數)
 * 1.File型別的檔案
 * 2.字串型別的檔案
 * 3.位元組輸出流
 * 4.字元寫出流
 */
public class Demo6 {

	public static void main(String[] args) throws IOException {
		
		//例項:將資料從鍵盤接收到控制檯
		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
		
		//建立字元列印流
		PrintWriter printWriter = new PrintWriter(System.out);
		
		String data = null;
		while((data=bufferedReader.readLine())!=null){
			printWriter.println(data);
			printWriter.flush();
		}
		
		bufferedReader.close();
		printWriter.close();
		
		
	}
}

序列流

package com.qianfeng.test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Vector;

public class Demo7{
	/*
	 * 序列流:把多個輸入流的內容一次性的列印(操作)---位元組流
	 */
	public static void main(String[] args) throws IOException {
		//建立三個輸入流
		FileInputStream fileInputStream1 = new FileInputStream("src\\com\\qianfeng\\test\\Demo2.java");
		FileInputStream fileInputStream2 = new FileInputStream("src\\com\\qianfeng\\test\\Demo2.java");
		FileInputStream fileInputStream3 = new FileInputStream("src\\com\\qianfeng\\test\\Demo1.java");
		
		//將三個輸入流放入序列流
		//方式一:先放入一個Vector
//		Vector<FileInputStream> vector = new Vector<>();
//		vector.add(fileInputStream1);
//		vector.add(fileInputStream2);
//		vector.add(fileInputStream3);
//		
//		//得到列舉器
//		Enumeration<FileInputStream> e1 = vector.elements();
		
		//方式二:先放入一個list
		ArrayList<FileInputStream> list = new ArrayList<>();
		list.add(fileInputStream1);
		list.add(fileInputStream2);
		list.add(fileInputStream3);
		
		//將集合轉換成列舉
		Enumeration<FileInputStream> e2 = Collections.enumeration(list);
		
		//建立序列流物件並關聯相關的檔案--引數是一個列舉器
		//SequenceInputStream sequenceInputStream = new SequenceInputStream(e1);
		SequenceInputStream sequenceInputStream = new SequenceInputStream(e2);
		
		//建立輸出流
		FileOutputStream fileOutputStream = new FileOutputStream("temp2.txt");
		
		//讀寫
		byte[] arr = new byte[1024];
		int num;
		while ((num = sequenceInputStream.read(arr)) != -1) {
			fileOutputStream.write(arr, 0, num);
			
			fileOutputStream.flush();
		}
		
		sequenceInputStream.close();
		fileOutputStream.close();
		
		
	}
}

資料流

package com.qianfeng.test;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo8 {
	/*
	 * 資料流:位元組流
	 * DataInputStream:  資料輸入流
	 * DataOutputStream:  資料輸出流
	 * 
	 * 注意:資料流要與位元組輸入流,輸出流配合使用
	 */
	public static void main(String[] args) throws IOException {
		
		//寫
		writeData();
		
		//讀
		readData();
	}
	
	public static void writeData() throws IOException {
		DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("temp3.txt"));
		
		//寫
		dataOutputStream.writeInt(97);//4個位元組      00000000 00000000 000000000 011000001  00000001
		dataOutputStream.writeBoolean(true);//1個   
		dataOutputStream.write(33);//1個
		dataOutputStream.writeDouble(34.56);//8個
		
		//關閉流
		dataOutputStream.close();
	}
	
	public static void readData() throws IOException {
		DataInputStream dataInputStream = new DataInputStream(new FileInputStream("temp3.txt"));
		
		//這裡的boolean型和int型的資料,在讀的時候由於與之前寫的順序相反了,所以讀取的資料錯誤
		/*
		 * 注意點:1.讀的順序要與寫的順序一致   2.型別保持一致
		 */
		System.out.println(dataInputStream.readBoolean());// 00000000
		System.out.println(dataInputStream.readInt());//00000000 000000000 011000001  00000001
		
		System.out.println(dataInputStream.readByte());
		System.out.println(dataInputStream.readDouble());
		
		dataInputStream.close();
	}
	
}

記憶體流

package com.qianfeng.test;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

public class Demo9 {
	public static void main(String[] args) throws IOException {
		/*
		 * 記憶體流(byte陣列流):
		 * ByteArrayInputStream:寫入記憶體,在內部有一個數組,資料被放在這裡面
		 * ByteArrayOutputStream:將資料取出,放在位元組數組裡面
		 */
		
		//建立輸入流,關聯一個byte型的陣列,作為緩衝區資料
		ByteArrayInputStream bais = new ByteArrayInputStream("hello world".getBytes());
		
		//建立輸出流-不需要指定引數
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		
		byte[] arr = new byte[1024];
		int num;
		while ((num = bais.read(arr)) != -1) {
			baos.write(arr, 0, num);
		}
		
		System.out.println(new String(arr));
		
		bais.close();
		baos.close();
		
		//注意:將流關閉了之後,還可以呼叫方法,不會報錯.
		baos.write(45);
	}
}