字节流
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);//将buf字节数组写入流
out.write(byte[] buf,int start,int size);//字节数组buf从start位置开始写size个长度的字节到流
5)FileInputStream----->具体实现在文件上的读取
6)FileOutputStream 实现了向文件中写出byte数据的方法
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) + " "); if(i++%10 == 0) System.out.println();; } in.close(); } 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);//一次性读完,说明字节数组足够大 for(int i = 0;i < bytes;i++){ //如果buf[i]>=0并且buf[i]<=15,前面添0 if(buf[i] <=0xf &&buf[i] >=0) System.out.print("0"); //&0xff,byte类型8位,int类型32位,为了避免数据转换错误,通过0xff将int的高24位清零 System.out.print(Integer.toHexString(buf[i]&0xff)+" "); if((i+1)%10==0) System.out.println(); } in.close(); } public static void copyFile(File srcFile,File deskFile) 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(deskFile); byte[] buf = new byte[8 * 1024]; int b; while((b = in.read(buf,0,buf.length))!=-1){ out.write(buf, 0, b); out.flush();//最好加上 } out.close(); in.close(); } }
import java.io.FileOutputStream; import java.io.IOException; public class FileOutDemo { public static void main(String[] args) throws IOException { //如果文件不存在,则直接创建;如果文件存在,则删除后创建 FileOutputStream out =new FileOutputStream("demo/out.dat"); out.write('A');//写出了A的低8位 out.write('B');//写出了B的低8位 int b = 10;//write只能写8位,如果要写出一个整数,则需要写4次,每次8位 out.write(b >>> 24); out.write(b >>> 16); out.write(b >>> 8); out.write(b); byte[] gbk = "中国".getBytes("gbk"); out.write(gbk); out.close(); IOUtil.printHex("demo/out.dat"); } }
import java.io.File; import java.io.IOException; public class IOUtilTest { public static void main(String[] args) { try { long start = System.currentTimeMillis(); //IOUtil.printHex("e:\\javaio\\日记.txt"); //IOUtil.printHexByByteArray("e:\\javaio\\日记.txt"); IOUtil.copyFile(new File("e:\\javaio\\日记.txt"), new File("e:\\javaio\\日记1.txt")); System.out.println(); long end = System.currentTimeMillis(); System.out.println(end-start); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } } }