Java IO流

[TOC]

IO流的本质

本地设备和不同设备之间数据的传输

IO流的分类

按照数据类型分类

字节流: 一般针对二进制文件 【视频,音频,图片】

字符流: 一般针对文本文件 【xml,json,html,txt.md...】

按照流向分

输入流: 从外界到内存

输出流: 从内存到外界

综合分类

字节流

字节输入流 InputStream

字节输出流 OutputStream

字符流

字符输入流 Reader

字符输出流 Writer

流的操作的三要素:

1.数据源: 数据需要从哪里到内存?

2.目的地: 数据从内存到哪里去?

3.交通工具:

a.弄明白到底需要输入流还是输出流,也有可能两个都需要

b.根据确定的流向在IO流框架中选取自己认为最适合的流

编码: 字符/字符数组/字符串 --> 二进制

解码: 二进制 --> 字符/字符数组/字符串

编码表: 将字符转换成对应数字的一张对照表

编码处理

编码的处理:

1.字符

2.字符串

getBytes("UTF-8");

new String(bys, "UTF-8")

3.文本文件 流

OutputStreamWriter(转换流,是字符流通向字节流的桥梁,可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认字符集编码。)
构造方法
OutputStreamWriter(OutputStream out) 创建使用默认字符编码的字符输出转换流
OutputStreamWriter(OutputStream out, Charset cs) 创建使用cs字符集的字符输出转换流
OutputStreamWriter(OutputStream out, CharsetEncoder enc) 创建使用enc字符集编码器的
OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的

IO流框架

IO流框架总结

普通IO / NIO

字节流

字节流

字节流是万能流,但是在处理字符方面有时候不太方便,一般用来处理二进制文件

字节输入流

--InputStream

int available() 返回流中可用的字节数

void close() 关闭此输出流并释放与此流有关的所有系统资源。

int read() 读取一个字节

int read(byte[] b) 读取一个字节数组

int read(byte[] b, int off, int len) 读取字节数组的一部分

long skip(long n) 跳过多n个字节读取

--FileInputStream

FileInputStream(File file)
通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
FileInputStream(FileDescriptor fdObj)
通过使用文件描述符 fdObj 创建一个 FileInputStream,该文件描述符表示到文件系统中某个实际文件的现有连接。
FileInputStream(String name)
通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。

-- BufferedInputStream
能够提高读写效率

注意:
1.作为输出流,文件可以不存在,会自动创建,作为输入流,文件必须存在
2.处理中文的时候不方便

字节输出流

--OutputStream

void close() 关闭此输出流并释放与此流有关的所有系统资源。
void flush() 将数据从内存中刷新到文件系统中
void write(byte[] b) 写一个字节数组
void write(byte[] b, int off, int len) 写一个字节数组的一部分
abstract void write(int b) 写一个字节
1.针对字节流可以不使用flush,针对字符流必须flush,建议都要flush
2.close释放流的资源,同时自带flush

--FileOutputStream
FileOutputStream(File file)
创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(File file, boolean append)
创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(FileDescriptor fdObj)
创建一个向指定文件描述符处写入数据的输出文件流,该文件描述符表示一个到文件系统中的某个实际文件的现有连接。
FileOutputStream(String name)
创建一个向具有指定名称的文件中写入数据的输出文件流。
FileOutputStream(String name, boolean append)
创建一个向具有指定 name 的文件中写入数据的输出文件流。
--BufferedOutputStream
能够提高读写效率

注意:
在不同的操作系统中对换行符的支持不一样
Windows \r\n
Linux \n
Mac \r
1.字节流在处理换行符的方面不方便
2.带append参数的表示追加写入

字符流

字符流

字符输入流

Reader

...方法与字节输入流一致

转换流: InputStreamReader

1.处理编码

2.将字节流转化成字符流

FileReader是InputStreamReader子类,用来读取字符文件的便捷类

高效缓冲字符输入流 BufferedReader

readLine() 读取一行

字符输出流

Writer

...方法与字节输出流一致

转换流: OutputStreamWriter

1.处理编码

2.将字节流转化成字符流

FileWriter是OutputStreamWriter子类,用来写入字符文件的便捷类

高效缓冲字符输出流 BufferedWriter

newLine() 写一个换行符

文件拷贝方式

文件拷贝的方式和原理:

1.FileInputStream/FileOutputStream一次性读取一个字节

2.FileInputStream/FileOutputStream一次性读取一个字节数组

3.BufferedInputStream/BufferedOutputStream一次性读取一个字节

4.BufferedInputStream/BufferedOutputStream一次性读取一个字节数组

5.FileReader/FileWriter一次性读取一个字符

6.FileReader/FileWriter一次性读取一个字符数组

7.BufferedReader/BufferedWriter一次性读取一个字符

8.BufferedReader/BufferedWriter一次性读取一个字符数组

9.BufferedReader/BufferedWriter一次性读取一行

至少有九种方式拷贝文件

使用字节流实现文件拷贝

通过这里我们需要了解计算机是如何处理中文的?

首先读取一个字节,如果人为没有转换

那么系统会根据当前的编码表来处理中文 [中文的第一个数一般是负数]

如果是正数,直接转换成对应码表的字符

如果是负数

判断编码表,假设是GBK,会等待下一个字节一起转换成对应的字符

如果是UTF-8,就会等待下两个字节一起转换成对应的字符

乱码原因:

1.人为转换

2.服务器和客户端编码表不一致

3.服务器系统编码和人为编码不一致

4.URL编码和人为解码不一致

异常
java.io.FileNotFoundException
产生原因:
1.文件盘符不存在
2.文件路径父目录不存在

java.io.IOException: Stream Closed
产生原因:
1.文件流已经关闭还在继续使用

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

推荐阅读更多精彩内容

  • 本篇文章主要围绕字符编码展开,为了能够更好地讲述这一主题,我将从字节流操作中文数据开始。 字节流操作中文数据 假设...
    北京大数据苏焕之阅读 400评论 0 0
  • 标准输入输出,文件的操作,网络上的数据流,字符串流,对象流,zip文件流等等,java中将输入输出抽象称为流,就好...
    navy_legend阅读 713评论 0 0
  • 字节流 InputStream 输入字节流 OutputStream 输出字节流 输入字节流----InputSt...
    向日花开阅读 2,382评论 0 4
  • IO流的概念 Java 中对文件的操作是以流的方式进行的。流是Java内存中的一组有序数据序列。Java将数据从源...
    接着奏乐接着舞S阅读 1,062评论 0 7
  • 最近,有许许多多的人在市场上卖青蛙,这些青蛙一只一只地被买走,做成了很多美味佳肴。有少量的青蛙没被买走,才能被放生...
    senny1978阅读 308评论 0 1