java i/o流(5) 字节流、字符流的操作
来源:互联网 发布:sql server distinct 编辑:程序博客网 时间:2024/05/20 02:25
package cn.itstudy.files;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;/** * I/O流(输入流、输出流) * 字节流、字符流 * 1、InputStream、OutputStream * InputStream抽象了应用程序读取数据的方式 * OutputStream抽象了应用程序写出数据的方式 * 2、EOF = End 读到-1就读到结尾 * 3、输入流(键盘是输入是用来读的)基本方法 * int b = in.read();读取一个字节无符号填充到int低8位,-1是EOF * in.read(byte[] buf)读取数据填充到字节数组buf * in.read(byte[] buf,int start,int size)读取数据到字节数组buf, * 从buf的start位置开始存放size长度的数据 * 4、输出流的基本方法(是用来写的) * out.write(int b)一个整型是32位,写出一个byte到流,b的低8位 * out.write(byte[] buf)将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() * * @author Amy * */public class StreamUtils { /** * 读取指定文件内容,按照16进制输出到控制台 * 并且每输出10个byte换行 * @param fileName * 单字节读取不适合大文件,大文件效率很低 */ //所有的I/O都会有IOException public static void printHex(String fileName) throws IOException{ //首先构造FileInputStream对象 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(); } /** * 批量读取,对大文件而已效率高,也是最常用的文件读取方式 * @param fileName * @throws IOException */ public static void printHexByByteArray(String fileName) throws IOException{ FileInputStream in = new FileInputStream(fileName); byte[] buf = new byte[6*1024]; //20K的大小 /*从in中批量读取字节,放入到buf这个字节数组中,从第0个位置开始放,最多放buf.length个 *返回的是读到的字节的个数 *两种情况1)读不满 2)放不下 */ /*int bytes = in.read(buf,0,buf.length); //一次性读完,说明字节数组足够大 int j = 1; for(int i = 0;i < bytes;i++){ if(buf[i] <= 0xf){ System.out.println("0"); //位数不足用0来补 } System.out.print(Integer.toHexString(buf[i])+" "); if(j++%10 == 0){ System.out.println(); } } */ //当字节数组不够大,一次性读不完文件时该怎么办? int bytes1 = 0; int m = 1; while((bytes1 = in.read(buf,0,buf.length))!=-1){ for(int i = 0;i < bytes1;i++){ System.out.print(Integer.toHexString(buf[i]&0xff)+" "); //byte类型是8位,int类型是32位,为了避免数据类型转换错误,通过&0xff将高24位清零 if(m++%10 == 0){ System.out.println(); } } } } /** * 对文件进行拷贝 * @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(); }}
测试代码1:
(把之前的文件通过十六进制输出)
package cn.itstudy.fileTest;import java.io.IOException;import cn.itstudy.files.StreamUtils;public class StreamUtilsTest1 { public static void main(String[] args) { try { StreamUtils.printHex("e:\\javaio\\FileUtils.java"); } catch (IOException e) { e.printStackTrace(); } }}
测试代码2:
(查看文件,当文件很大的时候,可以体现出来时间上的差别)
package cn.itstudy.fileTest;import java.io.IOException;import cn.itstudy.files.StreamUtils;public class StreamUtilsTest2 { public static void main(String[] args) { try { long start = System.currentTimeMillis(); StreamUtils.printHexByByteArray("e:\\javaio\\FileUtils.java"); long end = System.currentTimeMillis(); System.out.println(); System.out.println("========="+(end-start)); } catch (IOException e) { e.printStackTrace(); } }}
测试代码3:
(文件复制)
package cn.itstudy.fileTest;import java.io.File;import java.io.IOException;import cn.itstudy.files.StreamUtils;public class StreamUtilsTest3 { /** * @param args */ public static void main(String[] args) { try { StreamUtils.copyFile(new File("e:\\javaio\\日记1.txt"), new File("e:\\javaio\\日记2.txt")); } catch (IOException e) { e.printStackTrace(); } }}
0 0
- java i/o流(5) 字节流、字符流的操作
- java I/O 字节流和字符流的运用
- Java I/O(一)字节流与字符流
- JAVA I / O操作与字节流
- [疯狂Java]I/O:流模型(I/O流、字节/字符流、节点/处理流)
- I/O操作,字节流,字符流,字符集编码
- Java I/O(一)--字节流,字符流
- [疯狂Java]I/O:字节流、字符流
- java I/O系统(3)-字节流与字符流
- Java I/O流复习(二)—字符流、字符缓冲流、以及和字节流的区别
- java学习7--Java I/O 操作与字节流
- Java I/O 技术(五)—— 操作 字节流 的对象
- I/O字节流和字符流的使用
- 【Java.IO】I/O 字节处理流 - 之 - 内存(字节数组)操作流 - ByteArratInputStream,ByteArrayOutputStream
- Java-Java I/O流解读之基于字节的I / O和字节流
- Java-I/O操作之File类、字节流
- Java中字符流和字节流的区别以及主要的I/O体系
- Java中的I/O流,包含字节流和字符流的常用介绍
- HDU 2476 String painter (区间DP)
- Git与SourceTree使用详细指南
- 最大熵模的理解与最大熵模型逻辑回归相似转换条件
- UVA540Team Queue
- Tensorflow让神经网络自动创造音乐
- java i/o流(5) 字节流、字符流的操作
- HTML
- linux内核模块替换系统调用
- SVM支持向量机学习笔记 _ 1 数学基础
- Leetcode题解 168. Excel Sheet Column Title
- Protobuf简单例子
- HDU 4745 Two Rabbits (区间DP)
- Android Ethernet从上至下解析一
- 通过键盘把数据输入数组,只能越来越大