孙鑫JAVA学习笔记78.docx
- 文档编号:10577142
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:39
- 大小:31.42KB
孙鑫JAVA学习笔记78.docx
《孙鑫JAVA学习笔记78.docx》由会员分享,可在线阅读,更多相关《孙鑫JAVA学习笔记78.docx(39页珍藏版)》请在冰豆网上搜索。
孙鑫JAVA学习笔记78
七.I/O操作,字节流,字符流,字符集编码
1.I/O操作
是放在java.io包中的;
2.File类
一个File类的对象,表示了磁盘上的文件或目录。
File类提供了与平台无关的方法来对磁盘上的文件或目录进行操作。
importjava.io.*;
classFileTest
{
publicstaticvoidmain(String[]args)throwsException//IO操作会经常抛出异常,我们交给JVM来处理
{
//Filef=newFile("1.txt");
//f.createNewFile();//创建一个文件1.txt
//f.mkdir();//创建一个目录:
1.txt
/*指定绝对路径:
\在JAVA是特殊的转义字符;所以输出\用“\\”*/
//Filef=newFile("E:
\\JavaLesson\\Lesson7\\1.txt");//--但它只能在当前windows系统有效;在Linux下无效
FilefDir=newFile(File.separator);//定义父目录为根目录;在windows下表示当前运行盘符的根目录!
StringstrFile="JavaLesson"+File.separator+
"Lesson7"+File.separator+"1.txt";//win和Linux系统中编译成不同符合;
Filef=newFile(fDir,strFile);//根目录+当前目录和文件;可移植到Linux;
f.createNewFile();
}
}
属性和方法:
a.separator
separator属性用来代表路径斜杠;通用的!
构造函数可以采用父目录+子文件名的方式:
File(Fileparent,Stringchild)
CreatesanewFileinstancefromaparentabstractpathnameandachildpathnamestring.
b.删除文件:
delete()
booleandelete()
Deletesthefileordirectorydenotedbythisabstractpathname.
f.delete()//将f文件删除
c.deleteOnExit
deleteOnExit();在程序退出的时候删除文件!
可以用来删除垃圾文件;临时文件等;
d.createTempFile创建临时文件到临时目录(返回File对象);
staticFilecreateTempFile(Stringprefix,Stringsuffix)
Createsanemptyfileinthedefaulttemporary-filedirectory,usingthegivenprefixandsuffixtogenerateitsname.
e.g.:
for(inti=0;i<5;i++)
{
Filef=File.createTempFile("winsun",".tmp");//会创建到系统默认的临时文件夹中;
f.deleteOnExit();//必须手动删除
}
Thread.sleep(3000);
e.List()方法:
String[]list()---返回字符串数组;列出所有文件和子目录;
Returnsanarrayofstringsnamingthefilesanddirectoriesinthedirectorydenotedbythisabstractpathname.
e.g.:
FilefDir=newFile(File.separator);
StringstrFile="JavaLesson"+File.separator+"Lesson6";
Filef=newFile(fDir,strFile);
String[]names=f.list();//返回一个数组
for(inti=0;i { System.out.println(names[i]);//打印内容 } e.2增加过滤器: --增加条件 String[]list(FilenameFilterfilter)--增加一个文件过滤器,选择文件 Returnsanarrayofstringsnamingthefilesanddirectoriesinthedirectorydenotedbythisabstractpathnamethatsatisfythespecifiedfilter. 其中,FilenameFilter是一个接口;包含一个方法accept: booleanaccept(Filedir,Stringname)----Testsifaspecifiedfileshouldbeincludedinafilelist. e.g.: FilefDir=newFile(File.separator); StringstrFile="JavaLesson"+File.separator+"Lesson6"; Filef=newFile(fDir,strFile); //利用内部类来实现FilenameFilter接口,accept方法使用了一个Sting的indexOf方法: String[]names=f.list(newFilenameFilter() { publicbooleanaccept(Filedir,Stringname) { returnname.indexOf(".java")! =-1; }//有.java子串时返回真,选所有java文件! });//作为方法参数传递 for(inti=0;i { System.out.println(names[i]); } e.3: String.indexOf() intindexOf(Stringstr) Returnstheindexwithinthisstringofthefirstoccurrenceofthespecifiedsubstring. 功能: 返回子串的索引值,当没有该子串时返回-1 在File类中,没有给我们提供对文件进行读写操作的方法! 3.输入流,输出流---流式I/O 流(Stream)是字节的源或目的。 两种基本的流是: 输入流(InputStream)和输出流(OutputStream)。 可从中读出一系列字节的对象称为输入流。 而能向其中写入一系列字节的对象称为输出流。 流的分类: 节点流: 从特定的地方读写的流类,例如: 磁盘或一块内存区域。 过滤流: 使用节点流作为输入或输出。 过滤流是使用一个已经存在的输入流或输出流连接创建的。 ---能够获得一些额外的功能! 4.InputStream--抽象类! 三个基本的读方法 abstractintread(): 读取一个字节数据,并返回读到的数据,如果返回-1,表示读到了输入流的末尾。 --返回一个整型,整形包含4个字节,所以int中第一个字节有效,后三个无效! intread(byte[]b): 将数据读入一个字节数组,同时返回实际读取的字节数。 如果返回-1,表示读到了输入流的末尾。 intread(byte[]b,intoff,intlen): 将数据读入一个字节数组,同时返回实际读取的字节数。 如果返回-1,表示读到了输入流的末尾。 off指定在数组b中存放数据的起始偏移位置;len指定读取的最大字节数。 其它方法 longskip(longn): 在输入流中跳过n个字节,并返回实际跳过的字节数。 intavailable(): 返回在不发生阻塞的情况下,可读取的字节数。 voidclose(): 关闭输入流,释放和这个流相关的系统资源。 --创建一个输入流时,OS会分配一些资源; voidmark(intreadlimit): 在输入流的当前位置放置一个标记,如果读取的字节数多于readlimit设置的值,则流忽略这个标记。 --在InputStream中是个空实现! voidreset(): 返回到上一个标记。 --在InputStream中是个空实现! booleanmarkSupported(): 测试当前流是否支持mark和reset方法。 如果支持,返回true,否则返回false。 --然后再实现 5.OutputStream 三个基本的写方法 abstractvoidwrite(intb): 往输出流中写入一个字节。 voidwrite(byte[]b): 往输出流中写入数组b中的所有字节。 voidwrite(byte[]b,intoff,intlen): 往输出流中写入数组b中从偏移量off开始的len个字节的数据。 其它方法 voidflush(): 刷新输出流,强制缓冲区中的输出字节被写出。 --为了加快输出设备的出入速度,一般先写到缓冲区,然后一次性与I/O设备交互进行输出,但是为了立即输出,则采用此方法! voidclose(): 关闭输出流,释放和这个流相关的系统资源。 System.out就是一个PrintStream类型! System还有两个对象: in,out从标准输入设备读,从标准输出设备写 6.基本的流类 FileInputStream和FileOutputStream 节点流,用于从文件中读取或往文件中写入字节流。 如果在构造FileOutputStream时,文件已经存在,则覆盖这个文件。 e.g.: importjava.io.*; classStreamTest { publicstaticvoidmain(String[]args)throwsException { FileOutputStreamfos=newFileOutputStream("1.txt"); fos.write("".getBytes());//write(byte[]b)--需要个字节数组,利用String的方法得到! 神奇! fos.close();//关闭资源 FileInputStreamfis=newFileInputStream("1.txt");//用已存在的文件构造文件输入流对象; byte[]buf=newbyte[100]; intlen=fis.read(buf);//从文件中读取数据流到buf数组 System.out.println(newString(buf,0,len));//用字节数组构造String串,用另一个构造函数 fis.close(); } } BufferedInputStream和BufferedOutputStream 过滤流,需要使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率。 BufferedInputStream将mark和reset方法实现了! BufferedOutputStream实现了flush方法 需要用已经存在的FileInputStream和FileOutputStream来构建它们! importjava.io.*; classStreamTest { publicstaticvoidmain(String[]args)throwsException { FileOutputStreamfos=newFileOutputStream("1.txt"); BufferedOutputStreambos=newBufferedOutputStream(fos);//用fos来构建bos bos.write("".getBytes());//将字符串写入bos对象 bos.flush();//或者用bos.close();也能将缓冲区的数据写入磁盘! 关了它就无需关闭fos了! --连锁 FileInputStreamfis=newFileInputStream("1.txt"); BufferedInputStreambis=newBufferedInputStream(fis);//用fis构建bis byte[]buf=newbyte[100]; intlen=bis.read(buf);//读出对象内容到buf中 System.out.println(newString(buf,0,len)); bis.close();//无需再fis.close; } } DataInputStream和DataOutputStream 过滤流,需要使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。 是由FilterInputStream继承而来,实现了DataInput接口(基本类型的读取);Output类似! Constructor: DataOutputStream(OutputStreamout) e.g. importjava.io.*; classStreamTest { publicstaticvoidmain(String[]args)throwsException { FileOutputStreamfos=newFileOutputStream("1.txt"); BufferedOutputStreambos=newBufferedOutputStream(fos); DataOutputStreamdos=newDataOutputStream(bos);//也可以用fos! byteb=3; inti=78; charch='a'; floatf=4.5f; dos.writeByte(b);//dos中实现的方法 dos.writeInt(i); dos.writeChar(ch); dos.writeFloat(f); dos.close();//由于我们链接了一个bos,所以有buffer的功能! 关闭才能写入! FileInputStreamfis=newFileInputStream("1.txt"); BufferedInputStreambis=newBufferedInputStream(fis); DataInputStreamdis=newDataInputStream(bis); System.out.println(dis.readByte()); System.out.println(dis.readInt()); System.out.println(dis.readChar()); System.out.println(dis.readFloat()); dis.close(); } } PipedInputStream和PipedOutputStream 管道流,用于线程间的通信。 一个线程的PipedInputStream对象从另一个线程的PipedOutputStream对象读取输入。 要使管道流有用,必须同时构造管道输入流和管道输出流。 可用无参构造,然后用connect()方法进行连接; 也可在构造的时候直接指定管道输出流进行连接! PipedInputStream(PipedOutputStreamsrc) CreatesaPipedInputStreamsothatitisconnectedtothepipedoutputstreamsrc. 同样,PipedOutputStream也有类似的方法! 注意管道流是由输入输出流继承而来的而不是过滤流FilterInput(Output)Stream继承而来的! e.g. importjava.io.*; classPipedStreamTest { publicstaticvoidmain(String[]args)throwsException { PipedOutputStreampos=newPipedOutputStream(); PipedInputStreampis=newPipedInputStream(); try { pos.connect(pis);//也可以反过来连接,或者构造的时候连接! newProducer(pos).start(); newConsumer(pis).start(); } catch(Exceptione) { e.printStackTrace(); } } } classProducerextendsThread//用管道输出流定义生产者 { privatePipedOutputStreampos; publicProducer(PipedOutputStreampos) { this.pos=pos; } publicvoidrun() { try { pos.write("Hello,welcomeyou! ".getBytes()); pos.close(); } catch(Exceptione) { e.printStackTrace(); } } } classConsumerextendsThread//用管道输入流定义消费者 { privatePipedInputStreampis; publicConsumer(PipedInputStreampis) { this.pis=pis; } publicvoidrun() { try { byte[]buf=newbyte[100]; intlen=pis.read(buf);//无实体文件,直接从输入流中读(得到的是对应输出流中的数据) System.out.println(newString(buf,0,len));//字节数组,偏移量,长度 pis.close(); } catch(Exceptione) { e.printStackTrace(); } } } 7.JavaI/O库的设计原则 Java的I/O库提供了一个称做链接的机制,可以将一个流与另一个流首尾相接,形成一个流管道的链接。 这种机制实际上是一种被称为Decorator(装饰)设计模式的应用。 通过流的链接,可以动态的增加流的功能,而这种功能的增加是通过组合一些流的基本功能而动态获取的。 我们要获取一个I/O对象,往往需要产生多个I/O对象,(如buffer流产生就需要先构造基本输入输出流)这也是JavaI/O库不太容易掌握的原因,但在I/O库中Decorator模式的运用,给我们提供了实现上的灵活性。 之前的都是字节流;下面介绍字符流: 8.Reader和Writer Java程序语言使用Unicode来表示字符串和字符。 Reader和Writer这两个抽象类主要用来读写字符流。 BufferedRead并没有从FilterReader中派生而来(不同于字节流中的层次),是sun的一个bug! InputStreamReader起到了一个桥梁的作用,用来进行字符流与字节流之间的相互转换! BufferedWriter以及OutputStreamWriter与上面对应! BufferedReader,BufferedWriter提供了对字符的快速读取 构造函数: OutputStreamWriter(OutputStreamout) CreatesanOutputStreamWriterthatusesthedefaultcharacterencoding. importjava.io.*; classStreamTest { publicstaticvoidmain(String[]args)throwsException { FileOutputStreamfos=newFileOutputStream("1.txt"); OutputStreamWritersw=newOutputStreamWriter(fos);//字节流到字符流的桥梁! BufferedWriterbw=newBufferedWriter(osw);//写操作一般用这个而不用OSW,更高效! /*Constructor: BufferedWriter(Writerout)Createsabufferedcharacter-outputstream thatusesadefault-sizedoutputbuffer.--OSW是Writer的子类,所以也可以用来构造*/ bw.write(""); bw.close(); FileInputStreamfis=newFileInputStream("1.txt"); InputStreamReaderisr=newInputStreamReader(fis); BufferedReaderbr=newBufferedReader(isr); System.out.println(br.readlLine()); br.close(); } } 从键盘接收多行输入,然后输出到屏幕: InputStreamReaderisr=newInputStreamReader(System.in);//不用文件输入流(fis)构造了,而直接用in BufferedReaderbr=newBufferedReader(isr); StringstrLine; while((strLine=br.readLine())! =null)//按行读取 { System.out.println(strLine); } br.close(); 9.字符集的编码 ASCII(AmericanStandardCodeforInformationInterchange,美国信息互换标准代码),是基于常用的英文字符的一套电脑编码系统。 我们知道英文中经常使用的字符、数字符号被
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 孙鑫 JAVA 学习 笔记 78