十、系统信息

王朝学院·作者佚名  2016-08-27  
宽屏版  字体: 小 | 中 | 大 | 超大  

一、缓冲流1.1、字符流的缓冲区

缓冲区的出现是为了提高IO的读写效率

对应类

BufferedReader

BufferedWriter

缓冲区要结合流才可以使用

在流的基础上对流的功能进行了增强

1.2、BufferedReader、BufferedWriter

public class BufferedWriterextends Writer

构造方法摘要BufferedWriter(Writer out)

创建一个使用默认大小输出缓冲区的缓冲字符输出流。

BufferedWriter(Writer out,

int sz)

创建一个使用给定大小输出缓冲区的新缓冲字符输出流。

将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。

该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性line.separator定义。并非所有平台都使用新行符 ('\n') 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。

通常 Writer 将其输出立即发送到底层字符或字节流。除非要求提示输出,否则建议用 BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer(如 FileWriters 和 OutputStreamWriters)。例如,

PRintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));

将缓冲 PrintWriter 对文件的输出。如果没有缓冲,则每次调用 print() 方法会导致将字符转换为字节,然后立即写入到文件,而这是极其低效的。

public class BufferedReaderextends Reader

构造方法摘要BufferedReader(Reader in)

创建一个使用默认大小输入缓冲区的缓冲字符输入流。

BufferedReader(Reader in,

int sz)

创建一个使用指定大小输入缓冲区的缓冲字符输入流。

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。

通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。例如,

BufferedReader in

= new BufferedReader(new FileReader("foo.in"));

将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。

通过用合适的 BufferedReader 替代每个 DataInputStream,可以对将 DataInputStream 用于文字输入的程序进行本地化

1.3、示例

在创建缓冲区之前,必须先有流对象

packagecom.pb.io.demo2;/**创建缓冲区之间必须,先创建流

使用缓冲区,要flush,刷新*//**创建缓冲区之间必须,先创建流

使用缓冲区,要flush,刷新*/importjava.io.*;classBufferedReaderAndWriterDemo1

{publicstaticvoidmain(String[] args)

{

File source=newFile("d:\\demo.txt");

File objFile=newFile("d:\\a.txt");

useBuffered(source,objFile);

}publicstaticvoiduseBuffered(File source,File objFile){

BufferedReader br=null;

BufferedWriter bw=null;try{//声明缓冲区对象,并将字符流做为参数传入

br=newBufferedReader(newFileReader(source));

bw=newBufferedWriter(newFileWriter(objFile));//接收读取的长度String line=null;//读取内容并放入buf中,判断是不是最后while((line=br.readLine())!=null){//写入,有多长写多长bw.write(line,0,line.length());

bw.newLine();

}

System.out.println("读写完成!");

}catch(IOException e){

System.out.println(e.toString());

}finally{try{if(bw!=null)

bw.flush();

bw.close();

}catch(IOException e){

System.out.println(e.toString());

}try{if(br!=null)

br.close();

}catch(IOException e){

System.out.println(e.toString());

}

}

}

}

二、MyBuffered2.1、示例

packagecom.pb.io.demo2;importjava.io.File;importjava.io.FileNotFoundException;importjava.io.FileReader;importjava.io.IOException;publicclassMyBuffered {privateFileReader fr;publicMyBuffered(FileReader fr) {this.fr =fr;

}/** 可以一次读一行的方法*/publicString myReadLine()throwsIOException {//定义一个临时 容器,原BufferedReader封装的是字符数组//为了方便,定义一个StringBuilderStringBuilder sb =newStringBuilder();intch = 0;while((ch = fr.read()) != -1) {if(ch == '\r') {continue;

}if(ch == '\n') {returnsb.toString();

}//读一个存一个sb.append((char)ch);

}if(sb.length()!=0){returnsb.toString();

}returnnull;

}publicvoidmyClose()throwsIOException{if(fr !=null)

fr.close();

}publicstaticvoidmain(String[] args)throwsIOException {

File file=newFile("d:\\demo.txt");

MyBuffered mb=newMyBuffered(newFileReader(file));

String line=null;while((line=mb.myReadLine())!=null){

System.out.println(line);

}

mb.myClose();

}

}

三、装饰设计模式3.1、装饰设计模式

装饰设计模式:

当想要对已经有的对象进行功能增强时,

可以定义类,将已经对象传入,基于已经有的功能,并提供加强功能。

那么自定义的该类就称为装饰类

packagecom.pb.io.demo3;classPerson{publicvoideat(){

System.out.println("吃饭");

}

}classSuperPerson{privatePerson p;publicSuperPerson(Person p) {super();this.p =p;

}publicvoidsuperEat(){

System.out.println("开胃酒");

p.eat();

System.out.println("甜点");

System.out.println("来一根");

}

}publicclassPersonTest {publicstaticvoidmain(String[] args) {

Person p=newPerson();

p.eat();

SuperPerson sp=newSuperPerson(p);

sp.superEat();

}

}

3.2、与继承之间的关系

装饰类通常会通过构造方法接收被被装饰的对象,并基于被装饰的对象的功能,提供更强的功能

装饰模式比继承灵活,避免了继承体系臃肿

而且降低了类于类之间的关系

装饰类因为增强已有对象,具备的功能和已经的是相同的,只不过提供了更强的功能。

所以装饰类和被装饰类通常是都属于一个体系中。

四、LineNumberReader4.1、

构造方法摘要LineNumberReader(Reader in)

使用默认输入缓冲区的大小创建新的行编号 reader。

LineNumberReader(Reader in,

int sz)

创建新的行编号

reader,将字符读入给定大小的缓冲区。

方法摘要int

getLineNumber()

获得当前行号。

void

mark(int readAheadLimit)

标记该流中的当前位置。

int

read()

读取单个字符。

int

read(char[] cbuf,

int off, int len)

将字符读入数组中的某一部分。

String

readLine()

读取文本行。

void

reset()

将该流重新设置为最新的标记。

void

setLineNumber(int lineNumber)

设置当前行号。

long

skip(long n)

跳过字符。

4.2、示例

packagecom.pb.io.demo4;importjava.io.FileNotFoundException;importjava.io.FileReader;importjava.io.IOException;importjava.io.LineNumberReader;publicclassLineNumberReaderDemo {publicstaticvoidmain(String[] args) {

LineNumberReader lnr=null;try{

lnr=newLineNumberReader(newFileReader("d:\\demo.txt"));//设置开始行叼lnr.setLineNumber(100);

String line=null;while((line=lnr.readLine())!=null){//getLineNumber默认从1开始,设置后从设置的行号开始System.out.println(lnr.getLineNumber()+":"+line);

}

}catch(FileNotFoundException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}finally{try{if(lnr!=null)

lnr.close();

}catch(IOException e) {

e.printStackTrace();

}

}

}

}

4.3、自定义

packagecom.pb.io.demo4;importjava.io.File;importjava.io.FileReader;importjava.io.IOException;importjava.io.Reader;publicclassMyLineNumberReader {privateReader reader;privateintlineNumber;publicMyLineNumberReader(Reader reader) {this.reader =reader;

}/** 读一行*/publicString myReadLine()throwsIOException {

lineNumber++;

StringBuilder sb=newStringBuilder();intch=0;while((ch = reader.read()) != -1) {if(ch == '\r')continue;if(ch == '\n')returnsb.toString();

sb.append((char) ch);

}if(sb.length() != 0)returnsb.toString();returnnull;

}publicvoidmyClose()throwsIOException{

reader.close();

}publicReader getReader() {returnreader;

}publicvoidsetReader(Reader reader) {this.reader =reader;

}publicintgetLineNumber() {returnlineNumber;

}publicvoidsetLineNumber(intlineNumber) {this.lineNumber =lineNumber;

}publicstaticvoidmain(String[] args)throwsIOException {

File file=newFile("d:\\demo.txt");

MyLineNumberReader mln=newMyLineNumberReader(newFileReader(file));

String line=null;//mln.setLineNumber(100);while((line=mln.myReadLine())!=null){

System.out.println(mln.getLineNumber()+":"+line);

}

mln.myClose();

}

}

五、字节流5.1、字节流

OutputStream写、InputStream读

FileOutputStream、FileInputStream 字节流输出、输入流

构造方法摘要OutputStream()

方法摘要void

close()

关闭此输出流并释放与此流有关的所有系统资源。

void

flush()

刷新此输出流并强制写出所有缓冲的输出字节。

void

write(byte[] b)

将b.length个字节从指定的 byte 数组写入此输出流。

void

write(byte[] b,

int off, int len)

将指定 byte 数组中从偏移量off开始的len个字节写入此输出流。

abstract

void

write(int b)

将指定的字节写入此输出流。

构造方法摘要InputStream()

方法摘要int

available()

返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。

void

close()

关闭此输入流并释放与该流关联的所有系统资源。

void

mark(int readlimit)

在此输入流中标记当前的位置。

boolean

markSupported()

测试此输入流是否支持mark和reset方法。

abstract

int

read()

从输入流中读取数据的下一个字节。

int

