Java学习笔记(2)——字节流

本文深入讲解Java中的IO流概念及其实现方式,包括字节流的读写操作、FileInputStream与FileOutputStream的具体应用,以及DataInputStream和DataOutputStream如何简化不同类型数据的读写过程。
1.字节流
1)InputStream、OutputStream
InputStream抽象了应用程序读取数据的方式
OutputStream抽象了应用程序写出数据的方式
2)EOF = End  读到-1就读到结尾


3)输入流:(如键盘)基本方法
int b = in.read();  读取一个字节无符号填充到int低八位.-1是EOF
in.read(byte[] buf) 读取数据填充到字节数组buf
in.read(byte[] buf, int start, int size) 读取数据到字节数组buf,从buf的start位置开始存放size长度的数据
4)输出流基本方法
out.write(int b) 写出一个byte到流,b的低8位
out.write(byte[] buf) 将字节数组都写入到流
out.write(byte[] buf, int start, int size) 字节数组buf从start位置开始写size长度的字节到流


5)FileInputStream --->具体实现了在文件上读取数据
6)FileOutputStream 实现了向文件中写出byte数据的方法


7)DataOutputStream/DataInputStream
对“流”功能的扩展,可以更加方便地读取int,long,字符等类型的数据
DataOutputStream

writeInt()/writeDouble()/writeUTF()


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class IOUtil {
	//读取指定文件内容,按照16进制输出到控制台,每输出10个byte换行
	public static void printHex(String fileName) throws IOException{
		//把文件作为字节流进行读操作
		FileInputStream in = new FileInputStream(fileName);
		int b;
		int i = 1;
		while((b = in.read()) != -1){
			if (b <= 0xf){
				//单位数前面补0
				System.out.print(0);
			}
			System.out.print(Integer.toHexString(b) + " "); //将整形b转换为16进制表示的字符串
			if (i++ % 10 == 0){
				System.out.println();
			}
		}
		in.close();
		System.out.println();
	}
	public static void printHexByByteArray(String fileName) throws IOException{
		FileInputStream in = new FileInputStream(fileName);
		byte[] buf = new byte[20 * 1024];
		//从in中批量读取字节,放入到buf这个字节数组中,从第0个位置开始放,最多放buf.length个,
		//返回的是读到字节的个数
		/*int bytes = in.read(buf, 0, buf.length); //一次性读完,说明字节数组足够大
		int j = 1;
		for (int i = 0; i < bytes; i++){
			if (buf[i] <= 0xf){
				System.out.print(0);
			}
			System.out.print(Integer.toHexString(buf[i]) + " ");
			if (j++ % 10 == 0)
				System.out.println();
		} */

		int bytes = 0;
		int j = 1;
		while((bytes = in.read(buf, 0, buf.length)) != -1){
			for (int i = 0; i < bytes; i++){
				System.out.print(Integer.toHexString(buf[i] & 0xff) + " ");
				if (j++ % 10 == 0)
					System.out.println();
			}
		}
		in.close(); 
	}
	public static void main(String[] args) {
		try {
			long start1 = System.currentTimeMillis();
			IOUtil.printHex("e:\\仙剑联盟盟歌.txt");  //单字节读取
			long end1 = System.currentTimeMillis();
			System.out.println();
			System.out.println(end1 - start1);
			
			long start = System.currentTimeMillis();
			IOUtil.printHexByByteArray("e:\\仙剑联盟盟歌.txt");  //批量文件读取
			long end = System.currentTimeMillis();
			System.out.println();
			System.out.println(end - start);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			long start = System.currentTimeMillis();
			IOUtil.copyFile(new File("e:\\仙剑联盟盟歌.txt"), new File("e:\\联盟盟歌.txt"));
			long end = System.currentTimeMillis();
			System.out.println();
			System.out.println(end - start);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}		
	//文件的拷贝操作
	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();
	}
}

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutDemo {

	public static void main(String[] args) throws IOException {
		//如果该文件不存在,则直接创建,如果存在,删除后创建;后面再加一个参数true时,如果存在不删除在后面追加内容
		FileOutputStream out = new FileOutputStream("e:\\仙剑联盟.txt");
		out.write('A'); //写出了'A'的低八位
		out.write('B');
		int a = 10;
		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:\\仙剑联盟.txt");
	}

}

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DosDemo {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		String file = "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);
	}

}


import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class DisDemo {

	public static void main(String[] args) throws IOException {
		String file = "demo/dos.dat";
		IOUtil.printHex(file);
		DataInputStream dis = new DataInputStream(new FileInputStream(file));
		int 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();
	}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值