Java基础笔记总结(13)-IO流(1)FileInputStream FileOutputStream BufferedInputStream BufferedOutputStream

IO流

IO流通常用来处理设备之间的数据传输

Java对数据的操作是通过流的形式

Java用于操作的流的类都在IO包

按照流向:分为输入流和输出流

按操作类型:

字节流:字节流可以操作任何数据,因为计算机的数据都是按照字节存放

字符流:字符流只能操作纯字符数据,比较方便

字符大 字节小

常用的父类:

抽象父类:InputStream(字节输入流)  OutputStream(字节输出流)

抽象父类: Reader(字符输入流) Writer(字符输出流)

IO程序书写

导入IO包类,进行IO异常处理,释放资源

--------------------------------------------------------------------------

FileInputStream

FileInputStream fis = new FileInputStream("xxx.txt");

int x = fis.read();

System.out.println(x);

int y = fis.read();

System.out.println(y);

fis.close();

每read()一次,就向后移动一次并再次读取

注意,文件的结束标记是-1

while((len = fis.read())!=-1){

System.out.println(len);

}

fis.close();

为什么返回Int而不是Byte

任何文件读取的结束都是-1 为了保证读取过程中不会因为读到byte的-1而终止读取过程,因此选择读取int来执行操作

-----------------------------------------------------------------------------

拷贝图片,音乐 逐字节拷贝特别慢

available()方法 获取读取文件的所有字节个数(这个方法可能导致内存溢出)

FileInputStream fis = new FileInputStream("xxx.txt");

byte[] arr = new byte[fis.available()];//创建和文件一样大小的字节数组

fis.read(arr); 将文件上的字节读取到文件中(字节数组中)

FileOutputStream fos = new FileOutputStream("xxx");

fos.write(arr); 将字节数组中的字节数据写到文件上

----------------------------------------------------------------------------

读取小数组的方法

FileInputStream fis = new FileInputStream("xxx.txt");

byte[] arr = new byte[1024];

int len = 0;

while((len = fis.read(arr))!=-1)}{

fos.write(arr,0,len);

如果忘记加arr 返回不是读取的字节个数,而是字节的码表值,一定要先读到字节数里

-----------------------------------------------------------------------------

BufferInputStream

FileInputStream fis = new FileInputStream("xxx.txt");

FileOutputStream fos = new FileOutputStream("copy.txt");

BufferedInputStream bis = new BufferedInputStream(fis);//创建缓冲区,对输入流进行包装

BufferedOutputStream bos = new BufferedOutputStream(fos);//创建缓冲区,对输出流进行包装

int b ;

while((b=bis.read())!=-1){

bos.write(b);

}

bis.close();

bos.close();

字节流一次读取一个数组速度要更快

装饰设计模式,提供了字节缓冲区流

BuffferedInputStream bis 先在文件读取8192个数送到缓冲区,然后程序去缓冲区读取,如果所有缓冲区数据都被读完,再去获取8192个数据

BufferedOutputStream bos 程序将数据送到缓冲区,然后将缓冲区写满时,在将数据一次性送入到文件中

相比较而言,定义小数组要比Buffered读取更快,因为其读和写都是同一个数组,而Buffered操作的是两个数组

-----------------------------------------------------------------------------

flush()和close()的区别

BufferedInputStream bis  = new BufferedInputStream(new FileInputStream());

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream());

如果不加close 拷贝文件会稍微小一点点 close方法具备刷新的功能,关闭流之前就会刷新一次缓冲区,将缓冲区的字节全部刷新到文件上,再关闭

用bos.flush()直接刷新缓冲区即可

close和flush相比较, flush刷新完仍然可以继续写入

flush--->实时刷新

--------------------------------------------------------------------------

字节流读写中文(字节流读取中文造成乱码)(GBK中一个字符两个字节)

FileInputStream fis = new FileInputStream("xxx.txt");

byte[] arr = new byte[3]();

int len;

while((len = fis.read())!=-1){

  new String(arr,0,len);

}

fis.close();

而用字节流写出中文

FileOutputStream fos = new FileOutputStream("xxx");

fos.write("xxx".getBytes());

fos.write("\r\n".getBytes());//回车换行

fos.close();

--------------------------------------------------------------------------

标准异常处理代码

TryFinally

JDK 1.6以前

FileInputStream fis = null;

FileOutputStream fos = null;

try{

fis = new FileInputStream("xxx.txt");

fos = new FileOutputStream("xxx.txt");

}catch(Exception e){

e.printStackTrace();

}

finally{

try{

if(fis != null){

fis.close();

}

}finally{

if(fos != null){

fos.close();

}

}

JDK1.7

try(

FileInputStream fis = new FileInputStream("xxx.txt");

FileOutputStream fos = new FileOutputStream("xxx.txt");

){

int b;

while ((b = fis.read()) != -1) {

fos.write(b);

}

}

在try的小括号中书写类,必须要实现AutoCloseale接口

------------------------------------------------------

加密用异或操作,一个数异或两次等于其本身

拷贝文件

注意如果是自己拷贝文件,/r/n是换行操作符

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

推荐阅读更多精彩内容