一、前言
一直以來流都是困擾新手和才工作者的東東,這裏也算給新來者一些簡介。用最簡單的語言,說明罪簡單的道理。希望如此
二、流的簡單
2.1 基礎流輸入流inputStream
package stream;
import java.io.IOException;
import java.io.InputStream;
/**
* Created by ycy on 16/3/5.
* inputStream 輸入流主要方法
* read
* skip(網絡中一般很少用)
* available
* close
*/
public class InputStream_test {
public static void main(String[] args) throws IOException {
InputStream in=null;//沒有實現
/*單字節讀取*/
byte[] input=new byte[10];
for (int i = 0; i <input.length ; i++) {
int b=in.read();
if (b==-1)break;
input[i]=(byte) b;
}
/*讀取真正字節數量*/
int bytesRead=0;
int byteToRead=1024;
byte[] input2=new byte[byteToRead];
while (bytesRead<byteToRead){
int result=in.read(input2,bytesRead,byteToRead-bytesRead);
if (result==-1)break;//流結束
bytesRead+=result;
}
/*available建議字節*/
int byteAvailable=in.available();
byte[] input3=new byte[byteAvailable];
int bytestRead3=in.read(input,0,byteAvailable);
//立即執行其他程序部門
}
}
2.2基礎流輸出流outputStram
/**
* 單字節輸入
*
* @param out
* @throws IOException
*/
public static void generateCharacters(OutputStream out) throws IOException {
int fistPrintableCharacter = 33;
int numberOfPrintableCharacters = 94;
int numberOfCharactersPerLine = 72;
int start = fistPrintableCharacter;
while (true) {
/*無限循環*/
for (int i = start; i < start + numberOfCharactersPerLine; i++) {
out.write((
(i - fistPrintableCharacter) % numberOfCharactersPerLine) + fistPrintableCharacter);
}
out.write('\r');//回車
out.write('\n');//換行
start = ((start + 1) - fistPrintableCharacter) % numberOfCharactersPerLine + fistPrintableCharacter;
}
}
/**
* 有數組緩存測輸入流
*
* @param out
* @throws IOException
*/
public static void getnerateCharacters(OutputStream out) throws IOException {
int fistPrintableCharacter = 33;
int numberOfPrintableCharacters = 94;
int numberOfCharactersPerLine = 72;
int start = fistPrintableCharacter;
byte[] line = new byte[numberOfCharactersPerLine + 2];
//+2 對應回車和換行
while (true) {
for (int i = start; i < start + numberOfCharactersPerLine; i++) {
line[i - start] = (byte) ((i - fistPrintableCharacter) % numberOfPrintableCharacters + fistPrintableCharacter);
}
line[72] = (byte) '\r';
line[72] = (byte) '\n';
try {
out.write(line);
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
out.write(line);
start = ((start + 1) - fistPrintableCharacter) % numberOfPrintableCharacters + fistPrintableCharacter;
}
}
2.3 基礎流總結
2.4 過濾流
DataOutputStream dataout = new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream("data.txt")));
2.4.1 緩衝流
在使用的時候我們基本都用緩充流,什麼叫緩衝就是你直接喝水與與杯子喝水的區別。用杯子要快一些吧!- bufferinputStream:多字節讀取多次從底層輸入流中讀取數據,加入數組。
- BuffredOutputStream:每次寫入緩衝區,而不是寫入底層輸出流,因此必應要flush方法。
- printStream:不要用,因爲他沒有編碼,使用的是平臺默認編碼,跨平臺怎麼辦。 包括以後的prinWriter(已經接近編碼問題)也不要用,java大神說的照做就ok。
2.4.2 數據流
2.4.3 閱讀器與書寫器
- writer書寫器:Writer 與outputStream的子類。outputStreamWriter是Writer的子類,注意指定編碼方式
- Reader閱讀器:他也有一個方法available不是返回字節數,而是返回boolean
- 總結:把面向字節變換爲面向字符的接口InputStreamReader 與OutputStramWirter都是過濾器;默認使用緩存區8192字符
//讀取input流的閱讀器
/**
* 使用reader 字節變爲字符
* 使用bufferreader 使用緩存加快了速度
* @param in
* @return
* @throws IOException
*/
public static String getMaccyrillicString(InputStream in) throws IOException{
Reader re=new InputStreamReader(in,"macCyrillic");
re=new BufferedReader(re,1024);
StringBuilder sb=new StringBuilder();
int c;
while ((c= re.read())!=-1){
sb.append((char)c);
}
return sb.toString();
}
public static void main(String[] args) {
}