JAVA输入输出

JAVA程序访问外部数据,需要实现对数据的传送,为此JAVA提供了庞大的IO类库支持。I就是输入,input,指数据从外部读取到程序中;O就是输出,output,指数据从程序写出到外部文件中。
下面介绍一些常用的类:

  • File类
  • InputStream、OutputSream字节输入输出流
  • Reader、Writer字符输入输出流
  • DataInputStream、DataOutputSteam二进制流读写二进制文件
  • ObjectInputStream、ObjectOutputStream序列化对象

File类

File类实现对文件的基本操作,该类主要用于文件和目录的创建、文件的查找和文件的删除等。
File对象代表磁盘中实际存在的文件和目录。
示例:

        File file = new File("/Users/jason/Desktop/mywork.txt");//创建File对象
        file.createNewFile();  //创建文件
        System.out.println(file.exists());  //文件是否存在
        System.out.println(file.isFile());  //是不是文件
        System.out.println(file.isDirectory()); //是不是目录
        System.out.println(file.getName());  //文件名
        System.out.println(file.getPath());  //文件相对路径
        System.out.println(file.getAbsolutePath());  //文件绝对路径
        System.out.println(file.length());  //文件大小,单位字节
        file.delete();   //删除文件

数据流是一串连续不断的数据的集合,java中将输入输出抽象称为流,流是一个很形象的概念,就好像水管,将两个容器连接起来。将数据从外部读取到程序中的称为输入流,将数据从程序写到外部的称为输出流。


stream.png

InputStream、OutputSream字节输入输出流

字节流是按字节,一个字节一个字节的读取或写入数据。基本单位是8bit的通用字节。InputStream和OutputStream是字节流的基类,他们是抽象类。常用的是他们的子类FileInputStream和FileOutputStream。

InputStream(抽象类)常用方法 说明
int read() 从输入流中读取下一个字节数据并返回
int read(byte[ ] b) 从输入流中读取数据,存储在数组b中,返回实际读取到的字节数
int read(byte[ ] b,int off,int len) 从输入流中读取最多len长度的字节,存储在数组b中,保存位置从off开始,返回读取到的字节数
void close() 关闭输入流
OutputStream(抽象类)常用方法 说明
void write(int c) 把指定字节写入输出流
void write(byte[ ] b) 把数组b中的所有字节写入输出流
void write(byte[ ] b,int off,int len) 把数组中从偏移量off开始的长度为len的字节写入输出流
void close() 关闭输出流

示例:

public class Test {
    public static void main(String[] args) {
        FileInputStream fis = null;//创建输入流对象
        FileOutputStream fos = null;//创建输出流对象
        try {
            //给输入输出流传路径
            fis = new FileInputStream("hello.txt");
            fos = new FileOutputStream("test.txt",true);//true表示写入的文件是追加,false表示覆盖
            byte[] words = new byte[1024];
            int len = -1;
            while((len = fis.read(words)) != -1){//循环读取,保存到数组中
                fos.write(words,0,len);//写入文件
            }
            System.out.println("文件复制完成");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                fos.close();  //流先打开的后关,后打开的先关
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Reader、Writer字符输入输出流

字符流是按字符,一个字符一个字符的读取或写入数据。基本单位是16bit的Unicode字符。Reader和Writer是字符流的基类,他们是抽象类。常用的是他们的子类FileReader、FileWriter、BufferedReader、BufferedWriter。

Reader(抽象类)常用方法 说明
int read() 从输入流中读取单个字符,返回读到的字符
int read(char[ ] b) 从输入流中读取b.length个字符,存储在数组b中,返回实际读取到的字符数
int read(char[ ] b,int off,int len) 从输入流中读取最多len长度的字符,存储在数组b中,保存位置从off开始,返回读取到的字符数
void close() 关闭输入流
InputStream(抽象类)常用方法 说明
void write(String str) 把指定字符串str中的字符写入输出流
void write(String str,int off,int len) 把字符串str从off开始的长度为len的多个字符写入输出流
void flush() 刷新输出流
void close() 关闭输出流

示例:

public class Test {
    public static void main(String[] args) {
            FileInputStream fis = null;
            InputStreamReader isr = null;
            BufferedReader br = null;
            FileWriter fw = null;
            BufferedWriter bw = null; //带缓冲区的字符流,先读写在缓冲区,效率更高
            try {
                fis = new FileInputStream("test1.txt");
                isr = new InputStreamReader(fis,"UTF-8");//指定输入流的编码格式
                br = new BufferedReader(isr);
                String str = null;
                StringBuffer sb = new StringBuffer();
                while((str = br.readLine()) != null){//按行读取数据
                    sb.append(str);//追加字符串
                }
                String newStr = sb.toString();
                fw = new FileWriter("test2.txt", true);//追加写入文件
                bw = new BufferedWriter(fw);
                bw.write(newStr);//写入文件
                bw.newLine();//写入空行
                bw.flush();//强制清空缓冲区
                System.out.println("copy successful");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                try {//关闭流
                    bw.close();
                    fw.close();
                    br.close();
                    isr.close();
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    }
}

DataInputStream、DataOutputSteam二进制流读写二进制文件

用二进制流读写二进制文件,用法和字节流相似。
示例:

public class Test {
    public static void main(String[] args) {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        DataInputStream dis = null;
        DataOutputStream dos = null;
        try {//创建二进制流
            fis = new FileInputStream("file.class");
            dis = new DataInputStream(fis);
            fos = new FileOutputStream("filecopy.class");
            dos = new DataOutputStream(fos);
            int temp;
            while((temp = dis.read())!=-1){//读取信息保存到temp中
                dos.write(temp); //把temp中的信息写入文件
            }
            System.out.println("copy class file  done");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {//关闭流
                dos.close();
                fos.close();
                dis.close();
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

}

ObjectInputStream、ObjectOutputStream序列化对象

序列化就是把对象的状态存储到特定介质中的过程,也就是把对象状态转换为可传输格式的过程。简单来说就是把对象数据二进制化。
JAVA中只有实现了java.io.Serializable接口的类的对象才可以被序列化。
示例:

public class Test {
    public static void main(String[] args) {
        ObjectOutputStream oos = null;
        try {  //创建序列化对象
            oos = new ObjectOutputStream(new FileOutputStream("stuInfo.txt"));
            Student stu = new Student("安妮",18);
          oos.writeObject(stu);  // 写入文件
            System.out.println("write stuList info to file done");
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(oos!=null){
                try {
                    oos.close(); //关闭流
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • Java输入输出流(一)# Android 是基于 Java 语言编写的,在安卓程序的很多时候会用到有关 I/O ...
    梁加盐阅读 1,372评论 0 4
  • tags:io categories:总结 date: 2017-03-28 22:49:50 不仅仅在JAVA领...
    行径行阅读 2,130评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 没有高素质的教师队伍,一切高质量的教育计划都是空谈。本学期钟英小学教师队伍又壮大啦,加入了23位新成员,为迅...
    Hi_Myra阅读 503评论 0 0
  • 如果你在大城市,能和外国人交流肯定不是什么新鲜事儿了,但是能真正和外国人聊很多有意思的话题,并且听他们讲在中国遇到...
    5b898d2cdc00阅读 1,094评论 4 2