一.字节流
以字节为单位,进行数据的传输参照物是程序
OutputStream 字节输出流(写文件)
InputStrem 字节输入流(读文件)
以上两个抽象类 是所有字节流的父类.
写文件步骤
1.创建绑定文件
2.创建输出流 并绑定文件
3.写文件
4.关闭流资源
//创建file(给输出流绑定一个文件) //给出路径,可以没有该文件 (系统会帮你创建出来) //创建文件字节输出流 File file = new File("/Users/lanou/Desktop/test/sdafs.txt"); FileOutputStream fos = new FileOutputStream(file); //写文件 //流这里都是抛的IOException //传入int值的方法 是按ASCII码输入 //一次写入一个字节 fos.write(49); //创建一个字节数组 byte[] bs = {66,67,68,69}; fos.write(bs); //可以直接写字符串 //字符串转字节数组 getBytes() //字节数组转字符串 构造方法 fos.write("wanglong".getBytes()); fos.write(bs, 1, 2); //关闭资源 fos.close();读文件(需要循环读取)
一次读一字节
int num = 0; while((num=fis.read())!=-1) { System.out.println((char)num); } fis.close();一次多读几个字节
byte[] bs = new byte[2]; int num = 0; while((num=fis.read(bs))!=-1) { //直接使用string的构造方法 //将字节数组转换为字符串 System.out.print(new String(bs, 0, num)); } fis.close();使用字节流 进行文件的复制(带异常处理)
File file1 = new File("/Users/lanou/Desktop/test/抽奖系统案例.pdf"); File file2 = new File("/Users/lanou/Desktop/test/p2.pdf"); FileOutputStream fos = null; FileInputStream fis = null; try { fis = new FileInputStream(file1); fos = new FileOutputStream(file2); } catch (FileNotFoundException e) { throw new RuntimeException("文件找不到"); } byte[] bs = new byte[1024]; int len = 0; //int num = 0; try { while((len=fis.read(bs))!=-1) { fos.write(bs,0,len); } } catch (IOException e) { throw new RuntimeException("读写失败"); } finally { //先关哪个(读写完毕) if (fos!=null) { try { fos.close(); } catch (IOException e) { throw new RuntimeException("关闭失败"); }finally {if(fis!=null){ try { fis.close(); } catch (IOException e) { throw new RuntimeException("关闭失败"); } } } } }文件的续写
利用构造方法的参数进行续写(布尔参数)
File file = new File("/Users/lanou/Desktop/test/xuxie.txt");
FileOutputStream fos = new FileOutputStream(file,true);
基本的编码格式
mac 默认使用UTF-8格式(通用编码格式)
一个中文字符 占三个字节
windows 默认使用GBK模式(简体中文)
一个中文字符占两个字节
二.字符流
Writer(写文件) 字符输出流Reader(读文件) 字符输入流
上面两个类是所有字符流父类(抽象类)
写文件
//创建文件字符输出流 File file = new File("/Users/lanou/Desktop/test/dongdong.txt"); FileWriter fw = new FileWriter(file); //写 fw.write(65); //刷新 //相当于写入的时候 有一个缓冲区 //写的字符实际上 是先写到缓冲区 //刷新时 才会将写的字符全部写入文件中 //利用字符数组写入 char[] c = {'c','b','a'}; fw.write(c); //利用字符串写入 fw.write("苟利国家生死以"); fw.flush(); //关闭流资源 //关闭流资源之前 会自动刷新缓冲区 fw.close();读文件
利用缓冲字符数组读
int len = 0; char[] cs = new char[2]; while((len = fr.read())!=-1) { System.out.println(new String(cs, 0, len));
三.转换流
OutputStreamWriter(字符流通向字节流的桥梁)构造方法(不传编码格式 默认使用系统的编码格式)
1.需要字节输出流
2.编码格式的名字(UTF-8,GBK 不区分大小写)
InputStreamReader(读取文件 字节流通向字符流的桥梁)
构造方法(不传编码格式 默认使用系统的编码格式)
1.需要字节输入流
2.编码格式的名字
四.缓冲流
内部自带一个缓冲区(字节数组)BufferedoOutputStream(写文件) 缓冲字节输出流
BufferedoInputStream(读文件) 缓冲字节输入流
构建一个缓冲流写文件
FileOutputStream fos = new FileOutputStream("/Users/lanou/Desktop/test/guifen.txt"); BufferedOutputStream bos = new BufferedOutputStream(fos); bos.write("guifen".getBytes()); bos.close();构建一个缓冲读文件
FileInputStream fis = new FileInputStream("/Users/lanou/Desktop/test/guifen.txt"); BufferedInputStream bis = new BufferedInputStream(fis); int len = 0; byte[] bs = new byte[1024]; while((len=bis.read(bs))!=-1) { System.out.println(new String(bs, 0, len)); } bis.close();