Java字节流操作
来源:互联网 发布:mac秋冬色号推荐 编辑:程序博客网 时间:2024/05/16 23:42
1)InputStream、OutputStream
InputStream抽象了应用程序读取数据的方式
OutputStream抽象了应用程序写出数据的方式
2)EOF = End 读到-1就读到结尾
3)输入流基本方法
int b = in.read();读取一个字节无符号填充到int低八位.-1是 EOF
in.read(byte[] buf)
out.write(int b) 写出一个byte到流,b的低8位
6)FileOutputStream 实现了向文件中写出byte数据的方法
7)DataOutputStream/DataInputStream
对"流"功能的扩展,可以更加方面的读取int,long,字符等类型数据
DataOutputStream
writeInt()/writeDouble()/writeUTF()
DataInputStream:
这两个流类位IO提供了带缓冲区的操作,一般打开文件进行写入
或读取操作时,都会加上缓冲,这种流模式提高了IO的性能
从应用程序中把输入放入文件,相当于将一缸水倒入到另一个缸中:
FileOutputStream--->write()方法相当于一滴一滴地把水“转移”过去
DataOutputStream-->writeXxx()方法会方便一些,相当于一瓢一瓢把水“转移”过去
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)
第一种方式:
/** * 读取指定文件内容,按照16进制输出到控制台 * 并且每输出10个byte换行 * @param fileName * 单字节读取不适合大文件,大文件效率很低 */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){//单位数前面补0System.out.print("0");}System.out.print(Integer.toHexString(b)+" ");if(i++%10==0){System.out.println();}}in.close();}
public static void main(String[] args) {try {IOUtil.printHex("e:\\javaio\\FileUtils.java");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}第二种方式:
/** * 批量读取,对大文件而言效率高,也是我们最常用的读文件的方式 * @param fileName * @throws IOException */public static void printHexByByteArray(String fileName)throws IOException{FileInputStream in = new FileInputStream(fileName);byte[] buf = new byte[8 * 1024];/*从in中批量读取字节,放入到buf这个字节数组中, * 从第0个位置开始放,最多放buf.length个 * 返回的是读到的字节的个数*///第一种方式:/*int bytes = in.read(buf,0,buf.length);//一次性读完,说明字节数组足够大int j = 1; for(int i = 0; i < bytes;i++){System.out.print(Integer.toHexString(buf[i] & 0xff)+" ");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) {// TODO Auto-generated method stubtry {IOUtil.printHexByByteArray("e:\\javaio\\1.mp3");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}4)输出流基本方法
out.write(int b) 写出一个byte到流,b的低8位
out.write(byte[] buf)将buf字节数组都写入到流
out.write(byte[] buf,int start,int size)
例:
public static void main(String[] args) throws IOException {// TODO Auto-generated method stub//如果该文件不存在,则直接创建,如果存在,删除后创建FileOutputStream out = new FileOutputStream("demo/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();printHex("demo/out.dat");}
/** * 文件拷贝,字节批量读取 * @param srcFile * @param destFile * @throws IOException */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) {// TODO Auto-generated method stubtry {IOUtil.copyFile(new File("e:\\javaio\\imooc.txt"), new File("e:\\javaio\\imooc1.txt"));} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}5)FileInputStream--->具体实现了在文件上读取数据
6)FileOutputStream 实现了向文件中写出byte数据的方法
7)DataOutputStream/DataInputStream
对"流"功能的扩展,可以更加方面的读取int,long,字符等类型数据
DataOutputStream
writeInt()/writeDouble()/writeUTF()
DataOutputStream:
public static void main(String[] args) throws IOException {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);}
DataInputStream:
public static void main(String[] args) throws IOException{// TODO Auto-generated method stubString file = "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();}8)BufferedInputStream&BufferedOutputStream
这两个流类位IO提供了带缓冲区的操作,一般打开文件进行写入
或读取操作时,都会加上缓冲,这种流模式提高了IO的性能
从应用程序中把输入放入文件,相当于将一缸水倒入到另一个缸中:
FileOutputStream--->write()方法相当于一滴一滴地把水“转移”过去
DataOutputStream-->writeXxx()方法会方便一些,相当于一瓢一瓢把水“转移”过去
BufferedOutputStream--->write方法更方便,相当于一飘一瓢先放入桶中,再从桶中倒入到另一个缸中,性能提高了
例子:
/** * 进行文件的拷贝,利用带缓冲的字节流 * @param srcFile * @param destFile * @throws IOException */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();}/** * 单字节,不带缓冲进行文件拷贝 * @param srcFile * @param destFile * @throws IOException */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) {// TODO Auto-generated method stubtry {long start = System.currentTimeMillis();/*IOUtil.copyFileByByte(new File("e:\\javaio\\1.mp3"), new File("e:\\javaio\\2.mp3"));*/ //两万多毫秒/*IOUtil.copyFileByBuffer(new File("e:\\javaio\\1.mp3"), new File("e:\\javaio\\3.mp3"));//一万多毫秒*/IOUtil.copyFile(new File("e:\\javaio\\1.mp3"), new File("e:\\javaio\\4.mp3"));//7毫秒long end = System.currentTimeMillis();System.out.println(end - start );} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
阅读全文
0 0
- Java字节流操作
- Java 字节流操作
- Java字节流操作
- java字节数组流操作
- java字节流字符流IO操作
- Java IO 字节流 字符流操作
- Java IO操作与字节流
- Java IO 操作与字节流
- JAVA I / O操作与字节流
- java文件读写操作-字节流
- Java基础回顾 : 字节流操作
- java中字节输入输出流操作详解
- Java 文件与字节流操作
- java IO 字节流 字符流流操作
- java字节码操作
- Java字节码操作
- java学习7--Java I/O 操作与字节流
- 【java工具类】字节操作
- 如何基于Spark做深度学习:从Mllib到keras,elephas
- MarkDown基本语法小结
- JEECMS导入IDEA进行二次开发图文教程
- 什么是流量劫持?
- php扩展memcached和memcache的安装配置方法
- Java字节流操作
- mysql 与 JDBC
- HashMap原理,以及HashMap的非线程安全
- 绘图和可视化 《利用Python进行数据分析》第8章 读书笔记
- ES6 变量解构赋值的用途
- 5.13 JLL实习经历--总结--不断更新ing
- php,javscript调用百地图度API实现标记
- jQuery扩展插件——$.extend(obj)与$.fn.extend(obj)
- TortoiseGit--小乌龟git项目中的使用简介