《java笔记》word版Word文档格式.docx
《《java笔记》word版Word文档格式.docx》由会员分享,可在线阅读,更多相关《《java笔记》word版Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
真正的文件在硬盘里数据,读数据都是0和1,文件想像成一个桶,文件里取数据,管道就是流,和水流的原理一样。
流就是2根管道,一个向里一个向外,无论向里还是向外都是对我们写的程序来说的
包在外面是处理流,一根不够包2根处理流管道,直接套在节点流或者处理流上面
在java程序中,对于数据的输入/输出操作以"
流"
方式进行,J2SDK提供了各种各样的"
类,用以获取不通种类的数据,程序中通过标准的方法输入和输出数据
通常我们指的流就是:
io包里的类,java.io包中定义了多个流类型(类或抽象类)来事先输入/输出功能:
可以从不桶的调度对其进行分类:
按数据流的方向不同可以分为输入流和输出流
按处理数据单位不同可以分为字节流和字符流
按照功能不同可以分为节点流和处理流
(注释):
输入流:
程序的角度读数据
输出流:
往外写
字节流:
0和1
字符流:
一个字符一个字符(2个字节)
节点流:
管道直接接到数据源上
处理流:
套在其他管道上的流,处理流是"
连接"
在已存在的流(节点流或处理流)之上,
通过对数据的处理为程序提供更为强大的读写功能。
J2SDK所提供的所有刘类型位于包java.io内都分别继承自以下四种抽象流类型
字节流字符流
输入流InuputStreamReader往里读
输出流OutputStreamWriter字符形式往外写
4根管道:
一端接着程序一端接着数据源
InputStream:
继承自InputStream的流都是用于向程序中输入数据,且单位为字节(8bit)
深色:
节点流浅色:
处理流
InputStream的基本方法:
abstractintread()throwsIOExceptionread一下读一个字节
读取一个字节并以正数的形式返回(0-255)如果返回-1已到输入流的末尾
intread(byteb)throwsIOException
从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。
返回实际读取的字节数,如果读取前已到输入流的末尾返回-1
(Eg.p2p毁硬盘是硬盘访问的频繁的原因,可以在内存中分配个空间,读一次装满,写:
在内存里写好了,一次性写到硬盘里去)
intread(byteb,intoff,intlen)throwsIOException
将输入流中最多len个数据字节读入byte数组。
从len的位置开始返回实际读取的字节数,如果读取前以到输入流的末尾返回-1longskip(longn)throwsIOException
跳过和丢弃此输入流中数据的n个字节。
voidclose()throwsIOException
关闭此输入流并释放与该流关联的所有系统资源。
OutputStream:
继承自OutputStream的流是用于程序中输出数据,且数据的单位为字节(8bit),此抽象类是表示输出字节流的所有类的超类。
下图中深色为节点流,浅色为处理流
OutputStream的基本方法:
abstractvoidwrite(intb)throwsIOException
将指定的字节写入此输出流。
该字节数据为参数b的低8位
关闭此输出流并释放与此流有关的所有系统资源。
voidflush()throwsIOException刷新此输出流并强制写出所有缓冲的输出字节。
voidwrite(byteb)throwsIOException
将b.length个字节从指定的byte数组写入此输出流。
voidwrite(byteb,intoff,intlen)throwsIOException将指定byte数组中从偏移量off开始的len个字节写入此输出流。
close()之前调用flush()把缓冲区中的剩余数据写入硬盘
Reader
继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符(16bit)
(2个字节2个字节地往外读)
Writer
继承自Writer的流都是用于程序中输出数据,且数据的单位为字符(16bit);
abstractvoidclose()关闭此流,但要先刷新它。
abstractvoidflush()刷新该流的缓冲。
voidwrite(charcbuf)写入字符数组。
abstractvoidwrite(charcbuf,intoff,intlen)写入字符数组的某一部分。
voidwrite(intc)写入单个字符。
voidwrite(Stringstr)写入字符串。
voidwrite(Stringstr,intoff,intlen)
写入字符串的某一部分。
节点流类型:
类型字符流字节流
File(文件)FileReaderFileWriterFileInputStreamFileOutputStreamMemoryArrayCharArrayReaderCharArrayWriterByteArrayInputStreamByteArrayOutputStreamMemoryStringStringReaderStringWriterPipe(管道)PipedReaderPipedWriterPipedInputStreamPipedOutputStream
(Stream结尾的都是字节,Writer和Read结尾的都是字符)
FileInputStream(Filefile)通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的File对象file指定。
FileInputStream(Stringname)通过打开一个到实际文件的连接来创建一个FileInputStream,该文件通过文件系统中的路径名name指定。
FileOutputStream(Filefile)
创建一个向指定File对象表示的文件中写入数据的文件输出流。
FileOutputStream(Filefile,booleanappend)
FileOutputStream(Stringname)
创建一个向具有指定名称的文件中写入数据的输出文件流。
FileInputStream和FileOutputStream类支持父类InputStream和OutputStream提供的数据读写方法
处理流类型
处理类型字符流字节流
BufferingBufferedReaderBufferedWriterBufferedInputStreamBufferedOutputStreamFilteringFilterReaderFilterWriterFilterInputStreamFilterOutputStreamConvertingbetweenbytesandcharacterInputStreamReaderOutputStreamWriterObjectSerializationObjectInputStreamObjectOutputStreamDataconversionDataInputStreamDataOutputStreamCountingLineNumberReaderLineNumberInputStreamPeekingaheadPushackReaderPushhackInputStreamPrintingPrintWriterPrintStream
(1)缓冲流:
缓冲流要"
套接"
在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,增加了一些新的方法
J2SDK提供了4种缓冲流:
BufferedReaderBufferedWriterBufferedInputStreamBufferedOutputStream
构造方法:
BufferedReader(Readerin)
创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Readerin,intsz)//sz为自定义缓冲区大小
创建一个使用指定大小输入缓冲区的缓冲字符输入流。
BufferedWriter(Writerout)
创建一个使用默认大小输出缓冲区的缓冲字符输出流。
BufferedWriter(Writerout,intsz)
创建一个使用指定大小输出缓冲区的新缓冲字符输出流。
BufferedInputStream(InputStreamin)
创建BufferedInputStream并保存其参数,即输入流in,以便将来使用。
BufferedInputStream(InputStreamin,intsize)
创建具有指定缓冲区大小的BufferedInputStream,并保存其参数,即输入流in,以便将来使用。
BufferedOutputStream(OutputStreamout)
创建一个新的缓冲输出流,以将数据写入指定的基础输出流。
BufferedOutputStream(OutputStreamout,intsize)
创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的基础输出流。
缓冲输入量支持其父类(java.io.FilterInputStream)的mark和reset方法
BufferedReader提供了readLine方法用于读取一行字符串(以\r或\n分割)
BufferedWriter提供了newLine用于写入一个行分隔符
对于输出缓冲流,写出的数据会先在内存中缓存,使用flush方法会使内存中的数据立即写出。
举例
(1)
//BufferedInputStreamimportjava.io.*;
publicclassTestBufferStream1{
publicstaticvoidmain(Stringargs){
try{
FileInputStreamfis=newFileInputStream("
D:
/java/TestR.java"
);
BufferedInputStreambis=newBufferedInputStream(fis);
//套接在节点流上
intc=0;
System.out.println(bis.read());
//112System.out.println(bis.read());
//117bis.mark(100);
//标记标到100,从第100个字符开始往外读
for(inti=0;
i=10&
&
(c=bis.read())!
=-1;
i++){
System.out.print((char)c+"
"
}
System.out.println();
bis.reset();
//又回到刚才标记的第100个字符的点
//char强制转化成字符,注意这有个里ASCII码回车:
13换行:
10,可以去掉char看到
bis.close();