java io byte_JavaIO之字节流学习笔记

一、文件输入/输出流

文件输入流FileInputStream具体实现了在文件上读取数据,文件输出流FileOutputStream实现了向文件中写出byte数据。

1.1 FileInputStream

in.read() 按单字节读取数据

in.read(byte[] buf,int start,int size) 从字节数组buf中start处开始读取数据,长度为size

1、单字节读取数据,并将结果输出到控制台上,每10个byte进行换行

实现步骤:

(1)将文件作为字节流进行读操作

(2)使用单字节进行循环读取,每10个字节进行换行操作

public static void printHex(String fileName) throws IOException{

FileInputStream in = new FileInputStream(fileName);

int b; //用于判断文件是否读到结尾处

int i = 1;//用于计数,每10个字节换行

while((b=in.read()) != -1){

if(b<0xf){ //单字节前面补0

System.out.print("0");

}

System.out.print(Integer.toHexString(b)+" ");

if(i++%10 == 0){

System.out.println();

}

}

in.close();

}

2、对上例进行批量读取,此方法适合大文件,效率高

public static void printHexByByte(String fileName)throws IOException{

FileInputStream in = new FileInputStream(fileName);

byte[] buf = new byte[20*1024];

//由于可能数组不够,也可能数组过大,下面的语句返回的是读到的字节个数,不会多读余下的空也不会超出

int bytes = in.read(buf,0,buf.length);//一次性读完

int j = 1;

for(int i=0;i

if(buf[i]<=0xf){

System.out.print("0");

}

System.out.print(Integer.toHexString(buf[i])+" ");

if(j++%10 == 0){

System.out.println();

}

}

in.close();

}

1.2 FileOutputStream

out.write(int b) 写出数据

out.write(byte[] buf,int start,int size) 从start处开始写出buf中的字节,长度为size

写出数据的示例代码如下所示:

public static void main(String[] args)throws IOException {

//如果文件不存在则直接创建,否则删除后创建

FileOutputStream out = new FileOutputStream("demo/out.dat");

//如果文件不存在则直接创建,否则在原文件后追加内容

//FileOutputStream out1 = new FileOutputStream("demo/out.dat",true);

int a = 10;

out.write(a>>>24);

out.write(a>>>16);

out.write(a>>>8);

out.write(a);

byte[] s = "中国".getBytes();

out.write(s);

out.close();

}

1.3 代码:文件复制功能的实现

实现步骤:

1、先对参数进行判断,源文件是否存在且是否是文件;

2、构造文件输入输出流

3、使用批量读取的形式对源文件进行读取,然后写入到目标文件中

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

}

in.close();

out.close();

}

二、数据输入/输出流

数据输入/输出流(DataInputStream/DataOutputStream)是对“流”功能的扩展,可以更加方便的进行基础数据类型的读写操作。其主要方法及使用如下代码所示。

String file = "demo/dos.dat";

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

dos.writeInt(-27);

dos.writeDouble(89.06);

dos.writeLong(2000l);

dos.writeUTF("中国");//以UTF-8编码格式写进文件

dos.writeChars("中国");//以utf-16be格式写进文件

dos.close();

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

int i = dis.readInt();

System.out.println(i);

double d = dis.readDouble();

System.out.println(d);

long l = dis.readLong();

System.out.println(l);

System.out.println(dis.readUTF());

System.out.println(dis.read());

dis.close();

三、字节缓冲流

字节缓冲流(BufferedInputStream/BufferedOutputStream)为IO提供了带缓冲区的操作,提高了IO性能。下面使用字节缓冲流进行文件拷贝操作,代码如下。此方法的效率没有批量读取的高,但比单字节读取更快。

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

}

注:文章根据本站相关课程的学习笔记整理而来,有错误或其他任何问题敬请指正,欢迎共同学习交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值