流的操作規律
之是以要弄清楚這個規律,是因為流對象太多,開發時不知道用哪個對象合适.
想知道開發時用到哪些對象,隻要通過四個明确即可
1.明确源和目的
源:inputstream reader
目的:outputstream writer
2.明确資料是否是純文字資料.
源: 是純文字 reader
否 inputstream
目的: 是純文字 writer
否 outputstream
到這裡,就可以明确需求中具體要使用哪個 體系了
3.明确具體的裝置
源裝置:
硬碟: file
鍵盤: system.in
記憶體:數組
網絡:socket流
目的裝置:
控制台: system.out
4.是否需要其他額外功能
a.是否需要高效(緩沖區)
是,就加上buffer
b.轉換流 inputstreamreader outputstreamwriter
需求1:複制一個文本檔案
a.明确源和目的
源:inputstream reader
目的: outputstream writer
b.是否是純文字
是,源:reader
目的:writer
c.明确具體裝置
源:硬碟 file
目的:硬碟 file
filereader fr = new filereader("a.txt");
filewriter fw = new filewriter("b.txt");
d.需要額外功能
需要,高效,
bufferedreader buff =
new bufferedreader(fr);
bufferedwriter bufw = new bufferedwriter(fw);
import java.io.bufferedreader;
import java.io.bufferedwriter;
import java.io.filereader;
import java.io.filewriter;
import java.io.ioexception;
public class bufferedcopy {
public static void main(string[] args)throws ioexception {
//建立bufferedreader一樣,必須先有流。
filereader fr = new filereader("tempfile\\buf.txt");
bufferedreader bufr = new bufferedreader(fr);
//建立一個字元寫入流的緩沖區。應該先建立流。
filewriter fw = new filewriter("tempfile\\buf2.txt");
bufferedwriter bufw = new bufferedwriter(fw);
string line = null;
while((line=bufr.readline())!=null){
bufw.write(line);
// 換行
bufw.newline();
bufw.flush();
}
bufr.close();
bufw.close();
}
}
需求2:讀取鍵盤錄入資訊,并寫入到文本檔案中
源:鍵盤 system.in
inputstream in = system.in;//位元組流,使用inputstreamreader
這樣做可以完成,但是麻煩,将讀取的位元組資料轉成字元串,再由字元流操作
轉換.将位元組流圍成字元流,因為明确的源是reader,這樣操作友善資料時,便捷.是以要将已有的位元組流轉成字元流.使用位元組-->字元 使用inputstreamreader
inputstreamreader isr =
new inputstreamreader(system.in);
new bufferedreader(isr);
import java.io.inputstreamreader;
public class readkeydemo {
public static void main(string[] args) throws ioexception {
bufferedreader bufr = new bufferedreader(new inputstreamreader(system.in));//記住:以後讀取鍵盤都用這句,可以背下來。
bufferedwriter bufw = new bufferedwriter(new filewriter("d:/a.txt"));
string line = null;
while((line=bufr.readline())!=null){
//如果輸入over,程式結束
if("over".equals(line))
{
break;
}
bufw.write(line);
// 換行
bufw.newline();
bufw.flush();
}
bufr.close();
bufw.close();
}
需求3:将一個檔案檔案内容顯示在控制台上
是,
源:reader
目的:writer
c.明确具體裝置
源:硬碟:file
目的:控制台:system.out
filereader fr = new filereader("a.txt");
outputstream out = system.out;//這樣輸出内容很麻煩,使用轉換流
d.需要額外功能嗎?
需要:
轉換流
filereader fr = new new filereader("a.txt");
outputstreamwriter osw = new outputstreamwriter(system.out);
高效,buffer
bufferedreader bufr = new bufferedreader(new filereader("a.txt"));
bufferedwriter bufw = new bufferedwriter(new outputstreamwriter(system.out));
import java.io.outputstreamwriter;
bufferedreader bufr = new bufferedreader(new filereader("d:/a.txt"));
bufferedwriter bufw = new bufferedwriter(new outputstreamwriter(system.out));
需求4:讀取鍵盤錄入資料,顯示在控制台上
源:鍵盤:system.in
inputstream in = system.in;
outputstream out = system.out;
d.明确額外功能?
需要轉換,因為都是位元組流,但是操作的卻是文本資料
是以使用字元流操作起來更為便捷
inputstreamreader isr =
new inputstreamreader(system.in);
outputstreamwriter osw =
new outputstreamwriter(system.out);
為了将其高效
bufferedreader bufr = new bufferedreader(isr);
bufferedwriter bufw = new bufferedwriter(osw);
/**
錄入鍵盤輸入字母并将小寫變為大寫
*/
import java.io.*;
class readin
{
public static void main(string[] args)throws ioexception
{
inputstream in = system.in;//引入輸入流
inputstreamreader isr = new inputstreamreader(in);
stringbuilder sb = new stringbuilder();//建立一個緩沖區
while(true)
{
int ch = in.read();//讀入鍵盤輸入
if(ch=='\r')
continue;
if(ch=='\n')
string s = sb.tostring();//講讀入輸入轉換為字元型
if("over".equals(s))//判斷s是否為over
break;
else
system.out.println(s.touppercase());//列印出字母大寫
sb.delete(0,sb.length());
else
sb.append((char)ch);
}
}
什麼時候使用轉換流呢?
1.源或者目的對應的裝置是位元組流,但是操作的卻是文本資料,可以使用轉換作為橋梁,提高對文本操作的便捷.
2.一旦操作文本涉及到具體的指定編碼表時,必須使用轉換流
轉載:http://blog.csdn.net/chaoyu168/article/details/49663881