一直对java的io操作晕晕乎乎的,这几天经理不让用ibatis的插入blob模式了,说ias支持的不是很好,所以都改成了jdbc读写blob的模式,所以回顾巩固一下java 的io
高阶IO: 操作String,char
低阶IO: 操作byte[]
****原则:使用高级IO前一定要先建立低级IO,高级IO才能使用
低阶IO
inputstream --- read() --- 读入内部 从外部将数据读入到字节数组byte[]
outputstream --- write() --- 写入外部 从内部的byte[]写入外部
1. FileInputStream、FileOutputStream、BufferedInputStream、BufferedOutputStream类
read() 从输入流读取1个byte
read(byte[] b) 从输入流一次读取b.length个byte到byte[],娶不到数据返回-1
实例1(利用bis.read(b)!=-1来循环读取):
- //从1.txt读取数据写入2.txt
- FileInputStream fis = new FileInputStream("E://iotest//1.txt");
- //inputstream增加缓冲功能
- BufferedInputStream bis = new BufferedInputStream(fis);
- //定义缓冲数组的大小为4,一次读取4byte
- byte[] buffer = new byte[4];
- //输出内容到2.txt,而且是追加方式而不是覆盖
- FileOutputStream fos = new FileOutputStream("E://iotest//2.txt",true);
- //outputstream增加缓冲功能
- BufferedOutputStream bos = new BufferedOutputStream(fos);
- //每次实际读取到的byte数
- int len = 0;
- //记录读取次数
- int count = 1;
- //如果实际读取到-1个byte,代表读取到文件末尾了
- while((len = bis.read(buffer)) != -1){
- System.out.println("第"+ count + "次,实际读取到 "+ len + "个字节");
- //控制台输出实际读取的byte[]转换的String
- System.out.println(new String(buffer,0,len));
- //写入实际读取byte到2.txt
- bos.write(buffer,0,len);
- }
- System.out.println("共写了" + (count-1) + "次");
- bos.flush();
- //bos关闭自动就会flush
- bos.close();
- //只关闭装饰好的类就可以了,被装饰类其实不用关闭
- bis.close();
实例2(利用fis.avaliable()>0来循环读取)
- FileInputStream fis = new FileInputStream("E://iotest//1.txt");
- BufferedInputStream bis = new BufferedInputStream(fis);
- FileOutputStream fos = new FileOutputStream("E://iotest//2.txt");
- BufferedOutputStream bos = new BufferedOutputStream(fos);
- int count = 1;
- //每次循环bis.available()的大小都会减去以读取的byte数目,即new byte[5],如果还有剩余byte未读取则继续循环
- while (bis.available() > 0) {
- System.out.println("available =" + bis.available());
- byte[] buffer = new byte[5];
- int len = bis.read(buffer);
- if (len != -1) {
- System.out.println("第" + count + "次,实际读取到 " + len + "个字节");
- System.out.println(new String(buffer, 0, len));
- bos.write(buffer, 0, len);
- count++;
- } else {
- break;
- }
- }
- System.out.println("共写了" + (count - 1) + "次");
- bos.close();
- fis.close();
read(byte[] b,0,length)从输入流一次读取length个byte到byte[]中去,没啥用,带偏移量的一般使用的是os的write(b,0,len)
2. FileWriter和FileOutputStream的最大不同也在於写入单位的不同,FileOutputStream为byte,FileWriter为char,FileReader 判断还有
没有能读取的char用 ready() 来判断,缓冲数组是char[],而FileInputStream用avaliable()和byte[]
3. BufferedWriter和BufferedReader
- FileReader fr = new FileReader("e://iotest//1.txt");
- BufferedReader br = new BufferedReader(fr);
- FileWriter fw = new FileWriter("e://iotest//1c1.txt");
- BufferedWriter bw = new BufferedWriter(fw);
- String line;
- int count = 0;
- while ((line = br.readLine()) != null) {
- bw.write(line);
- //每写一行文件都要调用newLine()来结束这一行,java会根据操作系统添加/r/n or /n
- //网络编程里面就不要写这个,因为不能判断方法了,
- bw.newLine();
- count++;
- }
- System.out.println(count);
- bw.close();
- br.close();
4. File
length() 返回byte大小
lastModified() 返回long的最后更新时间
File f1 = new File("1.txt");
File f2 = new File ("2.txt");
//f1 更名为 f2或者 移动文件
f1.renameTo(f2);