read(byte[] b)

从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。

int

read(byte[] b,

int off, int len)

将输入流中最多len个数据字节读入 byte

数组。

void

reset()

将此流重新定位到最后一次对此输入流调用mark方法时的位置。

long

skip(long n)

跳过和丢弃此输入流中数据的n个字节。

5.2、FileInputStream与FileOutputStream

packagecom.pb.io.demo5;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;/*** 使用字节流复制文件

**/publicclassFileOutputAndFileInputStreamDemo {publicstaticvoidmain(String[] args) {

File source=newFile("d:\\1.jpg");

File objFile=newFile("d:\\4.jpg");

InputAndOutput2(source,objFile);

}publicstaticvoidInputAndOutput(File source,File objFile){//声明字节流输入,输出对象FileInputStream fis=null;

FileOutputStream fos=null;try{

fis=newFileInputStream(source);

fos=newFileOutputStream(objFile);//声明缓冲区byte[] buf=newbyte[1024];intlen=0;while((len=fis.read(buf))!=-1){

fos.write(buf,0, len);

}

System.out.println("=======读写完成========");

}catch(FileNotFoundException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}finally{try{if(fos!=null)

fos.close();

}catch(IOException e) {

e.printStackTrace();

}try{if(fis!=null)

fis.close();

}catch(IOException e) {

e.printStackTrace();

}

}

}/** 不建议使用*/publicstaticvoidInputAndOutput2(File source,File objFile){//声明字节流输入,输出对象FileInputStream fis=null;

FileOutputStream fos=null;try{

fis=newFileInputStream(source);

fos=newFileOutputStream(objFile);//声明大小刚刚缓冲区byte[] buf=newbyte[fis.available()];//不建议使用availablefis.read(buf);

fos.write(buf,0,buf.length);

System.out.println("=======读写完成========");

}catch(FileNotFoundException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}finally{try{if(fos!=null)

fos.close();

}catch(IOException e) {

e.printStackTrace();

}try{if(fis!=null)

fis.close();

}catch(IOException e) {

e.printStackTrace();

}

}

}

}

六、字节流缓冲区6.1、示例复制.mp3

packagecom.pb.io.demo5;importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;publicclassBufferedStreamDemo {publicstaticvoidmain(String[] args) {

File file1=newFile("d:\\gm.mp3");

File file2=newFile("d:\\mg.mp3");

copy1(file1,file2);

}publicstaticvoidcopy1(File file1,File file2){//声明字节流缓冲区对象BufferedOutputStream bos=null;

BufferedInputStream bis=null;try{

bis=newBufferedInputStream(newFileInputStream(file1));

bos=newBufferedOutputStream(newFileOutputStream(file2));//声明缓冲区大小intby=0;while((by=bis.read())!=-1){

bos.write(by);

}

}catch(FileNotFoundException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}finally{try{if(bos!=null)

bos.close();

}catch(IOException e) {

e.printStackTrace();

}try{if(bis!=null)

bis.close();

}catch(IOException e) {

e.printStackTrace();

}

}

}

}

6.2、自定义

packagecom.pb.io.demo5;importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;publicclassMyBufferedStream {privateInputStream is;privatebyte[] buf =newbyte[1024];privateintpos = 0;privateintcount = 0;publicMyBufferedStream(InputStream is) {this.is =is;

}/** 一次读一个字节,从缓冲区的(字节数组)获取*/publicintmyRead()throwsIOException {//通过in对象读取硬盘上的数据,并存在buf中if(count == 0) {

count=is.read(buf);if(count < 0) {return-1;

}

pos= 0;byteb =buf[pos];

count--;

pos++;returnb & 0xff;

}elseif(count > 0) {byteb =buf[pos];

count--;

pos++;returnb & 0xff;

}return-1;

}publicvoidmyClose()throwsIOException {

is.close();

}publicstaticvoidmain(String[] args) {

File file1=newFile("d:\\gm.mp3");

File file2=newFile("d:\\kk.mp3");

copy1(file1, file2);

}publicstaticvoidcopy1(File file1, File file2) {//声明字节流缓冲区对象BufferedOutputStream bos =null;

MyBufferedStream mbs=null;try{

mbs=newMyBufferedStream(newFileInputStream(file1));

bos=newBufferedOutputStream(newFileOutputStream(file2));//声明缓冲区大小intby = 0;while((by = mbs.myRead()) != -1) {

bos.write(by);

}

}catch(FileNotFoundException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}finally{try{if(bos !=null)

bos.close();

}catch(IOException e) {

e.printStackTrace();

}try{

mbs.myClose();

}catch(IOException e) {

e.printStackTrace();

}

}

}

}

