java 字符流 utf8_Java------字符流和字节流(II)

java字节流实现文件夹的拷贝:

package com.java.io;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

/**

java字节流实现文件夹的拷贝

拷贝文件夹,其中文件夹中又有多个文件

1.先遍历这个文件夹,判断是否是目录

2.创建文件夹

3.拷贝文件到新的地方

*/

public class FileDirectoryCopyDemo {

//遍历文件夹

public static void copy(File srcDir,File destDir){

//遍历srcDir文件夹

File[] list=srcDir.listFiles();

for(File f:list){

//先判断是否是目录,在目录文件夹里创建一个子目录

if(f.isDirectory()){

String name=f.getName(); //获取目录的名字

//调用方法去目录文件夹里创建子目录

File newDestDir=makeDir(destDir,name);

//递归

copy(f,newDestDir);

}else{

//如果不是目录,就拷贝文件

File dest=new File(destDir,f.getName());

fileCopy(f,dest);

}

}

}

public static File makeDir(File parent,String name){

File f=new File(parent,name);

f.mkdir();//创建文件夹

return f;

}

//文件拷贝函数

public static void fileCopy(File src,File dest){

InputStream in=null; //输入流,负责读文件

OutputStream out=null; //输出流,负责写入文件

try{

in=new FileInputStream(src);

out=new FileOutputStream(dest);

long start=System.currentTimeMillis();

//定义缓冲区

byte[] buffer=new byte[1024];

int len=-1;

while((len=in.read(buffer))!=-1)//说明还没有读到文件的结尾

{

out.write(buffer,0,len); //输出流写入一个字节

}

long end=System.currentTimeMillis();

//文件夹下有几个文件就耗时几次

System.out.println("拷贝文件耗时:"+(end-start)+"毫秒");

}catch(Exception e){

e.printStackTrace();

}finally{

try {

in.close();

out.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

//拷贝之前的原文件

File src=new File("D:"+File.separator+"haha");

//拷贝之后的文件

File dest=new File("F:"+File.separator+"haha");

if(!dest.exists()){

dest.mkdir(); //创建文件夹

}

copy(src,dest);

}

}

缓冲区:内存里的一块区域,与用来存放临时数据

DataInputStream:可以读写java基本的数据类型

public static void main(String[] args) {

// TODO Auto-generated method stub

String name="张三丰";

int number=100;

double price=12.5;

boolean flag=true;

float f=78.34f;

char c='a';

//使用DataOutputStream 把以上变量保存到一个文件里去 d:\mydata.dat

File file=new File("D:"+File.separator+"mydata.dat");

//mydata.dat是二进制文件,不是文本文件

DataOutputStream dout=null;

DataInputStream din=null;

try{

if(!file.exists()){

file.createNewFile();

}

//把数据保存到文件里

dout=new DataOutputStream(new FileOutputStream(file));

dout.writeUTF(name);//写入一个字符串

dout.writeInt(number);

dout.writeChar(c);

dout.writeDouble(price);

dout.writeFloat(f);

dout.writeBoolean(flag);

//再使用DataInputStream,把文件的数据读取出来

din=new DataInputStream(new FileInputStream(file));

//读的次序要和写的次序一致

System.out.println(din.readUTF()); //读出

System.out.println(din.readInt());

System.out.println(din.readChar());

System.out.println(din.readDouble());

System.out.println(din.readFloat());

System.out.println(din.readBoolean());

}catch(Exception e){

e.printStackTrace();

}

}

序列化与基本类型序列化

1)将类型int 转换成4byte或将其他数据类型转换成byte的过程叫序列化

数据---->n byte

2)反序列化

将n个byte 转换成一个数据的过程

nbyte ---> 数据

3)RandomAccessFile提供基本类型的读写方法,可以将基本类型数据

序列化到文件或者将文件内容反序列化为数据

IO流(输入流、输出流)

字节流、字符流

1.字节流

1)InputStream、OutputStream

InputStream抽象了应用程序读取数据的方式

OutputStream抽象了应用程序写出数据的方式

2)EOF = End 读到-1就读到结尾

3)输入流基本方法

int b = in.read();读取一个字节无符号填充到int低八位.-1是 EOF

in.read(byte[] buf)

in.read(byte[] buf,int start,int size)

4)输出流基本方法

out.write(int b) 写出一个byte到流,b的低8位

out.write(byte[] buf)将buf字节数组都写入到流

out.write(byte[] buf,int start,int size)

5)FileInputStream--->具体实现了在文件上读取数据

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

7)DataOutputStream/DataInputStream

对"流"功能的扩展,可以更加方面的读取int,long,字符等类型数据

DataOutputStream

writeInt()/writeDouble()/writeUTF()

8)BufferedInputStream&BufferedOutputStream

这两个流类位IO提供了带缓冲区的操作,一般打开文件进行写入

或读取操作时,都会加上缓冲,这种流模式提高了IO的性能

从应用程序中把输入放入文件,相当于将一缸水倒入到另一个缸中:

FileOutputStream--->write()方法相当于一滴一滴地把水“转移”过去

DataOutputStream-->writeXxx()方法会方便一些,相当于一瓢一瓢把水“转移”过去

BufferedOutputStream--->write方法更方便,相当于一飘一瓢先放入桶中,再从桶中倒入到另一个缸中,性能提高了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值