Java复习7.输入输出流 20131005

前言:

Java中涉及数据的读写,都是基于流的,这一块的知识相当重要,而且在Java中的数据,char字符是16bit的,所以存在字节流和字符流的区别。如果是字符文件的输入输出,使用字符流(以Reader/Writer为抽象基类),而其他的数据是二进制的,需要使用字节流(以InputStream和OutputStream为抽象基类)。

其实不止文件,网络数据传输也是输入输出流。

目录

1.字节流和字符流... 2

1.1字节输入流:... 2

1.2字节输出流:... 5

2.字符流... 6

2.1字符数据流输入:... 6

2.2字符数据流输出:... 7

3.使用缓冲数据流,提高IO的效率,减少IO的次数... 7

3.1缓冲字节流: 8

3.2缓冲字符流:... 9

为了便于理解,附图一张:

 

1.字节流和字符流

字节流就是数据的基本单位是byte,字符流使用字符组成的,基本单位是char,在Java中char是由两个字节保存的。所有的InputStream/OutputStream的子类都可以用于处理二进制数据,他是按照字节存储的,但是对于字符的文本文件,使用字符流比较好。

首先是字节流,基类是InputStream/OutputStream

1.1字节输入流:

InputStream in = null;

try {

String filePath = ClassLoader.getSystemResource("a.txt").getPath();

System.out.println("FilePath:"+filePath);

/*

* 以字节流的方式打开文件,读取的是一个二进制流 byte[] ,如果不存在该文件,则会抛出异常,FileNotFoundException           *

*/

in = new FileInputStream(filePath);

byte[] buf = new byte[100];

// read file from inputstream

/*

* public int read(); read next byte data, if to the file end return -1;

* public int read(byte[] buf);

* Reads up to b.length bytes of data from this input stream into an array of bytes.

* return the total number of bytes read into the buffer, or -1 if there is no more data

* because the end of the file has been reached.

* we should clear the buf or record the read byte number.

*

*/

if(in != null){

/*

* 比较正规的读取方式,这样每一次获取的是一定字节数的byte,保存在响应的字节中,然后

* 将字节数组转换成String输出结果

*/

/*int read_byte_number = -1;

int count = 0;

while( (read_byte_number = in.read(buf, 0, 100)) != -1){

System.out.print(new String(buf,0,read_byte_number));

count++;

}

System.out.println("count:" + count);

*/

/*

*  在文件中的数据,一个ASCII对应的是一个字节,但是一个汉字或者其他的字符,保存在文件中是两个字节

*  我们读取的时候使用read只是读取的一个字节,所以对于ASCII的字符是可以读取出来的,返回值对应的ASCII的int

*  可以将它转换成相应的char;但是对于汉字是不可以的,每次只是读取的一个字符。

*/

int i = in.read();

System.out.println(i+":" + (char)i);

}

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

if(in != null){

try {

in.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

1.2字节输出流:

OutputStream  out = null;

try {

/*

* if the file does not exist, it will create the file

* if the file exists, but append default is false, it will clear the file write new content

* we can use the parameter append = true to append context to the end

*/

out = new FileOutputStream("b.txt",true);

out.write('腾');

/*

* public void write(int b); 可以是一个char但是,如果在ASCII之外的字符,就只能写一byte结构很坑,不可预期

* public void write(byte[] buf);

* public void write(byte[] buf, int start, int length);

*/

} catch (FileNotFoundException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

if(out != null){

try {

out.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

2.字符流

使用字节流是不可以处理中文的,这样我们就必须使用字符流。字符流的基类是Reader/Writer

Reader BufferedReader

           InputStreamReader    FileReader

    Writer BufferedWriter

           OutputStreamWriter       FileWriter

           PrintWriter

这几个是常见的使用的。

2.1字符数据流输入:

Reader reader= null;

try {

reader = new FileReader(ClassLoader.getSystemResource("a.txt").getPath());

char[] buf  = new char[10];

int count = 0;

while((count = reader.read(buf,0,10)) != -1){

System.out.print(new String(buf,0,count));

}

/*

* use public int read() function return 0x0000~0xffff int value

*/

/*int a;

while((a=reader.read()) != -1){

System.out.println((char)a);

}

*/

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

if(reader != null){

try {

reader.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

2.2字符数据流输出:

Writer out = null;

try {

// FileWriter(String filename, boolean append = false);

//FileWriter(File file, boolean append = false);

out = new FileWriter("a.txt",true);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

char buf[] = {'杨','腾','飞','a','b','c'};

if(out != null){

try {

System.out.println(new String(buf,0,buf.length));

out.write(buf, 0, buf.length);

out.flush();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

if(out != null){

try {

out.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

3.使用缓冲数据流,提高IO的效率,减少IO的次数

2中的操作数据流的方法特别低效,不适合远程操作或者是大型项目,我们使用缓冲数据流提高IO的性能。

3.1缓冲字节流:

InputStream   FileInputStream

                  FilterInputStream  BufferedInputStream

    OutputStream  FileOutputStream

                  FilterOutputStream BufferedOutputStream  

将FileInputStream/FileOutputStream转换成

BufferedInputStream/BufferedOutputStream

BufferedInputStream bis = null;

try {

bis = new BufferedInputStream(new FileInputStream("a.txt"));

byte [] buf = new byte[10];

int count = -1;

while( (count = bis.read(buf, 0, 10)) != -1){

System.out.print(new String(buf,0,count));

}

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

if(bis != null){

try {

bis.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

BufferedOutputStream bos = null;

try {

bos = new BufferedOutputStream(new FileOutputStream("b.txt",true));

byte[] buf = null;

String a = "杨腾飞a";

buf = a.getBytes();

bos.write(buf,0,buf.length);

bos.flush();

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

if(bos != null){

try {

bos.flush();

bos.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

3.2缓冲字符流:

BufferedReader/BufferedWriter

BufferedReader breader = new BufferedReader(new FileReader(“filename”))

Example:

BufferedReader breader = null;

try {

breader = new BufferedReader(new FileReader("a.txt"));

char[] buf = new char[10];

int count = -1;

while( (count = breader.read(buf, 0, 10))  != -1){

System.out.print(new String(buf,0,count));

}

//每一次获取一行数据,当遇到行结束的时候,终止,返回的是一个字符串,但是不包含换行符。

/*

String a ;

while((a=breader.readLine()) != null){

System.out.println(a);

}

*/

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

缓冲输出流的话,详细你也会了吧,就这样了

在Java 中的输入输出流是十分重要的一个知识点,后面的网络编程也是需要用到这些输入输出流。

追梦的飞飞

于广州中山大学 20131005

HomePage: http://yangtengfei.duapp.com

Java复习7.输入输出流的更多相关文章

  1. 第27章 java I/O输入输出流

    java I/O输入输出流 1.编码问题 import java.io.UnsupportedEncodingException; /** * java涉及的编码 */ public class En ...

  2. JAVA Io 缓冲输入输出流

    java中提供带缓冲的输入输出流.在打开文件进行写入或读取操作时,都会加上缓冲,提高了IO读写性能. 1. BufferedInputStream 缓冲输入流 2. BufferedOutputStr ...

  3. Java I/O输入输出流详解

    一.文件的编码               开发时一定要注意项目默认的编码!!!!!!!!               文件操作的时候一定要记得关闭!!!!!!!!        ASCII:美国标准 ...

  4. Java IO学习--输入输出流

    一.Java IO的定义 I/O:输入输出系统,由输入输出控制系统和外围设备两部分组成. Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输 ...

  5. java实验8-Java输入输出流

    1 读写文件 [实验目的] (1)掌握文本文件的读写方法. (2)掌握随机文件的读写方法. (3)掌握InputStream.OutputStream抽象类的基本使用. (4)掌握FileInputS ...

  6. Java工具类-输入输出流

    输入输出流 1.概念 输入输出流:文件复制,上传 输出流: System.out.println() 写操作,程序将字符流写入到"目的地",比如打印机和文件等 输入流 :Scann ...

  7. java学习笔记-输入输出流

    ================File类 =====================InputStream ==================OutputStream ============== ...

  8. Java中的输入输出流

    FileInputStream和FileOutputStream 创建含磁盘文件的输入 输出流对象. FileInputStream继承自InputStream,用于读取本地文件中的字节数据,由于所有 ...

  9. 《三》Java IO 字节输入输出流

    那么这篇博客我们讲的是字节输入输出流:InputStream.OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam.FileOutStream)     ...

随机推荐

  1. 企业级项目把.app文件转成.ipa文件的自动化实现

    将MakeIPA.sh添加到项目的根目录下 此脚本针对企业级项目打包,不会编译项目,在打包前确认项目已经编译完成生成了"XXX.app"文件 使用前需要配置该脚本部分路径才能正确打 ...

  2. Web Servlet的体系架构

    Servlet为根接口,里面有5个方法,init() servlet初始化,将ServletConfig作为参数传入,service() 响应请求,destroy() 销毁servlet,getSer ...

  3. shell 脚本中双引号 单引号 反引号 的区别

    转自:http://blog.csdn.net/iamlaosong/article/details/54728393 最近要编个shell脚本处理数据,需要检测数据文件是否存在,文件名中包含日期,所 ...

  4. iis原理介绍

    它是一个程序,负责对网站的内容进行管理,以及对客户的请求(就是Http请求)做出反应.当用户对一个页面提出请求时,IIS做如下反应(忽略权限):1.把对方请求的虚拟路径转换成物理路径2.根据物理路径搜 ...

  5. Python面试题之Python反射机制

    0x00 前言 def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') def f4(): print('f4') a = ...

  6. 20145216《java程序设计》课程总结

    20145216<java程序设计>课程总结 每周读书笔记链接汇总 第一周学习总结 20145216<java程序设计>第一周总结 第二周学习总结 20145216<ja ...

  7. ELK出现unassigned_shards查看及删除

    问题 用3台服务器搭建了ELK系统,有一天出现有几个索引一直无法同步,重启了elasticsearch也不行 如下图:elk-cluster一直处于red状态 解决方法 一,查看elasticsear ...

  8. Linux 修改SSH端口及禁用ROOT远程SSH登陆

    打开配置文件: vim /etc/ssh/sshd_config 修改Port及PermitRootLogin节点 : //默认为yes 允许 no表示禁止 PermitRootLogin no // ...

  9. SQL优化的若干原则

    SQL语句:是对数据库(数据)进行操作的惟一途径:消耗了70%~90%的数据库资源:独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低:可以有不同的写法:易 ...

  10. Python基础笔记系列十:模块

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 模块 #1.类比于java中的jar包,模块能让你能够有逻辑地组织你的Py ...