三字节流的使用
6)FileOutputStream--->实现了向文件中写出byte数据的方法
FileOutputStream继承了OutputStream抽象类。
FileOutputStream类中的方法:
实例代码1:
<span style="font-size:18px;">import java.io.*; public class FileOutDemo1{ public static void main(String[] args) throws IOException { //如果该文件不存在,则直接创建,如果存在,删除后创建 FileOutputStream out = new FileOutputStream("E:\\Java\\JavaSE\\IO\\out.dat"); out.write('A');//写出了'A'的低八位 out.write('B');//写出了'B'的低八位 int a = 10;//write只能写八位,那么写一个int需要些写4次,每次8位 out.write(a >>> 24); out.write(a >>> 16); out.write(a >>> 8); out.write(a); byte[] gbk = "中国".getBytes("gbk"); out.write(gbk); out.close(); IOUtil.printHex("E:\\Java\\JavaSE\\IO\\out.dat"); } }</span>
运行结果:
文件拷贝
实例代码2:
<span style="font-size:18px;">import java.io.*; public class IOUtil{ /* * 文件拷贝,字节批量读取 */ public static void copyFile(File srcFile,File destFile) throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("文件:"+srcFile+"不存在"); } if(!srcFile.isFile()){ throw new IllegalArgumentException(srcFile+"不是文件"); } FileInputStream in = new FileInputStream(srcFile); FileOutputStream out = new FileOutputStream(destFile); byte[] buf = new byte[8*1024]; int b ; while((b = in.read(buf,0,buf.length))!=-1){ out.write(buf,0,b); out.flush();//最好加上 } in.close(); out.close(); } public static void main(String[] args) { try{ IOUtil.copyFile(new File("E:\\Java\\JavaSE\\IO\\test.txt"), new File("E:\\Java\\JavaSE\\IO\\test1.txt")); }catch(IOException e) { e.printStackTrace(); } } }</span>
运行结果:
7)DataOutputStream类/DataInputStream类
对"流"功能的扩展,可以更加方面的读取int、long、字符等类型数据。此类体现了设计模式中的装饰模式。
DataInputStream类中常用的方法:
DataOutputStream类中常用的方法:
实例1:
import java.io.*; public class DisDemo{ public static void main(String[] args) throws IOException{ String file = "E:\\Java\\JavaSE\\IO\\demo\\dos.dat"; IOUtil.printHex(file); DataInputStream dis = new DataInputStream(new FileInputStream(file)); int i = dis.readInt(); System.out.println(i); i = dis.readInt(); System.out.println(i); long l = dis.readLong(); System.out.println(l); double d = dis.readDouble(); System.out.println(d); String s = dis.readUTF(); System.out.println(s); dis.close(); } }
运行结果:
实例2:
import java.io.*; public class DosDemo{ public static void main(String[] args) throws IOException { String file = "E:\\Java\\JavaSE\\IO\\demo\\dos.dat"; DataOutputStream dos = new DataOutputStream(new FileOutputStream(file)); dos.writeInt(10); dos.writeInt(-10); dos.writeLong(10l); dos.writeDouble(10.5); //采用utf-8编码写出 dos.writeUTF("中国"); //采用utf-16be编码写出 dos.writeChars("中国"); dos.close(); IOUtil.printHex(file); } }
运行结果:
8)BufferedInputStream类/BufferedOutputStream类
这两个流类为IO提供了带缓冲区的操作,一般打开文件进行写入;或读取操作时,都会加上缓冲,这种流模式提
高了IO的性能从应用程序中把输入放入文件,相当于将一缸水倒入到另一个缸中。
BufferedInputStream类的方法:
BufferedOutputStream类的方法:
FileOutputStream--->write()方法相当于一滴一滴地把水“转移”过去。
DataOutputStream-->writeXxx()方法会方便一些,相当于一瓢一瓢把水“转移”过去。
BufferedOutputStream--->write方法更方便,相当于一飘一瓢先放入桶中,再从桶中倒入到另一个缸中,性能提
高了。
实例代码:
import java.io.*; public class IOUtil{ /* * 文件拷贝,字节批量读取 */ public static void copyFile(File srcFile,File destFile) throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("文件:"+srcFile+"不存在"); } if(!srcFile.isFile()){ throw new IllegalArgumentException(srcFile+"不是文件"); } FileInputStream in = new FileInputStream(srcFile); FileOutputStream out = new FileOutputStream(destFile); byte[] buf = new byte[8*1024]; int b ; while((b = in.read(buf,0,buf.length))!=-1){ out.write(buf,0,b); out.flush();//最好加上 } in.close(); out.close(); } /* * 进行文件的拷贝,利用带缓冲的字节流 */ public static void copyFileByBuffer(File srcFile,File destFile) throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("文件:"+srcFile+"不存在"); } if(!srcFile.isFile()){ throw new IllegalArgumentException(srcFile+"不是文件"); } BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile)); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile)); int c ; while((c = bis.read())!=-1){ bos.write(c); bos.flush();//刷新缓冲区 } bis.close(); bos.close(); } /* * 单字节,不带缓冲进行文件拷贝 */ public static void copyFileByByte(File srcFile,File destFile)throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("文件:"+srcFile+"不存在"); } if(!srcFile.isFile()){ throw new IllegalArgumentException(srcFile+"不是文件"); } FileInputStream in = new FileInputStream(srcFile); FileOutputStream out = new FileOutputStream(destFile); int c; while((c = in.read())!=-1){ out.write(c); out.flush(); } in.close(); out.close(); } public static void main(String[] args) { try{ //三种方法读取写入的时间不一样 IOUtil.copyFileByBuffer(new File("E:\\Java\\JavaSE\\IO\\FileUtils.java"),newFile( "E:\\Java\\JavaSE\\IO\\aa.txt")); IOUtil.copyFileByByte(new File("E:\\Java\\JavaSE\\IO\\FileUtils.java"), new File( "E:\\Java\\JavaSE\\IO\\bb.txt")); IOUtil.copyFile(new File("E:\\Java\\JavaSE\\IO\\FileUtils.java"), new File( "E:\\Java\\JavaSE\\IO\\cc.txt")); }catch(IOException e) { e.printStackTrace(); } } }
运行结果:
测试拷贝时间:
import java.io.*; public class IOUtil{ /* * 文件拷贝,字节批量读取 */ public static void copyFile(File srcFile,File destFile) throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("文件:"+srcFile+"不存在"); } if(!srcFile.isFile()){ throw new IllegalArgumentException(srcFile+"不是文件"); } FileInputStream in = new FileInputStream(srcFile); FileOutputStream out = new FileOutputStream(destFile); byte[] buf = new byte[8*1024]; int b ; while((b = in.read(buf,0,buf.length))!=-1){ out.write(buf,0,b); out.flush();//最好加上 } in.close(); out.close(); } /* * 进行文件的拷贝,利用带缓冲的字节流 */ public static void copyFileByBuffer(File srcFile,File destFile) throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("文件:"+srcFile+"不存在"); } if(!srcFile.isFile()){ throw new IllegalArgumentException(srcFile+"不是文件"); } BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile)); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile)); int c ; while((c = bis.read())!=-1){ bos.write(c); bos.flush();//刷新缓冲区 } bis.close(); bos.close(); } /* * 单字节,不带缓冲进行文件拷贝 */ public static void copyFileByByte(File srcFile,File destFile)throws IOException{ if(!srcFile.exists()){ throw new IllegalArgumentException("文件:"+srcFile+"不存在"); } if(!srcFile.isFile()){ throw new IllegalArgumentException(srcFile+"不是文件"); } FileInputStream in = new FileInputStream(srcFile); FileOutputStream out = new FileOutputStream(destFile); int c ; while((c = in.read())!=-1){ out.write(c); out.flush(); } in.close(); out.close(); } public static void main(String[] args) { try{ long start=System.currentTimeMillis(); //IOUtil.copyFileByByte(new File("E:\\Java\\JavaSE\\IO\\1.mp3"), new File( // "E:\\Java\\JavaSE\\IO\\2.mp3"));//测试的为95042毫秒,最慢 //IOUtil.copyFileByBuffer(new File("E:\\Java\\JavaSE\\IO\\1.mp3"), new File( // "E:\\Java\\JavaSE\\IO\\3.mp3"));//测试的为4799毫秒,中等速度 IOUtil.copyFile(new File("E:\\Java\\JavaSE\\IO\\1.mp3"), new File( "E:\\Java\\JavaSE\\IO\\4.mp3"));//测试的为60毫秒,最快 long end=start=System.currentTimeMillis(); System.out.println(end-start); }catch(IOException e) { e.printStackTrace(); } } }
运行结果:
时间: 2024-11-05 22:47:03