Java- File、输入输出流详解

一.文件创建

File:文件和目录路径名的抽象表示形式,代表文件或者文件夹

   //创建文件 完整路径
    String path = "E:\\Java89\\app\\src\\main\\java\\java08151";

    //path\\1.txt 文件路径以及文件名
    File file = new File(path.concat("\\1.txt"));

    //判断文件是否存在
    if (file.exists() == false){
        //不存在 就创建
        file.createNewFile();
    }

这时候我们会发现createNewFile报错,java.io,IOException

我们用throws关键字声明抛出异常,调用者对其进行处理

即在main函数末尾添加throws IOException,如下

public static void main(String[] args) throws IOException{

}

这时候我们运行一下就会发现文件创建完成了

08151.png

二.输入输出流详解

1.Java流的分类

按流向分:
输入流:程序可以从中读取数据的流。
输出流:程序能向其中写入数据的流。
按数据传输单位分:
字节流:以字节为单位传输数据的流。
字符流:以字符为单位传输数据的流。
按功能分:
节点流:用于直接操作目标设备的流
过滤流:是对一个已存在的流的链接和封装,通过数据进行处理为程序提供功能强大/灵活的读写功能。

2.Java.io 常用类

JDK所提供的所有流类位于java.io包中,都分别继承自以下四种抽象流类:
InputStream:继承自InputStream的流都是用于向程序中输入数据的,且数据单位都是字节(8位)。
OutputStream:继承自OutputStream的流都是程序用于向外输出数据的,且数据单位都是字节(8位)。
Reader:继承自Reader的流否是用于向程序中输入数据的,且数据单位都是字符(16位)。
Writer:继承自Writer的流都是程序用于向外输出数据的,且数据单位都是字符(16位)。

是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或者是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这个时候你就可以想象数据好像在这其中“流”动一样。如下图

08152.jpg

Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共个四个):InputStream,OutputStream,Reader,Writer。Java中其他多种多样变化的流均是由它们派生出来的;

stream代表的是任何有能力产出数据的数据源,或者是任何有能力接收数据的接收源。在java的io中,所有的stream都包括两种类型:
(1)字节流
表示以字节为单位从stream中读取或往stream中写入信息
(2)字符流

1.流的层次结构

定义:
(1).java将读取数据对象成为输入流,能向其写入的对象叫输出流。结构图如下:
输入流


08153.jpg

输出流


08154.jpg
2.InputStream类

inputstream类和outputstream类都为抽象类,不能创建对象,可以通过子类来实例化。
IputStream是输入字节数据用的类,所以InputStream类提供了3种重载read方法。InputStream类中的常用方法:
(1)public abstract int read(); 读取一个byte的数据,返回值是高位补0的int类型值。
(2)public int read(byte b[ ] );读取b.length个字节的数据放到b数组中。返回值是读取的字节数。该方法实际上是调用下一个方法实现的
(3)public int read(byte b[ ],int off,int len);从输入流中最多读取len个字节的数据,存放到偏移量位off的b数组中。
(4)public int availabe();返回输入流中可以读取的字节数。注意:如果InputStream对象调用这个方法的话,它只会返回0,这个方法必须由继承InputStream类的子类对象调用才有用。
(5)public int close();我们在使用完后,必须对我们打开的流进行关闭。

3.OutputStream类

OutputStream提供了3个write方法来做数据的输出,这个是和InputStream是相对应的。
(1).public void write(byte b[ ]);将参数b中的字节写到输出流。
(2).public void write(byte b[ ],int off,int len);将参数b的从偏移量off开始的len个字节写到输出流。
(3).public abstract void write(int b);先将Int转换为byte类型,把低字节写入到输出流中。
(4).public void flush();将数据缓冲区中数据全部输出,并清空缓冲区。
(5).public void close();关闭输出流并释放与流相关的系统资源。

注意:InputStream和OutputStream都是抽象类,不能创建这种类型的对象。

4.FileInputStream类

FileInputStream类是InputStream类的子类,用来处理以文件作为数据输入源的数据流(从文件中读取数据)。使用方法:

File fin = new File("d:/abc.txt");
FileInputStream in = new FileInpuStream(fin);
5.FileOutputStream类

FileOutputStream类用来处理以文件作为数据流输出目的的数据流(向文件中写入数据);一个表示文件名的字符串,也可以是File对象。
创建一个文件流对象的方法:

File f = new File("d:/abc.txt");
FileOutpuStream out = new FileOutpuStream(f);

