韩顺平 java io编程

文件流

文件在程序中是以流的形式来操作的。
- 内存 –输出流–> 文件
- 内存 <–输入流– 文件
流:数据在数据源(文件)和程序(内存)之间经历的路径。
注意:以内存为参照物
输入流:数据从数据源(文件)到程序(内存)的路径
输出流:数据从程序(内存)到数据源(文件)的路径

文件流分类

java流分为两种流
1. 字节流:可以用于读写二进制文件及任何类型文件(以byte单位读取)
2. 字符流:可以用于读写文本文件(记事本可以打开的,不能操作二进制文件)

输入:字节流(InputStream)、字符流(Reader)
输出:字节流(OutputStream)、(Writer)

java IO

File f = new File("/Users/chenwen/Desktop/aa.txt");
System.out.println("文件路径:"+ f.getAbsolutePath());
System.out.println("文件大小:" + f.length());

输出:
文件路径:/Users/chenwen/Desktop/aa.txt
文件大小:31
虽然文件大小是31字节,但是点击文件属性却发现,文件占了4kb。
why?
这个和计算机有关,计算机最小的块为4kb。
用不完也会占4kb。也就是说某个文件占得大小是4kb的倍数。

创建文件和文件夹

String filename = "aa.txt";
        String folder = "/Users/chenwen/Desktop/test/";
        //创建一个文件对象(文件夹也是文件的一种)
        File f = new File(folder);
        if(f.isDirectory()){
            System.out.println("文件夹已经存在了~");
            System.out.println("文件夹下的东西有:" );
            File lists[] = f.listFiles();
            for(int i =0; i < lists.length;++i){
                System.out.println(lists[i].getName());
            }
        }else{
            f.mkdir();
            System.out.println("文件夹已经创建好了");
        }

        //创建文件对象
        f = new File(folder + filename);
        if(f.exists()){
            System.out.println("文件存在啦~");
        }else{
            try {
                f.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println("文件已经创建好了");
        }

读取文件内容到内存

//读取文件内容到内存
        //f指向文件
        f = new File(folder + filename);
        FileInputStream fis = null;
        try {
            //因为File没有读写的能力,所以需要FileInputStream转一下
            fis = new FileInputStream(f);
            //定义一个字节数组,相当于缓存,防止文件太大了,内存会不够用
            byte []bytes = new byte[1024];
            int n =0;//得到实际读取的字节数
            //循环读取
            while((n = fis.read(bytes)) != -1){
                //把字节转成String
                String s = new String(bytes,0,n);
                System.out.println(s);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                fis.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

为什么要定义bytes数组呢?
这样就把大的文件,分批次读取了。防止内存不够用啊

从内存中写内容到文件

String filename = "aa.txt";
        String folder = "/Users/chenwen/Desktop/test/";
        File f = new File(folder + filename);
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(f);
            String s = "啦啦啦啦啦啊7787878\r\n";//注意换行
            String s1 = "jkjk7787878";
            //把String转换成byte
            fos.write(s.getBytes());
            fos.write(s1.getBytes());
        } catch (Exception e) {
        }finally{
            try {
                fos.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

图片copy

package copyPics;
import java.io.*;

public class CopyPictures {
    public static void main(String[] args) {
        //先把图片读入到内存。再写入到某文件
        //因为是二进制文件,因此只能用字节流完成

        //输入流、输出流(之前的写法也可以改成这样写)
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream("/Users/chenwen/Desktop/a.gif");
            fos = new FileOutputStream("/Users/chenwen/Desktop/test/b.gif");
            byte []b = new byte[1024];
            int n = 0;
            while((n =fis.read(b)) != -1){
                fos.write(b);
            }
        } catch (Exception e) {

        }finally{
            try {
                fos.close();
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

文件字符流

虽然效率比字节字符流快一点,但是,很局限,只能读取字符类的文件。
package 字符流;
import java.io.*;
public class CharStream {
    public static void main(String[] args) {
        //字节流
        FileReader fr = null;
        FileWriter fw = null;
        try {
            fr = new FileReader("/Users/chenwen/Desktop/test/aa.txt");
            fw = new FileWriter("/Users/chenwen/Desktop/test/bb.txt");
            char c[] = new char[1024];
            int n = 0;
            while((n = fr.read(c))!=-1){
                String s = new String(c, 0, n);
                fw.write(s);
            }
        } catch (Exception e) {

        }finally{
            try {
                fr.close();
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

缓冲字符流

这个效率高,而且可以一行一行读取
package 字符流;
import java.io.*;
public class CharStream {
    public static void main(String[] args) {
        //字节流
        BufferedReader br = null;
        BufferedWriter bw = null;
        try {
            FileReader fr = new FileReader("/Users/chenwen/Desktop/test/aa.txt");
            FileWriter fw = new FileWriter("/Users/chenwen/Desktop/test/cc.txt");
            br = new BufferedReader(fr);
            bw = new BufferedWriter(fw);
            String s = "";
            while((s = br.readLine()) != null){ 
                bw.write(s+"\r\n");
            }
        } catch (Exception e) {

        }finally{
            try {
                br.close();
                bw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值