[转帖]Java IO流(InputStream/OutputSteam)_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2747 | 回复: 0   主题: [转帖]Java IO流(InputStream/OutputSteam)        下一篇 
panpan.nie
注册用户
等级:大校
经验:4754
发帖:217
精华:2
注册:1970-1-1
状态:离线
发送短消息息给panpan.nie 加好友    发送短消息息给panpan.nie 发消息
发表于: IP:您无权察看 2015-4-14 21:53:59 | [全部帖] [楼主帖] 楼主

什么是IO流?
 byte序列的读写,Java中的IO流是实现输入/输出的基础.
1)
InputStream : 抽象类读取数据的过程  包含读取方法read();
  in 模仿了读取小说的过程

    简单说  :  in是读取文件的

OutputStream:抽象了写出数据的过程  包含写出方法write();
 out模仿了写笔记记录的过程

    简单说  : out是写入文件的

基本的byte流

InputStream(抽象方法read())
|--- FileInputStream(read()在文件上读取)   节点流
|
|--- FilterInputStream 过滤器流,输入流功能的扩展
|   |--- DataInputStream(readInt())  基本类型数据的读取
|   |--- BufferedInputStream 提供读取缓冲区管理
| --- ObjectInputStream   过滤器流,依赖基本byte流,扩展对象的反序列化
OutputStream(抽象方法write())
|--- FileOutputStream(write()在文件上写实现写入)   节点流
|
|--- FilterOutputStream 过滤器流,输出流功能的扩
|    |--- DataOutputStream(writerInt())  基本类型数据的写出
|    |--- BufferedOutputStream 提供了输出缓冲区管理
| --- ObjectOutputStream 过滤器流,依赖基本byte流,扩展对象的序列化


注意:除节点流外都是过滤器流

字符流,可以处理字符编码,底层依赖于byte流


Reader 读取文本

 | --- InputStreamReader  过滤去,依赖基本byte输入流


     |      实现文本编码的解析

 |
| --- BufferedReader 过滤器, 需要依赖Reader 实例


     |    提供了readLine()方法, 可以在文本文件中读取一行
     |    是常用的文本读取方法   

Writer
| --- OutputStreamWriter  过滤器,,依赖基本byte输出流


     |        实现文本编码

 | --- PrintWriter  过滤器,依赖于Writer 流
|                       提供了输出文本常有方法println()
2)  EOF =  End of File = -1 (文件读到末尾会返回-1)


3)  输入流的基本方法  
InputStream in = new InputStream(file) / /file是文件名
 int b  = in.read();      读取一个byte无符号填充到int底八位,-1是EOF
 int.read(byte[] buf)    读取数据填充到buf中
 int.read(byte[] buf,int start,int size)  读取数据填充到buf中
 in.close      关闭输入流

4)输出流的基本方法:
OutputStream out = new OutputStream(file) / /file是文件名
 out.write(int b)     写出一个byte 到流 b 的底八位写出
 out.write(byte[] buf)    将buf的一部分写入流中
 out.write(byte[] buf, int start, int size)  将buf的一部分写入流中
 out.flush()      清理缓存

 out.close


1.FileInputStream (read()在文件上读取)   节点流
方法:read()         从输入流中读取数据的下一个字节
     read(byte[] buf)  从输入流中读取一定数量的字节,并将其存储在缓冲区数组 buf中 
     read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入 byte 数组。

北京联动北方科技有限公司

