java基础视频等多个文件_第1页
java基础视频等多个文件_第2页
java基础视频等多个文件_第3页
java基础视频等多个文件_第4页
java基础视频等多个文件_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

成都传智播客教育JavaIO2讲师:Will

成都传智播客教育练习现在要求完成一个Copy程序,完全模仿DOS中的拷贝命令。命令的运行形式,可以通过初始化参数的方式设置两个路径形式:javaCopy源文件路径目标文件路径本程序完成有两个思路:思路一:将所有的内容全部读取进来,之后一次性保存思路二:边读边写而且要进行读取的时候还要判断源文件是否存在。成都传智播客教育Copy.java publicstaticvoidmain(String[]args)throwsException{ if(args.length!=2){System.exit(1);}

Filef1=newFile(args[0]); if(f1.exists()){ Filef2=newFile(args[1]); FileInputStreamin=newFileInputStream(f1); FileOutputStreamout=newFileOutputStream(f2); byte[]bys=newbyte[1024]; intlen=0; while((len=in.read(bys))!=-1){ out.write(bys,0,len); } out.close(); in.close(); System.out.println("OK"); } }成都传智播客教育内存操作流-字节之前的文件操作流是以文件的输入输出为主的,当输出的位置变成了内存,那么就称为内存操作流。此时得使用内存流完成内存的输入和输出操作。如果程序运行过程中要产生一些临时文件,可采用虚拟文件方式实现;直接操作磁盘的文件很耗性能,使用内存流可以提升性能;jdk里提供了内存流可实现类似于内存虚拟文件的功能。ByteArrayInputStream:将内容写到内存中ByteArrayOutputStream:将内存中的数据写出ByteArrayInputStream:构造方法:publicByteArrayInputStream(byte[]buf):全部内容publicByteArrayInputStream(byte[]buf,intoffset,intlength):指定范围的内容ByteArrayOutputStream:publicByteArrayOutputStream()成都传智播客教育ByteArrayDemopublicclassByteArrayDemo{ publicstaticvoidmain(String[]args)throwsException{ Stringinfo="helloworld"; InputStreaminput=new

ByteArrayInputStream(info.getBytes()); OutputStreamoutput=newByteArrayOutputStream(); inttemp=0; while((temp=input.read())!=-1){

output.write(Character.toUpperCase((char)temp)); }

Stringstr=output.toString();//取出内容 input.close();//关闭无用 output.close();//无效 System.out.println(str); }}成都传智播客教育内存操作流-字符CharArrayReaderCharArrayWriter此类实现一个可用作Writer的字符缓冲区。缓冲区会随向流中写入数据而自动增长。可使用toCharArray()和toString()获取数据。成都传智播客教育CharArrayDemopublicstaticvoidmain(String[]args)throwsException{ Stringstr="helloworld"; char[]buf=str.toCharArray(); CharArrayReaderreader=newCharArrayReader(buf); CharArrayWriterwriter=newCharArrayWriter(); inttemp=0; while((temp=reader.read())!=-1){ writer.write(Character.toUpperCase(temp)); } Strings=writer.toString(); writer.close(); reader.close(); System.out.println(s); }成都传智播客教育打印流思考:如果现在要想完成一个字符串或者是boolean型或者是字符型的数据输出使用OutputStream是否方便?肯定是不方便的,因为OutputStream中只能操作字节数据,所以其他的数据类型很难操作,那么在Java的IO包中为了解决这种问题增加了两种类:PrintStream、PrintWriter。打印流有非常好的打印功能,可以打印任何的数据类型。如,整数,小树,字符串等。观察PrintStream类的构造: publicPrintStream(Filefile)throwsFileNotFoundException publicPrintStream(OutputStreamout)虽然PrintStream是OutputStream的子类,但是在实例化的时候依然需要一个OutputStream的对象。成都传智播客教育打印流PrintWriter和PrintStream都属于输出流,分别针对字符和字节。PrintWriter和PrintStream重载的print()和println()用于多种数据类型的输出。print()里的参数不能为空;println()可以PrintWriter和PrintStream输出操作不抛出异常PrintStream调用println方法有自动flush功能;成都传智播客教育PrintStreamDemopublicclassPrintStreamDemo{ publicstaticvoidmain(String[]args)throwsException{ PrintStreamout=newPrintStream(new FileOutputStream(newFile("d:" +File.separator+"test.txt"))); out.print(3+"+"+2+"="); out.println(2+3); out.println("Helloitcast!"); out.close(); }}成都传智播客教育格式化输出Java5后,PrintStream类多了printf()方法用于格式化输出操作。但是格式化输出的时候必须指定输出数据的类型:字符描述%s表示内容是字符串%d表示内容是整数%f表示内容是小数%c表示内容是字符当然你也可以全部使用“%s”来表示所有的数据类型成都传智播客教育例子publicclassDemo{ publicstaticvoidmain(String[]args){ Strings1="曾哥"; intage=17; floatpi=3.14F; charc='U'; System.out.printf("名字:%s,年龄:%d,PI=%f,字符:%c",s1,age,pi,c); System.out.printf("名字:%s,年龄:%s,PI=%s,字符:%s",s1,age,pi,c); }}成都传智播客教育管道流又称为线程通讯流,主要作用是可以进行两个线程之间的通讯:PipedOutputStream:管道输出流PipedInputStream:管道输入流PipedOutputStream中有方法:voidconnect(PipedInputStreampis)throwsIOException:用于连接管道PipedInputStream中有方法:voidconnect(PipedOutputStreampos)throwsIOException:用于连接管道成都传智播客教育管道流-发送端classSendimplementsRunnable{ privatePipedOutputStreampos=null; publicSend(){ pos=newPipedOutputStream(); } publicPipedOutputStreamgetPos(){ returnpos; } publicvoidrun(){ Strings=

"三千才俊听我激昂文章,八万豪杰读我侠骨柔肠"; pos.write(s.getBytes()); pos.close(); }}成都传智播客教育管道流-接收端classReceiveimplementsRunnable{ privatePipedInputStreampis=null; publicReceive(){ pis=newPipedInputStream(); } publicPipedInputStreamgetPis(){ returnpis; } publicvoidrun(){ byte[]bys=newbyte[1024];

intlen=pis.read(bys); pis.close(); System.out.println("-->"+newString(bys,0,len)); }}成都传智播客教育管道流-测试publicclassPipedDemo{ publicstaticvoidmain(String[]args){ Sendsend=newSend(); Receiverec=newReceive(); try{

send.getPos().connect(rec.getPis()); }catch(IOExceptione){ e.printStackTrace(); } newThread(send).start(); newThread(rec).start(); }}成都传智播客教育处理流节点流:可以从或向特定的地方读写数据。用于直接操作目标设备所对应的流类。节点流类所对应的IO源或目标称为流节点。处理流:对已存在的流的连接和封装,通过封装流的功能调用实现数据读写。处理流的构造方法总会带一个其他流对象作参数,一个流对象经过其他流的多次包装,称为流的链接。当使用处理流的时候,在关闭输入/输出资源时。只需要关闭上层流即可。因为当关闭上层流的时候系统会默认去关闭被处理的节点流。成都传智播客教育缓冲流缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写效率,同时增加了一些新的方法。四种缓冲流BufferedReader(Readerin)BufferedReader(Readerin,intsz)//sz表示自定义缓冲区大小BufferedWriter(Writerout)BufferedWriter(Writerout,intsz)BufferedInputStream(InputStreamin)BufferedInputStream(InputStreamin,intsz)BufferedOutputStream(OutputStreamout)BufferedOutputStream(OutputStreamout,intsz)成都传智播客教育缓冲流BufferedReader提供readLine方法用于读取一行字符串。BufferedWriter提供了newLine方法用于写入一个行分隔符。等价于//.writer("\r\n");对于输出的缓冲流,写出的数据会先在内存中缓冲,使用flush方法将会使内存中的数据立刻写出。成都传智播客教育例子publicstaticvoidmain(String[]args)

throwsException{ BufferedReaderbr=newBufferedReader(

newFileReader("春哥v5.txt")

); BufferedWriterbw=newBufferedWriter(

newFileWriter("AA.txt")

);

Stringline=null; while((line=br.readLine())!=null){//读一行 bw.write(line);//写一行 bw.newLine();//写完一行就换行 } bw.close(); br.close(); }成都传智播客教育转换流字节流---->字符流InputStreamReader字节输入流-->字符输入流OutputStreamWriter字节输出流-->字符输出流InputStreamReader需要和InputStream“套接”;OutputStreamWriter需要和OutputStream“套接”转换流在构造时可以指定其编码集合:InputStreamReaderin=newInputStreamReader(Sytem.in,"ISO8859_1");为了达到最高效率,可要考虑在BufferedReader内包装InputStreamReader。例如:BufferedReaderin=newBufferedReader(newInputStreamReader(System.in));成都传智播客教育例子1publicstaticvoidmain(String[]args){try{OutputStreamWriterosw=newOutputStreamWriter(

newFileOutputStream("path"));osw.write("mircosoftibmsunapplehp");System.out.println(osw.getEncoding());osw.close();osw=newOutputStreamWriter( newFileOutputStream("path",true), "ISO8859_1");//latin-1osw.write("mircosoftibmsunapplehp");System.out.println(osw.getEncoding());osw.close();}catch(IOExceptione){e.printStackTrace();}}成都传智播客教育例子2publicstaticvoidmain(Stringargs[]){InputStreamReaderisr=newInputStreamReader(System.in);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();}}成都传智播客教育数据操作流和平台无关的数据操作流:DataInputStream和DataOutputStream分别继承于InputStream和OutputStream,属于处理流,需要分别“套接”在InputStream和OutputStream类型的节点流上。DataInputStream和DataOutputStream提供了可以存储Java原始类型数据(如int,boolean等)的方法。构造方法:DataInputStream(InputStreamin)DataOutputStream(OutputStreamout);成都传智播客教育例子................main..................{

ByteArrayOutputStreambaos=

new

ByteArrayOutputStream();

DataOutputStreamdos=newDataOutputStream(baos);dos.writeDouble(Math.random());dos.writeBoolean(true);ByteArrayInputStreambais=newByteArrayInputStream(

baos.toByteArray()

);

DataInputStreamdis=newDataInputStream(bais);System.out.println(dis.readDouble());//随机数System.out.println(dis.readBoolean());//truedos.close();

dis.close();}成都传智播客教育合并流SequenceInputStream:将两个文件的内容合并成一个文件该类提供的方法:SequenceInputStream(InputStreams1,InputStreams2):根据两个字节输入流对象来创建合并流对象。成都传智播客教育合并流例子publicclassSequenceInputStreamDemo{ publicstaticvoidmain(String[]args){ Stringsrc1="d:/a.txt"; Stringsrc2="d:/b.txt"; Stringdest="d:/ab.txt";

try(

InputStreamis1=newFileInputStream(src1); InputStreamis2=newFileInputStream(src2); OutputStreamos=newFileOutputStream(dest); SequenceInputStreamsis=newSequenceInputStream(is1,is2);

){ byte[]bys=newbyte[1024]; intlen=0; while((len=sis.read(bys))!=-1){ os.write(bys,0,len); }

}catch(Exceptione){ e.printStackTrace();

} }}成都传智播客教育SystemJava的标准输入输出,分别通过System.in和System.out表示,默认情况下,他们分别表示键盘和屏幕。也就是说键盘输入,屏幕显示输出。System类里面有三个重定向标准输入/输出的方法:staticvoidsetErr(PrintStreamerr):重定向“标准”错误输出流”staticvoidsetIn(InputStreamin):重定向“标准"输入流”staticvoidsetOut(PrintStreamout):重定向“标准”输出流”成都传智播客教育例子1publicstaticvoidmain(String[]args){PrintStreamps=null;//打印流try{FileOutputStreamfos=newFileOutputStream("path");//字节文件输出流ps=newPrintStream(fos);//打印流包装输出流}catch(IOExceptione){e.printStackTrace();}

