java笔记10 io.docx
- 文档编号:30398623
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:19
- 大小:21.52KB
java笔记10 io.docx
《java笔记10 io.docx》由会员分享,可在线阅读,更多相关《java笔记10 io.docx(19页珍藏版)》请在冰豆网上搜索。
java笔记10io
java笔记10io
流(stream)
本章内容
Java流式输入/输出原理
Java流类的分类
流入/流出流类
常见的节点流和处理流
文件流
缓冲流
数据流
转换流
Print流
Object流
流的原理:
读写数据
真正的文件在硬盘里数据,读数据都是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位
voidclose()throwsIOException
关闭此输出流并释放与此流有关的所有系统资源。
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)
创建一个向指定File对象表示的文件中写入数据的文件输出流。
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个字符的点
for(inti=0;i=10&&(c=bis.read())!
=-1;i++){
System.out.print((char)c+"");
//char强制转化成字符,注意这有个里ASCII码回车:
13换行:
10,可以去掉char看到
}
bis.close();
}catch(IOExceptione){e.printStackTrace();}
}
}
举例
(2)
//BufferedWriterBufferedReaderimportjava.io.*;
publicclassTestBufferStream2{
publicstaticvoidmain(Stringargs){
try{
BufferedWriterbw=newBufferedWriter(newFileWriter("d:
/java/bw.txt"));
//管道是writer类型,在这个文件夹内写进100行数据,每一行是一个随机数
BufferedReaderbr=newBufferedReader(newFileReader("d:
/java/br.txt"));//管道是reader类型txt:
事先写了一些中文字符
Strings=null;
for(inti=1;i=100;i++){
s=String.valueOf(Math.random());
bw.write(s);
bw.newLine();//以"行"输入
}
bw.flush();//close()之前调用flush()把缓冲区中的剩余数据写入硬盘
while((s=br.readLine())!
=null){//readLine方法值得使得在其他管道上套上Buffered*
System.out.println(s);
}
bw.close();
br.close();
}catch(IOExceptione){e.printStackTrace();}
}
}
(2)转换流
InputStreamReader和OutputSteamWriter用于字节数据到字符数据之间的转换
InputStreamReader需要和InputStream"套接"
OutputStreamWriter需要和OutputStream"套接"
转换流在构造时可以指定其编码集合
InputStreamisr=newInputStreamReader(System.in,"ISO8859_1")
InputStream转换成Reader
编码:
ISO8859_1是个比较特殊的字符集,它是一个8位的编码,这就让他成为一个非常好的中介机构,会忠实的将每个字节的数据记录下来而不改变,估计这是web传输和jdbc传输使用它为字符集的原因吧
它包含所有西欧语言,还有个名字叫latin-1(latin-1~latin-9基本把西方所有国家文字统一)
东方人:
GBK、gb2312(国标码)
全球统一:
Unicode
(jsp的时候再说这个问题)
实例
(1)
importjava.io.*;
publicclassTestTransForm1{
publicstaticvoidmain(Stringargs){
try{
OutputStreamWriterosw=newOutputStreamWriter(
newFileOutputStream("d:
\bak\char.txt"));
osw.write("mircosoftibmsunapplehp");//而FileOutputStream是没有这个接口直接写字符串的
System.out.println(osw.getEncoding());//当前程序默认的编码是GBKosw.close();
osw=newOutputStreamWriter(
newFileOutputStream("d:
\bak\char.txt",true),"ISO8859_1");
//原来的文件内容基础上添加,去掉true就覆盖了//按照指定的字符编码写
osw.write("mircosoftibmsunapplehp");
System.out.println(osw.getEncoding());
osw.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
实例
(2)
importjava.io.*;
publicclassTestTransForm2{
publicstaticvoidmain(Stringargs){
InputStreamReaderisr=
newInputStreamReader(System.in);
//System.out是dos界面,System.in键盘输入
//注意:
System.in本身就是个inputStream,就是根管道
BufferedReaderbr=newBufferedReader(isr);//为了读"一行"的数据,又包了一层
Strings=null;
try{
s=br.readLine();
while(s!
=null){
if(s.equalsIgnoreCase("exit"))break;
System.out.println(s.toUpperCase());
s=br.readLine();
}
br.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}//标准输入的等待阻塞,同步(线程会讲)
(3)数据流
Eg.把一个long类型的数写到文件里,long类型的数很长,不断地转换成字符串,再转换成字节数组,内存占用大
但一个long类型的数组占8个字节,转换出来要80个字节
我们可以直接把8个字节写到一个文件里去
DataInputStream和DataOutputStream分别继承自InputStream和OutputStream,它属于处理流,需要分别"套接"在InputStream和OutputStream类型的节点流上
DataInputStream和DataOutputStream提供了可以存取与机器无关的java原始类型数据(如:
int,double等)的方法
DataInputStream和DataOutStream的构造方法:
DataInputStream(InputStreamin)
使用指定的底层InputStream创建一个DataInputStream。
DataOutputStream(OutputStreamout)
创建一个新的数据输出流,将数据写入指定基础输出流。
方法查看api文档
实例
importjava.io.*;
publicclassTestDataStream{
publicstaticvoidmain(Stringargs){
ByteArrayOutputStreambaos=newByteArrayOutputStream();
//
(1)分配了一个字节数组
(2)管道堆在了内存里的这块字节数组上
DataOutputStreamdos=newDataOutputStream(baos);//套接
try{
dos.writeDouble(Math.random());//一下把8个字节(double型)写进去
dos.writeBoolean(true);//布尔(1个字节)
ByteArrayInputStreambais=
newByteArrayInputStream(baos.toByteArray());
//toByteArray(转换成字节数组byteSystem.out.println(bais.available());//有多少个字节
DataInputStreamdis=newDataInputStream(bais);//dis套到bais上(字节数组)上去了
System.out.println(dis.readDouble());//注意!
先进先出(队列)
System.out.println(dis.readBoolean());
dos.close();
dis.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
Print流:
PrintWriter和PrintStream都属于输出流,分别针对与字符和字节(属于成对)
PrintWriter和PrintStream提供了重载的printPrintln方法用于多种数据类型的输出
PrintWriter和PrintStream的输出操作不会抛出异常,用户通过检测错误状态获取错误信息
PrintWriter和PrintStream有自动flush功能
问:
怎么没有调用close方法
(在jsp的时候,trycatch太多了很累,那么用Print比较省力)
PrintWriter(Writerout)
创建不带自动行刷新的新PrintWriter。
PrintWriter(Writerout,booleanautoFlush)
创建新PrintWriter。
PrintWriter(OutputStreamout)
根据现有的OutputStream创建不带自动行刷新的新PrintWriter。
PrintWriter(OutputStreamout,booleanautoFlush)
通过现有的OutputStream创建新的PrintWriter。
PrintStream(OutputStreamout)
创建新的打印流。
PrintStream(OutputStreamout,booleanautoFlush)
创建新的打印流。
实例
(1)
importjava.io.*;
publicclassTestPrintStream1{
publicstaticvoidmain(Stringargs){
PrintStreamps=null;
try{
FileOutputStreamfos=
newFileOutputStream("d:
\bak\log.dat");
ps=newPrintStream(fos);
}catch(IOExceptione){
e.printStackTrace();
}
if(ps!
=null){
System.setOut(ps);//重新设置输出到ps管道
}
intln=0;
for(charc=0;c=60000;c++){
System.out.print(c+"");
if(ln++=100){
System.out.println();
ln=0;
}
}
}
}
实例
(2)
importjava.io.*;
publicclassTestPrintStream2{
publicstaticvoidmain(Stringargs){
Stringfilename=args[0];//命令行参数
if(filename!
=null){
list(filename,System.out);//把filename当成参数传到list方法内
}
}
publicstaticvoidlist(Stringf,PrintStreamfs){//fs-System.out
//把本来传到dos界面的文字传到fstry{
BufferedReaderbr=
newBufferedReader(newFileReader(f));
Strings=null;
while((s=br.readLine())!
=null){
fs.pr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java笔记10 io java 笔记 10