IO包中的其他类Word下载.docx
《IO包中的其他类Word下载.docx》由会员分享,可在线阅读,更多相关《IO包中的其他类Word下载.docx(14页珍藏版)》请在冰豆网上搜索。
(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{
Vector<
FileInputStream>
ve=newVector<
();
ve.add(newFileInputStream("
\\111.txt"
));
\\112.txt"
\\113.txt"
Enumeration<
en=ve.elements();
SequenceInputStreamsis=newSequenceInputStream(en);
FileOutputStreamfos=newFileOutputStream("
\\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;
//下午4:
50:
11
Filefile=newFile("
\\G.E.M.邓紫棋-泡沫.mp3"
spiltFile(file);
privatestaticvoidspiltFile(Filefile)throwsIOException{
51:
51
FileInputStreamfis=newFileInputStream(file);
byte[]buf=newbyte[SIZE];
Filedir=newFile("
\\parts\\partppp"
FileOutputStreamfos=null;
if(!
dir.exists()){
dir.mkdirs();
intlen=0;
intcount=1;
while((len=fis.read(buf))!
fos=newFileOutputStream(newFile(dir,"
切割文件"
+(count++)+"
.part"
//可以把目录与具体文件封装在一起
fis.close();
2.
四、切割和合并文件:
packagelianxi;
importjava.io.SequenceInputStream;
importjava.util.ArrayList;
importjava.util.Collections;
importjava.util.Enumeration;
heBing(dir);
//下面是合并文件
privatestaticvoidheBing(Filedir)throwsIOException{
ArrayList<
arrlist=newArrayList<
for(inti=1;
i<
5;
i++){
arrlist.add(newFileInputStream(newFile(dir,"
+i+"
)));
en=Collections.enumeration(arrlist);
FileOutputStreamfos=newFileOutputStream(newFile("
\\hebing.mp3"
byte[]buffer=newbyte[1024];
while((len=sis.read(buffer))!
=-1){
fos.write(buffer,0,len);
//下面是切割文件
2.对切割和合并文件进行优化:
切割文件时,需要记录原文件的名称(包括格式),以及切割文件的个数,以便合并时回复到原来的文件。
利用Properties文件记录。
importjava.io.FilenameFilter;
importjava.util.Properties;
publicclassAdcancedSpiltHebingTest{
privatestaticfinalintSIZE=1024*512;
\\小苹果.mp4"
//获取配置信息文件,可能不存在或者多个,这些都是不合法的,只能有一个,提高程序的健壮性
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("
if(files2.length!
=count){
切割文件个数不对"
=count;
FileOutputStreamfos=newFileOutputStream(newFile(dir,filename));
fos.close();
pro.setProperty("
file.getName());
Integer.toString(count-1));
myProperties"
+"
pro.store(fos,"
fileinfo"
//定义一个名字过滤器
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("
\\obj.object"
oos.writeObject(newAnimal());
//Animal必须实现接口Serializable
oos.close();
2.读对象:
//对象的反序列化
ObjectInputStreamois=newObjectInputStream(newFileInputStream(newFile("
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.
3.现在简体中文版都是用的是GBK编码表。
UTF是Unicode转换格式。
4.使用最多的是GBK和Unicode.
一十二、编码和解码
1.字符串----》字节数组称为编码。
看懂的到看不懂的。
2.字节数组-------》字符串称为解码。
看不懂的到看懂的。
一十三、练习题:
UTF-8中只有Ascii码不是负值,其他的是负值。