if(ps!=null){System.setOut(ps);//把系统输出重定向ps这个打印流}intln=0;for(charc=0;c<=100;c++){System.out.print(c+"");if(ln++>=100){System.out.println();ln=0;}}}成都传智播客教育标准输入例子publicstaticvoidmain(String[]args)throwsException{ FileInputStreamfis=null; fis=newFileInputStream("xx.java");

System.setIn(fis);//重定向 Scannersc=newScanner(System.in); sc.useDelimiter("\n");//以回车作为分隔符 while(sc.hasNext()){ System.out.println(sc.next()); } }成都传智播客教育例子2publicstaticvoidmain(String[]args){Strings=null;BufferedReaderbr=newBufferedReader(

newInputStreamReader(System.in));FileWriterfw=newFileWriter("filePath",true);PrintWriterlog=newPrintWriter(fw);while((s=br.readLine())!=null){if(s.equalsIgnoreCase("exit"))break;System.out.println(s.toUpperCase());log.println("-----");log.flush();}log.println("==="+newDate()+"===");log.flush();log.close();}成都传智播客教育字符编码常见的编码ISO8859-1,utf-8,Unicode,GBK,GB2312,GB18030;ISO8859-1又称Latin-1或“西欧语言”,属于单字节编码,最多只能表示0~255,英文系统中使用,不支持中文;gbk/gb2312/gb18030:中国的国际编码,专用来表示汉字,双字节编码,GBK表示中文简体和繁体,gb2312表示简体,GBK兼容gb2312。gb18030是GBK编码的增强版;unicode:java使用的此编码,也是最标准的一种编码,使用十六进制表示编码,但是不兼容ISO8859-1。UTF-8:由于unicode不支持lantin-1,且易占用更多空间,对于英文字母也需要两个字节编码,这样不便于传输和存储,此时UTF码就应运而生,它可表示所有语言文字。不过UTF是不定长编码,每个字符的长度从1-6字节不等,一般网页中使用该编码。字符串的编码:String--->byte[]字符串的解码:byte[]--->String乱码的产生:解码和编码不一致成都传智播客教育乱码编码:String--->byte[]解码:byte[]--->String乱码:解码和编码不一致程序中一定要处理好编码,否则会出现乱码。比如本机默认编码是GBK而在程序中使用了ISO8859-1编码,则会出现乱码。查看系统默认编码publicclassDemo{ publicstaticvoidmain(String[]args){ Propertiesp=System.getProperties(); //p.list(System.out); System.out.println(System.getProperty("file.encoding")); }}成都传智播客教育乱码publicclassDemo{ publicstaticvoidmain(String[]args)throwsException{ Stringstr="传智播客"; byte[]bys=str.getBytes("UTF-8"); Stringstr2=newString(bys); System.out.println(str2); }}成都传智播客教育对象序列化就是把对象变成二进制的数据流的一种方式,其目的可以方便的实现对象的传输或存储。若一个类的对象需要被序列化,其类就必须实现java.io.Serializable接口。成都传智播客教育对象系列化和反序列化若对对象输入输出,得使用对象操作流ObjectInputStream:对象输入流ObjectOutputStream:对象输出流使用对象操作流输出序列化对象过程:我们称为对象序列化,若不希望某个属性被序列化则用transient修饰属性若类中的自动式静态的,则不能被序列化;若类中某引用类型字段的类没有实现Serializable,该字段也是不能序列化的;使用对象操作流输入序列化对象过程:我们称为对象的反序列化在对象序列化和反序列化时需考虑JDK版本问题,我们一般注入serialVersionUID常量,当反序列化时,JVM会把传过来的字节流中的serialVersionUID与本地对应类的serialVersionUID相比较,若一致则可以反序列化,否则,抛出异常privatestaticfinallongserialVersionUID=1L;成都传智播客教育对象操作流-ObjectOutputStream用于输出对象常用方法:ObjectOutputStream(OutputStreamout)创建写入指定OutputStream的ObjectOutputStream对象。voidwriteObject(Objectobj)输出对象。publicstaticvoidmain(String[]args){ Stringpath="D:/obj.txt"; try(ObjectOutputStreamoos=newObjectOutputStream( newFileOutputStream(path));){ oos.writeObject(newStudent("will",99)); }catch(Exceptione){ e.printStackTrace(); }}成都传智播客教育对象操作流-ObjectInputStream把被序列化的对象给反序列化回来。常用方法:ObjectInputStream(InputStreamin)ObjectreadObject()读取对象。publicstaticvoidmain(String[]args){ Stringpath="D:/obj.txt"; try(ObjectInputStreamois=newObjectInputStream( newFileInputStream(path)); ){ Objecto=ois.readObject(); System.out.println(o); }catch(Exceptione){ e.printStackTrace(); }}成都传智播客教育压缩流我们经常使用WinRAR或WinZIP压缩文件,压缩后方便传输。Java中我们提供了专门的压缩流来将文件或文件夹压缩成jar,zip,gzip等格式。成都传智播客教育压缩流的实现压缩流的操作类都处于java.uti.zip中;在java中要实现zip的压缩需要使用包中的ZipFile,ZipOutputStream,ZipInputStream,ZipEntry类。jar和文件格式的压缩输入,输出流jar压缩输出流:JarOutputStreamjar压缩输入流:JarInputStreamjar文件:JARFilejar实体:JarEntrygzip用于unix系统的文件压缩,Linux中经常使用到*.gz就是gzip格式。GZIP压缩输出流:GZIPOutputStreamGZIP压缩输入流:GZIPInputStream成都传智播客教育ZipEntry&ZipOutputStreamZipEntry用于表示ZIP文件条目,也就是压缩文件中的每一个子文件。ZipEntry(Stringname)使用指定ZipEntry名称创建新的ZipEntry对象。booleanisDirectory()判断该ZipEntry是不是目录。ZipOutputStream用于完成一个文件或文件夹的压缩。ZipOutputStream(OutputStreamout)创建新的ZIP输出流voidputNextEntry(ZipEntrye)设置ZipEntry对象voidment(Stringcomment)设置ZIP文件注释。成都传智播客教育压缩zip格式文件例子publicclassZipOutputStreamDemo{ publicstaticvoidmain(String[]args){ Filef=newFile("temp.txt"); Filezf=newFile("temp.zip"); try( InputStreamis=newFileInputStream(f); ZipOutputStreamzos=newZipOutputStream( newFileOutputStream(zf) ); ){ zos.putNextEntry(newZipEntry(f.getName())); ment("I'mcditcast"); intlen=0; byte[]bys=newbyte[1024]; while((len=is.read(bys))!=-1){ zos.write(bys,0,len); } }catch(Exceptione){} }}成都传智播客教育作业练习压缩一个带有子文件的文件夹成都传智播客教育作业privatestaticvoidpression(Filef,ZipOutputStreamzos){if(f.isDirectory()){ File[]fs=f.listFiles(); for(Filefile:fs){ if(file.isFile()){ try(InputStreamis=newF

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论