七、转换7.1、字节流转换字符流

InputStreamReader 是字节流通向字符流的桥梁:它使用指定的charset读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

BufferedReader in=newBufferedReader(newInputStreamReader(System.in));

OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的charset将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。

Writer out=newBufferedWriter(newOutputStreamWriter(System.out));

7.2、示例

接收键盘输入,使用转换流实现

packagecom.pb.io.demo6;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.OutputStreamWriter;/*** 接收键盘输入,并将内容写入文件

**/publicclassDemo {publicstaticvoidmain(String[] args) {

BufferedReader br=null;

BufferedWriter bw=null;try{//声明输入流,使用转换流实现

br=newBufferedReader(newInputStreamReader(System.in));//声明输出流,使用转换流实现bw=newBufferedWriter(newOutputStreamWriter(newFileOutputStream("d:\\t.txt")));//接收键盘录入String str=null;

System.out.println("请输入要写入文件的内容,输入over结束!");//输入over结束while(!(str=br.readLine()).equals("over")){

bw.write(str);

bw.newLine();

}

}catch(FileNotFoundException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}finally{try{if(bw!=null)

bw.close();

}catch(IOException e) {

e.printStackTrace();

}try{if(br!=null)

br.close();

}catch(IOException e) {

e.printStackTrace();

}

}

}

}

八、流操作的规律1、明确源和目的

源:输入流。InputStream,Reader

目的:输出流 .OutputStream,Writer

2、操作的数据是否为纯文本

是:字符流。Reader、Writer

不是:字节流。InputStream、OutputStream

3、当体系明确后,在明确要使用哪个具体对象。

通过设备来进行区别。

源设备:内存、硬盘、键盘

目的设备:内存、硬盘、控制台

九、重定向IO9.1、示例

//设置输入流的System.setIn(newFileInputStream("d:\\demo.txt"));//设置的输出流的方向System.setOut(newPrintStream("d:\\zz.txt"));

十、系统信息10.1、示例

packagecom.pb.io.demo6;importjava.util.Properties;publicclassDemo1 {publicstaticvoidmain(String[] args) {

Properties prop=System.getProperties();

prop.list(System.out);//可以设置为输出流对象new PrintWriter(文件)}

}

-- listing properties --java.runtime.name=Java(TM) SE Runtime Environment

sun.boot.library.path=C:\Java\jre1.8.0_60\bin

java.vm.version=25.60-b23

java.vm.vendor=OracleCorporation

java.vendor.url=http://java.oracle.com/path.separator=;

java.vm.name=Java HotSpot(TM) 64-Bit Server VM

file.encoding.pkg=sun.io

user.script=user.country=CN

sun.java.launcher=SUN_STANDARD

sun.os.patch.level=java.vm.specification.name=Java Virtual Machine Specification

user.dir=F:\work\IODemo

java.runtime.version=1.8.0_60-b27

java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment

java.endorsed.dirs=C:\Java\jre1.8.0_60\lib\endorsed

os.arch=amd64

java.io.tmpdir=C:\Users\ADMINI~1\AppData\Local\Temp\

line.separator=java.vm.specification.vendor=Oracle Corporation

user.variant=os.name=Windows 7sun.jnu.encoding=GBK

java.library.path=C:\Java\jre1.8.0_60\bin;C:\Windows\Su...

java.specification.name=Java Platform API Specification

java.class.version=52.0sun.management.compiler=HotSpot 64-Bit Tiered Compilers

os.version=6.1user.home=C:\Users\Administrator

user.timezone=java.awt.printerjob=sun.awt.windows.WPrinterJob

file.encoding=UTF-8java.specification.version=1.8user.name=Administrator

java.class.path=F:\work\IODemo\bin

java.vm.specification.version=1.8sun.arch.data.model=64java.home=C:\Java\jre1.8.0_60

sun.java.command=com.pb.io.demo6.Demo1

java.specification.vendor=Oracle Corporation

user.language=zh

awt.toolkit=sun.awt.windows.WToolkit

java.vm.info=mixed mode

java.version=1.8.0_60

java.ext.dirs=C:\Java\jre1.8.0_60\lib\ext;C:\Window...

sun.boot.class.path=C:\Java\jre1.8.0_60\lib\resources.jar...

java.vendor=Oracle Corporation

file.separator=\

java.vendor.url.bug=http://bugreport.sun.com/bugreport/sun.cpu.endian=little

sun.io.unicode.encoding=UnicodeLittle

sun.desktop=windows

sun.cpu.isalist=amd64

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有