JavaSE入门学习44:文件传输基础之I/O流(三)

时间:2023-02-15 00:21:29

三字节流的使用

       6)FileOutputStream--->实现了向文件中写出byte数据的方法

       FileOutputStream继承了OutputStream抽象类。

       FileOutputStream类中的方法:

JavaSE入门学习44:文件传输基础之I/O流(三)

       实例代码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>

       运行结果:

JavaSE入门学习44:文件传输基础之I/O流(三)

       文件拷贝

       实例代码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>

       运行结果:

JavaSE入门学习44:文件传输基础之I/O流(三)

       

       7)DataOutputStream类/DataInputStream类

       对"流"功能的扩展,可以更加方面的读取int、long、字符等类型数据。此类体现了设计模式中的装饰模式。

       DataInputStream类中常用的方法:

JavaSE入门学习44:文件传输基础之I/O流(三)

JavaSE入门学习44:文件传输基础之I/O流(三)

       DataOutputStream类中常用的方法:

JavaSE入门学习44:文件传输基础之I/O流(三)

JavaSE入门学习44:文件传输基础之I/O流(三)

         实例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();
}
}

       运行结果:

JavaSE入门学习44:文件传输基础之I/O流(三)

         实例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);
}
}

       运行结果:

JavaSE入门学习44:文件传输基础之I/O流(三)

       8)BufferedInputStream类/BufferedOutputStream类

       这两个流类为IO提供了带缓冲区的操作,一般打开文件进行写入;或读取操作时,都会加上缓冲,这种流模式提

高了IO的性能从应用程序中把输入放入文件,相当于将一缸水倒入到另一个缸中。

       BufferedInputStream类的方法:

JavaSE入门学习44:文件传输基础之I/O流(三)

       BufferedOutputStream类的方法:

JavaSE入门学习44:文件传输基础之I/O流(三)

       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();
}
}
}

      运行结果:

JavaSE入门学习44:文件传输基础之I/O流(三)

       测试拷贝时间:

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();
}
}
}

      运行结果:

JavaSE入门学习44:文件传输基础之I/O流(三)

JavaSE入门学习44:文件传输基础之I/O流(三)