Java IO 体系(二): inputstream与outputstream

Java中文件数据流操作有2个大类:OutputStream/InputStream接口 和 FileWriter/FileReader类

1. OutputStream接口:所有字节输出流的超类

包:java.io.OutputStream

作用:从java程序,写字节到文件,不能写入目录

字节:数据流以字节的形式进行操作

方法:因为是从程序存文件,因此方法都是write写方法

1.1. OutputStream所有方法

void write(int b) 将指定字节写入输出流

void write(byte[] b) 将字节数组写入输出流

void write(byte[] b, int off, int len) 将字节数组从off开始写入len个字节

void close() 关闭输出流

1.2. FileOutputStream类: OutputStream接口的一个实现类

1.2.1. 写字节到文件

构造方法:

作用:绑定输出的输出目的地

参数: FileOutputStream (**File** file)

            FileOutputStream (**String** name)

流对象使用步骤:

1\. 创建流子类的对象,丙丁数据目的

2\. 调用流对象的方法write

3\. close输出流

如果文件不存在,创建文件;如果文件已经存在,则不保留原来内容,即重写文件内容

public static void demo() throws IOException{

  • FileOutputStream f = new FileOutputStream("/kluter/temp/fileOutS");*

  • f.write(1);*

  • f.write(2);*

  • f.write(48); //"0"*

  • f.write(49); //"1"*

  • f.write(11); //0x0b*

  • f.write(15); //0x0f*

*** f.close();***

}

1.2.2 写字节数组到文件

写一个完整的字节数组:

public static void demo() throws IOException{

  • FileOutputStream f = new FileOutputStream("/kluter/temp/fileOutS");*

  • byte[] barr = {10, 11, 12, 13, 14, 15};*

  • f.write(barr);*

  • f.close();*

}

写部分字节数组:

public static void demo() throws IOException{

  • FileOutputStream f = new FileOutputStream("/kluter/temp/fileOutS");*

  • byte[] barr = {10, 11, 12, 13, 14, 15};*

  • f.write(barr, 2, 3);*

  • f.close();*

}

由于字节数组输入单个字节很麻烦,提供用String转换写字节数组的简便方式:

public static void demo() throws IOException{

  • FileOutputStream f = new FileOutputStream("/kluter/temp/fileOutS");*

*** String s = "abcdef";***

*** f.write(s.getBytes());***

  • f.close();*

}

1.2.3. 追加数据到文件

使用带boolean append参数的双参构造器

FileOutputStream (File file, boolean append)

FileOutputStream (String name, boolean append)

public static void demo() throws IOException{

*FileOutputStream f = new **FileOutputStream("/kluter/temp/fileOutS", true);***
  • String s = "abcdef";*

  • f.write(s.getBytes());*

  • f.close();*

}

1.2.4. 换行符

加\n

public static void demo() throws IOException{

  • FileOutputStream f = new FileOutputStream("/kluter/temp/fileOutS", true);*

  • String s = "abcdef\n";*

  • f.write(s.getBytes());*

  • f.close();*

}

1.3 I/O中的异常处理

说明:

1. 保证流对象变量,作用域正确

2. catch里面,怎么处理异常

输出异常,目的看到底哪里出了问题

因为可能是硬件问题,只能听下程序,从新尝试

3. 如果流对象创建失败了,需要关闭资源吗?

new对象的时候,失败了,没有占用系统资源

释放资源的时候,对流对象判断null,如果是null,不需要close资源
image

2. InputStream接口:所有字节输入流的超类

包:java.io.InputStream

作用:读取任意文件,每次读取一个字节

2.1. InputStream所有方法

abstract int read() 读取输入流的下1个字节

int read(byte[] b) 从输入流读取一些字节存储到缓冲区

int read(byte[] b, int off, int len) 从输入流偏移量off位置开始读取len个字节

void close() 关闭输入流

2.2. FileInputStream类: InputStream接口的一个实现类

构造方法:

FileInputSteam (File file)

FileInputSteam (String name)

2.2.1. 从文件读字节

read()方法的特点,读取一个字节,文件指针移到下一个字节

public int read()返回值:

读取到的字节:成功

-1:到文件末尾了

public static void input() throws IOException{

  • FileInputStream fin = new FileInputStream("/kluter/temp/fileOutS");*

  • int ret = 0;*

  • while(ret != -1){*

  •    ret = fin.read();*
    
  •    out.println(ret);*
    
  • }*

  • fin.close();*

}

2.2.2. 从文件读到字节数组

public int read(byte[] b)

返回值:

返回读取到的字节数:成功

-1:已经到达文件末尾

根据read返回读取的字节数来决定循环遍历:

public static void input() throws IOException{

  • FileInputStream fin = new FileInputStream("/kluter/temp/fileOutS");*

  • int ret = 0;*

  • byte[] barr = new byte[100];*

  • ret = fin.read(barr);*

  • out.print(ret);*

  • out.print("*******************");*

  • int idx = 0;*

  • while(idx < ret){*

  •    out.print(barr[idx]);*
    
  •    idx++;*
    
  • }*

  • fin.close();*

}

将获取的字节数组使用String的构造函数转换成String来显示:

public static void input() throws IOException{

  • FileInputStream fin = new FileInputStream("/kluter/temp/fileOutS");*

  • int ret = 0;*

  • byte[] barr = new byte[100];*

  • ret = fin.read(barr);*

  • out.print(ret);*

  • out.print("*******************");*

  • String s = new String(barr);*

  • out.print(s);*

  • fin.close();*

}

利用读取到的字节数,循环read到字节数组:

一定要注意!倒数第二次read的时候,不是刚好读取数组长度个字节的情况下,打印数组有倒数第三次read字节的情况,用s = new String(barr, 0, ret);解决

public static void input() throws IOException{

  • FileInputStream fin = new FileInputStream("/kluter/temp/fileOutS");*

  • int ret = 0;*

  • String s = null;*

  • byte[] barr = new byte[3];*

  • while((ret = fin.read(barr)) != -1){*

  •    out.println(ret);*
    
  •    **s = new String(barr, 0, ret);***
    
  •    out.println(s);*
    
  • }*

  • fin.close();*

}

3. 文件复制

3.1. 单字节复制

public static void copy_byte() throws IOException{

  • FileInputStream fin = new FileInputStream("/kluter/temp/fileOutS");*

  • FileOutputStream fout = new FileOutputStream("/kluter/temp/fileCopy1", true);*

  • int ret = 0;*

  • while((ret = fin.read()) != -1){*

  •    out.print((char)ret);*
    
  •    fout.write(ret);*
    
  • }*

  • fin.close();*

  • fout.close();*

}

3.2. 字节数组复制

为了提高复制的效率,需要采用字节数组的方式来复制文件:

public static void copy_arr() throws IOException{

  • FileInputStream fin = new FileInputStream("/kluter/temp/fileOutS");*

  • FileOutputStream fout = new FileOutputStream("/kluter/temp/fileCopy2", true);*

  • int ret = 0;*

  • byte[] barr = new byte[6];*

  • String s = null;*

  • while((ret = fin.read(barr)) != -1){*

  •    s = new String(barr, 0, ret);*
    
  •    out.print(s);*
    
  •    fout.write(barr);*
    
  • }*

  • fin.close();*

  • fout.close();*

}

总结:

为了演示,这里我没有加上IOexception的代码,但是工作中一定要加上

单个字节的操作,效率远远低于字节数组

读写中文用FileWriter和FilerReader类

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

推荐阅读更多精彩内容