例子1:向文件写入数据-字节

 FileOutputStream fos = new FileOutputStream(file);


    // 2.调用write方法写入
    byte[] text = {'1','2','3','4'};
    fos.write(text);


    // 3.操作完毕需要关闭stream
    fos.close();

运行后,会看到创建的文件里由1234四个数字

例子2:向文件写入数据 - 字符流

   FileWriter fw = new FileWriter(file);


    char[] name = {'安','卓','开','发'};
    fw.write(name);

    fw.close();

运行后发现创建的文件里1234已经不见了 变成安卓开发四个字

注意:
(1)文件中写数据时,若文件已经存在,则覆盖存在的文件;
(2)读/写操作结束时,应调用close方法关闭流。

5.BufferedInputStream和BufferedOutputStream

BufferedInputStream和BufferedOutputStream为InputStream和OutputStream增加了内存缓冲区,根本目的是允许java的IO流一次操作多个字节,从而提高系统的性能。

BufferedInputStream
功能:用这个类来解决“每次都要用数据的时候都要进行物理读取”的问题,也就是说用“缓冲区”
用法:它本身并不提供接口,只是提供一个缓冲区。需要连到一个“有接口的对象(interfaceobject)”

BufferedOutputStream
功能:用这个类解决“每次往流里写数据,都要进行物理操作”的问题。也就是说“用缓冲区”。用flush()清空缓冲区。
用法:本身并不提供接口,只是加了一个缓冲区。需要连接一个有接口的对象。

BufferedInputStream定义了两种构造函数
(1)BufferedInputStream b = new BufferedInputStream(in);
(2)BufferedInputStream b = new BufferedInputStream(in,size);//指定大小

BufferedOutputStream中的flush方法可以强制输出缓冲区的数据

6.对象序列化和反序列化

把java对象转换成字节序列的过程成为对象序列化
把字节序列恢复到java对象的过程叫做对象的反序列化

序列化类的对象要求实现java.io.Serializable;

public ObjectInputStream (inputStream in)构造方法 构造输入对象
final object readObject ()方法 从指定位置读取对象

public ObjectOutputStream(inputStream in)构造方法 构造输出对象
final void writeObejct() 方法 输出对象的指定位置

对象序列化:对象转换成字节

定义一个Person类

public class Person implements Serializable {
    String name;
    int age;
}

在MyClass类里向文件存一个对象

    Person xw = new Person();
    xw.name = "小王";
    xw.age = 20;

    OutputStream os = new FileOutputStream(file);
    ObjectOutputStream oos = new ObjectOutputStream(os);

    oos.writeObject(xw);
    oos.close();

对象反序列化:自己转换成对象(从文件读取一个对象)

    InputStream is = new FileInputStream(file);
    ObjectInputStream ois = new ObjectInputStream(is);
    Person xw = (Person)ois.readObject();

    System.out.println(xw.name+" "+xw.age);

    ois.close();

输出结果

小王 20
7.将一个文件copy到另外一个位置
    //1.源文件的路径
    String sourcePath = "C:\\Users\\hp\\Desktop\\1.jpg";
    //2.目标文件的路径
    String desPath = "E:\\Java89\\app\\src\\main\\java\\java08151\\2.jpg";
    //3.图片 字节
    FileInputStream fis = new FileInputStream(sourcePath);
    FileOutputStream fos = new FileOutputStream(desPath);

    byte[] in = new byte[1024];

    int count = 0;
    while ((count = fis.read(in)) != -1){
        fos.write(in,0,count);
    }

运行后会发现


08155.png

图片成功复制

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 1、IO流 1.1、概述 之前学习的File类它只能操作文件或文件夹,并不能去操作文件中的数据。真正保存数据的是文...
    Villain丶Cc阅读 2,663评论 0 5
  • tags:io categories:总结 date: 2017-03-28 22:49:50 不仅仅在JAVA领...
    行径行阅读 2,171评论 0 3
  • 一、什么是IO Java中I/O操作主要是指Java的进行输入,输出操作。Java所有的I/O机制都是基于数据流进...
    小鱼儿_f32a阅读 1,035评论 0 0
  • Java输入输出流(一)# Android 是基于 Java 语言编写的,在安卓程序的很多时候会用到有关 I/O ...
    梁加盐阅读 1,408评论 0 4
  • 古籍说:气肃而霜降,阴气凝也。 秋日如歌的行板还没有吟唱完,冬天裹挟着瑟瑟的寒流就迫不及待的登上了季节的舞台。 ...
    风之子4288阅读 209评论 0 0