IO(输入流,输出流)
字节流
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();
}
}
}