1import java.io.FileInputStream; 2import java.io.IOException; 3import java.io.InputStream; 4 5publicclass InputStreamDemo { 6publicstaticvoid main(String[] args) 7throws IOException { 8 String file = "out.txt"; 9 InputStream in = new FileInputStream(file); 10int b; 11while((b=in.read())!=-1){//read()方法12 System.out.print(Integer.toHexString(b) + " "); 13 } 14 in.close(); 1516 in = new FileInputStream(file); 17//in.available() 可以读取的数据个数,小文件一般是文件长度18byte[] buf = newbyte[in.available()]; 19 in.read(buf);//read(byte[] buf)方法重载20 in.close(); 21for (byte c : buf) { 22 System.out.print(Integer.toHexString(c & 0xff) + " "); 23// c & 0xff --->将16进制写成0xff的格式 24//ffffffd6---> d6 25//11111111 11111111 11111111 11010110 &对应相乘 26//00000000 00000000 00000000 11111111 0xff 27//00000000 00000000 00000000 1101011028 } 29 } 30 }


北京联动北方科技有限公司

2  FileOutputStream(write()在文件上写实现写入)   节点流
方法 :write(int b)  将指定的字节写入此输出流。
 write(byte[] buf)   将 b.length 个字节从指定的 byte 数组写入此输出流。
 write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
例子

北京联动北方科技有限公司

1import java.io.*; 2 3publicclass OutputStreamDemo { 4publicstaticvoid main(String[] args) 5throws IOException{ 6 String file = "out.txt"; 7 OutputStream out = new FileOutputStream(file); 8 out.write(65);//在文件中是以16进制存储的,对应0x41 9 out.write(66);//0x4210byte[] buf = {(byte)0xd6,(byte)0xd0}; 11 out.write(buf); 12 out.flush();//刷出缓存,清理缓冲区,保证可靠写 13 out.close(); 14 } 15 }


北京联动北方科技有限公司

3.BufferedInputStream和BufferedOutputStream 的 用法

BufferedInputStream(FileInputStream in)
BufferedOutputStream(FileOutputStream out)


可以提高性能
例子

北京联动北方科技有限公司

1import java.io.BufferedInputStream; 2import java.io.BufferedOutputStream; 3import java.io.FileInputStream; 4import java.io.FileOutputStream; 5import java.io.IOException; 6import java.io.InputStream; 7 8publicclass BufferedStreamDemo { 9publicstaticvoid main(String[] args) throws IOException { 10//BufferedInputStream普通写法11 String file = "out.txt"; 12 InputStream ins = new FileInputStream(file); 13 BufferedInputStream bufin= new BufferedInputStream(ins); 14int b; 15while((b=bufin.read())!=-1){ 16 System.out.println(Integer.toHexString(b)); 17 } 18//常用写法,只要用到FileInputStream的地方都可以套一个BufferedInputStream用来提升性能19 BufferedInputStream in = new BufferedInputStream( 20new FileInputStream("out.txt")); 2122//BufferedOutputStream23 BufferedOutputStream out = new BufferedOutputStream( 24new FileOutputStream("out.txt")); 25 out.write(65); 26 } 27 }


北京联动北方科技有限公司

4.基本类型数据的写出和读入
DataOutputStream  方法:readInt()  readLong()  readBoolean()等
写出(写)

北京联动北方科技有限公司

1例子 2import java.io.*; 3publicclass DataOutDemo { 4publicstaticvoid main(String[] args) 5throws IOException{ 6 String file = "data.dat";//项目文件夹 7 OutputStream out = new FileOutputStream(file); 8//DataOutputStream 实现基本类型数据的序列化 9//将基本类型数据拆开为byte序列,写入到out流中10 DataOutputStream dos = new DataOutputStream(out); 11 dos.write(-2); 12 dos.writeInt(-2); 13 dos.writeLong(-2); 14 dos.writeByte(-2); 15 dos.writeDouble(-2); 16 dos.writeShort(-2); 17 dos.writeFloat(-2); 18 dos.writeBoolean(true); 19

dos.writeChar('中'

); 20 dos.close(); 2122 } 23 }


北京联动北方科技有限公司

DataInputStream   方法:  writeInt()  writeChar() 等8种
读入(读)

北京联动北方科技有限公司

1import java.io.DataInputStream; 2import java.io.FileInputStream; 3import java.io.IOException; 4import java.io.InputStream; 5 6publicclass DataInDemo { 7publicstaticvoid main(String[] args) 8throws IOException{ 910 String file = "data.dat"; 1112 InputStream in = new FileInputStream(file); 13//DataInputStream 从基本流中读取基本类型数据,实现基本 14//类型数据的反序列化15 DataInputStream dis = new DataInputStream(in); 16int b = dis.read(); 17int i = dis.readInt(); 18long l= dis.readLong(); 19byte bx = dis.readByte(); 20double d = dis.readDouble(); 21short s = dis.readShort(); 22float f = dis.readFloat(); 23boolean bol = dis.readBoolean(); 24char c = dis.readChar(); 25 dis.close(); 26 System.out.print( b +" ");//254 fe27 System.out.print(i+" "); 28 System.out.print(l+" "); 29 System.out.print(bx+" "); 30 System.out.print(d+" "); 31 System.out.print(s+" "); 32 System.out.print(f+" "); 33 System.out.print(bol+" "); 34 System.out.print(c+" "); 3536 } 37 }


北京联动北方科技有限公司

5 字符串的序列化(文字的编码方案)
 从char序列到byte序列 的转换,叫"编码"
 1) String 字符串本质上是Char

 2)utf-16be 编码-----将16位char从中间切开为2个byte
     utf -16be是将 unicode char[] 序列化为byte[]的编码方案
     能够支持65535个字符编码,英文浪费空间

    如:
 char[] = ['A',    'B',    '中']
  对应     0041,0042,4e2d

utf-8:国际标准,是将unicode编码为byte序列的方案,采用变长编码 1-N方案,其中英文1个byte,中文3个byte
   unicoded的" 中": 4e 2d = 01001110 00101101
    utf-8的"中":e4 b8 ad =11100100 10111000 10101101

 1110xxxx 10xxxxxx 10xxxxxx


 以0开头的是英文(0-127)
 110表示连续2字节表示一个字符
 1110表示连续3字节表示一个字符
 每个数据字节以10开头

GBK: 中国标准,支持20000+中日韩文,英文编码1byte,中文2byte
 与unicode不兼容,中文windows默认gbk

ISO8859-1:只支持255个英文字符,不支持中文(Sun服务器默认编码,如tomcat等)

例子

北京联动北方科技有限公司

1import java.io.FileOutputStream; 2import java.io.IOException; 3import java.io.OutputStream; 4 5publicclass CharIODemo { 6publicstaticvoid main(String[] args) 7throws IOException{ 8

String str = "ABCD中国"

; 9 System.out.println(str); 10//Java 的字符是16位 Unicode值,而文件是8位Byte序列 1112//GBK13

System.out.println("GBK编码方案,对字符编码"

); 14 String file = "gbk.txt"; 15 OutputStream out = new FileOutputStream(file);//默认GBK编码方案16byte[] gbk = str.getBytes("GBK"); 17 out.write(gbk); 18 out.close(); 19 IOUtils.print(file); 20//UTF-16BE,每个编码是2个字节21

System.out.println("UTF-16BE编码方案,对字符编码"

); 22 file = "utf-16be.txt"; 23 out = new FileOutputStream(file); 24byte[] utf16be = str.getBytes("UTF-16BE"); 25 out.write(utf16be); 26 out.close(); 27 IOUtils.print(file); 2829//UTF-8,英文是1个字节,中文是3个字节30

System.out.println("UTF-8编码方案,对字符编码"

); 31 file = "utf-8.txt"; 32 out = new FileOutputStream(file); 33byte[] utf8 = str.getBytes("UTF-8");//编码string -> byte[]34 out.write(utf8); 35 out.close(); 36 IOUtils.print(file); 3738byte[] buf = IOUtils.read("utf-8.txt"); 39//new String(buf,"UTF-8"),构造器可以将 byte编码序列 40//解码为 char序列(字符串)41 String s = new String(buf,"UTF-8");//解码byte-> String42 System.out.println(s); 43 } 44 }


北京联动北方科技有限公司

6 字符流IO(Reader Writer)
1) 字符的处理,一次处理一个字符(unicode编码)
2) 字符的底层仍然是基本的字节流
3) 字符流的基本实现
 InputStreamReader 完成byte流解析为char流,按照编码解析
 OutputStreamWriter 提供char流到byte流,按照编码处理
4) 字符流的过滤器
  是字符读写的功能扩展,极大的方便了文本的读写操作
    BufferedReader : readLine()   一次读取一行
    PrintWriter : println()  一次打印一行
5)读取一个文本文件

 InputStream is = new FileInputStream("test.txt");
Reader in = new InputStreamReader(is);
BufferedReader reader = new BufferedReader(in);


 或者

 BufferedReader in = new BufferedReader(new FileReader(filename));


例子:

北京联动北方科技有限公司

1import java.io.BufferedInputStream; 2import java.io.BufferedReader; 3import java.io.FileInputStream; 4import java.io.IOException; 5import java.io.InputStreamReader; 6 7publicclass TestReaderDemo { 8publicstaticvoid main(String[] args) 9throws IOException{ 10//Scanner BufferedReader都是流的功能扩展,是过滤器 11// 不能单独使用,最终需要依赖于基本byte流(in) 12//Scanner 提供了nextLine()方法//Java5以后 13//BufferedReader 提供了 readLine()方法,读取一行 14//readLine()读取到文件末尾返回null 1516//逐行读取文本文件,显示到系统控制台 17//工作中常用18 String file = "in.txt"; //为当前工作区workspace/项目名/in.txt19 BufferedReader in = new BufferedReader( 20new InputStreamReader( 21new BufferedInputStream( 22new FileInputStream(file)),"gbk")); 23 String str; 24while((str = in.readLine()) != null){ 25 System.out.println(str); 26 } 27 in.close(); 28 }


北京联动北方科技有限公司

6)写出一个文本文件

 PrintWriter out = new PrintWriter(new FileWriter(new FileOutputStream(filename)));


 或者

 PrintWriter out = new PrintWriter(
new OutputStreamWriter(
new FileOutputStream(filename)))


例子

北京联动北方科技有限公司

1import java.io.IOException; 2import java.io.PrintWriter; 3import java.util.Scanner; 4 5publicclass SyncWriteDemo { 6publicstaticvoid main(String[] args) 7throws IOException{ 8 Scanner in = new Scanner(System.in); 9 String file = "sync.txt"; 10 PrintWriter out = new PrintWriter(file,"UTF-8"); 11while(true){ 12 String str = in.nextLine(); 13 out.println(str); 14if("q".equalsIgnoreCase(str)){ 15break; 16 } 17 } 18 out.close(); 19 } 20 }


北京联动北方科技有限公司

7)系统的默认编码,中文一般是GBK
如何查看默认编码?

String encoding = System.getProperty("file.encoding");


 原文链接:http://www.cnblogs.com/hqr9313/archive/2012/04/23/2467294.html




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论