IO包中的其他类.docx
- 文档编号:4610880
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:14
- 大小:627.61KB
IO包中的其他类.docx
《IO包中的其他类.docx》由会员分享,可在线阅读,更多相关《IO包中的其他类.docx(14页珍藏版)》请在冰豆网上搜索。
IO包中的其他类
IO包中的其他类
一、打印流(PrintWriter和PrintStream)
1.打印流可以直接操作输入流和文件。
2.PrintStream不会抛出IOException。
(1)构造方法:
主要分为三类:
接收三种类型的参数:
File对象、输出流、字符串路径。
①File:
可以直接操作文件,File作为参数的有FileWriter、FileReader、FileOutputStream、FileInputStream。
②OutputStream
③String
(2)特点:
提供了特别多的ptint方法,可以对多种数据类型打印,并保持数据的表现形式。
原理:
是把数据先直接转成了字符串,然后打印出来。
(3)
3.FileWriter:
(1)构造方法:
分为四种,比FileStream还多一种。
接收四种类型的参数:
File对象、输出流(OutputStream)、字符串路径、Writer对象。
①File:
②输出流:
autoFlush-Aboolean;iftrue,theprintln,printf,orformatmethodswillflushtheoutputbuffer
③字符串路径:
④Writer:
(2)PrintWriter在web中应用很多。
服务器端向客户端发来就用PrintWriter。
(3)实例:
publicclassPrintWriterTest{
publicstaticvoidmain(String[]args)throwsIOException{
BufferedReaderbufr=newBufferedReader(newInputStreamReader(System.in));
PrintWriterpw=newPrintWriter(newFileWriter("e:
\\rrr.txt"),true);
Stringline=null;
while((line=bufr.readLine())!
=null){
if("over".equals(line))
break;
pw.println(line.toUpperCase());
System.out.println(line.toUpperCase());
}
bufr.close();
pw.close();
}
}
(4)
4.
二、序列流(操作多个流对象)
1.SequenceInputStream对多个流进行合并
2.将切割后的文件合并时,需要对每个切割文件都有一个输出流,利用序列流操作这些输出流。
3.concatenation[kənkætə'neɪʃn]
n.串联,连结
4.实例:
publicclassSequenceTest{
publicstaticvoidmain(String[]args)throwsIOException{
Vector
ve.add(newFileInputStream("e:
\\111.txt"));
ve.add(newFileInputStream("e:
\\112.txt"));
ve.add(newFileInputStream("e:
\\113.txt"));
Enumeration
SequenceInputStreamsis=newSequenceInputStream(en);
FileOutputStreamfos=newFileOutputStream("e:
\\kkk.txt");
byte[]buf=newbyte[1024];
intlen;
while((len=sis.read(buf))!
=-1){
fos.write(buf,0,len);
}
fos.close();
sis.close();
}
}
5.集合转成枚举,通过工具包中提供的静态方法:
Collections中有个方法enumeration方法,返回一个Enumeration。
三、文件切割:
1.代码:
packagelianxi;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
publicclassSpiltFile{
privatestaticfinalintSIZE=1024*1024;
publicstaticvoidmain(String[]args)throwsIOException{
//下午4:
50:
11
Filefile=newFile("e:
\\G.E.M.邓紫棋-泡沫.mp3");
spiltFile(file);
}
privatestaticvoidspiltFile(Filefile)throwsIOException{
//下午4:
51:
51
FileInputStreamfis=newFileInputStream(file);
byte[]buf=newbyte[SIZE];
Filedir=newFile("e:
\\parts\\partppp");
FileOutputStreamfos=null;
if(!
dir.exists()){
dir.mkdirs();
}
intlen=0;
intcount=1;
while((len=fis.read(buf))!
=-1){
fos=newFileOutputStream(newFile(dir,"切割文件"+(count++)+".part"));//可以把目录与具体文件封装在一起
fos.write(buf,0,len);
}
fis.close();
fos.close();
}
}
2.
四、切割和合并文件:
1.代码:
packagelianxi;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.SequenceInputStream;
importjava.util.ArrayList;
importjava.util.Collections;
importjava.util.Enumeration;
publicclassSpiltFile{
privatestaticfinalintSIZE=1024*1024;
publicstaticvoidmain(String[]args)throwsIOException{
Filefile=newFile("e:
\\G.E.M.邓紫棋-泡沫.mp3");
spiltFile(file);
Filedir=newFile("e:
\\parts\\partppp");
heBing(dir);
}
//下面是合并文件
privatestaticvoidheBing(Filedir)throwsIOException{
ArrayList
for(inti=1;i<5;i++){
arrlist.add(newFileInputStream(newFile(dir,"切割文件"+i+".part")));
}
Enumeration
SequenceInputStreamsis=newSequenceInputStream(en);
FileOutputStreamfos=newFileOutputStream(newFile("e:
\\hebing.mp3"));
intlen=0;
byte[]buffer=newbyte[1024];
while((len=sis.read(buffer))!
=-1){
fos.write(buffer,0,len);
}
fos.close();
sis.close();
}
//下面是切割文件
privatestaticvoidspiltFile(Filefile)throwsIOException{
//下午4:
51:
51
FileInputStreamfis=newFileInputStream(file);
byte[]buf=newbyte[SIZE];
Filedir=newFile("e:
\\parts\\partppp");
FileOutputStreamfos=null;
if(!
dir.exists()){
dir.mkdirs();
}
intlen=0;
intcount=1;
while((len=fis.read(buf))!
=-1){
fos=newFileOutputStream(newFile(dir,"切割文件"+(count++)+".part"));
fos.write(buf,0,len);
}
fis.close();
fos.close();
}
}
2.对切割和合并文件进行优化:
切割文件时,需要记录原文件的名称(包括格式),以及切割文件的个数,以便合并时回复到原来的文件。
利用Properties文件记录。
packagelianxi;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.FilenameFilter;
importjava.io.IOException;
importjava.io.SequenceInputStream;
importjava.util.ArrayList;
importjava.util.Collections;
importjava.util.Enumeration;
importjava.util.Properties;
publicclassAdcancedSpiltHebingTest{
privatestaticfinalintSIZE=1024*512;
publicstaticvoidmain(String[]args)throwsIOException{
Filefile=newFile("e:
\\小苹果.mp4");
spiltFile(file);
Filedir=newFile("e:
\\parts\\partppp");
heBing(dir);
}
privatestaticvoidheBing(Filedir)throwsIOException{
//获取配置信息文件,可能不存在或者多个,这些都是不合法的,只能有一个,提高程序的健壮性
File[]files=dir.listFiles(newsuffixFilenameFilter(".properties"));
if(files.length!
=1)
thrownewRuntimeException("配置文件个数不对,没有或者有多个");
Filemanifile=files[0];//获取此配置信息文件
Propertiespro=newProperties();
FileInputStreamfis=newFileInputStream(manifile);
pro.load(fis);
Stringfilename=pro.getProperty("filename");
intcount=Integer.parseInt(pro.getProperty("subfilecount"));
//获取切割文件
File[]files2=dir.listFiles(newsuffixFilenameFilter(".part"));
if(files2.length!
=count){
thrownewRuntimeException("切割文件个数不对");
}
ArrayList
for(inti=1;i<=count;i++){
arrlist.add(newFileInputStream(newFile(dir,"切割文件"+i+".part")));
}
Enumeration
SequenceInputStreamsis=newSequenceInputStream(en);
FileOutputStreamfos=newFileOutputStream(newFile(dir,filename));
intlen=0;
byte[]buffer=newbyte[1024];
while((len=sis.read(buffer))!
=-1){
fos.write(buffer,0,len);
}
fos.close();
sis.close();
}
privatestaticvoidspiltFile(Filefile)throwsIOException{
FileInputStreamfis=newFileInputStream(file);
Propertiespro=newProperties();
byte[]buf=newbyte[SIZE];
Filedir=newFile("e:
\\parts\\partppp");
FileOutputStreamfos=null;
if(!
dir.exists()){
dir.mkdirs();
}
intlen=0;
intcount=1;
while((len=fis.read(buf))!
=-1){
fos=newFileOutputStream(newFile(dir,"切割文件"+(count++)+".part"));
fos.write(buf,0,len);
fos.close();
}
pro.setProperty("filename",file.getName());
pro.setProperty("subfilecount",Integer.toString(count-1));
fos=newFileOutputStream(newFile(dir,"myProperties"+".properties"));
pro.store(fos,"fileinfo");
fis.close();
fos.close();
}
}
//定义一个名字过滤器
classsuffixFilenameFilterimplementsFilenameFilter{
Stringsuffix;
publicsuffixFilenameFilter(Stringsuffix){
this.suffix=suffix;
}
publicbooleanaccept(Filedir,Stringname){
returnname.endsWith(suffix);
}
}
五、操作对象ObjectInputSteam与ObjectOutputStream
被操作的对象需要实现接口Serializable(标记接口)。
写Object时即写一个对象时,这个对象所属类必须实现接口Serializable,实现对象序列化,否则会出现异常NotSerializableException-Someobjecttobeserializeddoesnotimplementthejava.io.Serializableinterface.
读写对象的意义:
使对象的生命周期延长,存到硬盘中,需要时直接从硬盘中直接读取出来。
一般这样的文件的扩展名为.object。
1.写对象:
ObjectOutputStreamoos=newObjectOutputStream(newFileOutputStream(newFile("e:
\\obj.object")));
oos.writeObject(newAnimal());//Animal必须实现接口Serializable
oos.close();
2.读对象:
//对象的反序列化
ObjectInputStreamois=newObjectInputStream(newFileInputStream(newFile("e:
\\obj.object")));
Animalani=(Animal)ois.readObject();//向下转型
System.out.println(ani.getName()+""+ani.getAge());
3.对象中的静态成员变量,不是对象的特有内容,不会被写入。
当然读取的时候也不是上次的值了,而是默认值。
4.transient['trænzɪənt]n.瞬变现象;过往旅客;候鸟
adj.短暂的;路过的
5.利用transient修饰一个变量,可以实现此变量不会被序列化。
publictransientStringname;
privatetransientintage;
六、接口Serializable介绍;
存在的意义:
用于给被序列化的类加入ID号,用于判断类和对象是否是同一个版本。
显式序列化:
privatestaticfinallongserialVersionUID=54453;
七、RandomAccessFile
1.不是IO体系的子类;
2.既能读又能写;随机,文件(包含文本文件和媒体文件);
3.该对象内部维护了一个byte数组,并通过指针可以操作数组中的元素;
4.可以通过getFilePoint方法获取指针的位置,且可以通过seek方法设置指针的位置,通过指定指针的位置,就可以实现随机读取。
随机性就是由seek来完成的。
可以直接设置指针位置,然后写入数据,就可以修改原来的数据。
5.其实该对象就是将字节输入流和输出流进行了封装;
6.构造方法:
通过构造方法可以看出,该对象的源和目的只能是文件。
mode只有四种:
7.如果文件不存在,就会创建一个文件,如果文件已经存在,就不会再次创建,这是与一般的IO输出流不同的地方。
一般的输出流无论存在不存在都会直接创建一个新的文件,若原来存在,直接覆盖原文件。
8.有很多readXxx方法和writeXxx方法。
八、管道流:
PipedInputStream和PipedOutputStream
输入输出可以直接进行连接,通过结合线程使用。
适用于多线程。
九、其他类
(2)操作字节数组的ByteArrayInputStream和ByteArrayOutputStream的源和目的都是内存(字节数组),继承与InputStream和OutputStream。
字符串可以通过方法getByte方法转换成字节数据。
特点:
关闭两者没有作用,仍然可以调用。
因为没有调用底层资源,只是在内存中使用。
不会抛出IOException,因为只操作内存。
(3)
一十、装饰模式:
基本的OutputStream和InputStream,可以被一些具有特定功能的流进行装饰,完成特定功能的操作。
所以输出流和输入流OutputStream和InputStream是有的,一般都是被装饰的。
(如果是字符操作,可以直接利用Writer和Reader,这四个流都是直接继承Object的。
)
一十一、编码表
1.
2.
3.现在简体中文版都是用的是GBK编码表。
UTF是Unicode转换格式。
4.使用最多的是GBK和Unicode.
一十二、编码和解码
1.字符串----》字节数组称为编码。
看懂的到看不懂的。
2.字节数组-------》字符串称为解码。
看不懂的到看懂的。
一十三、练习题:
UTF-8中只有Ascii码不是负值,其他的是负值。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IO 中的 其他
![提示](https://static.bdocx.com/images/bang_tan.gif)