Java中I/O的原理:

在java程序中,对于数据的输入/输出操作以”流“的方式进行的。

流是内存中一组有序数据序列

Java将数据从源读入到内存当中,形成了流,然后这些流可以写到目的地。

Java中流按功能分为:节点流(原始流)和处理流(包裹流)

处理流是在节点流的基础上提供了更加强大的读写功能

Java中流按处理数据的不同分为字节流和字符流

字节流:以字节为单位来处理数据的,字节流数据为8位,一般用于对二进制的数据的读写,例如声音,图像等。

字符流:以字符为单位来处理数据的,一般用于读写文本文件的

字节流

  • 字节流的基类是抽象类InputStream和OutpuStream。
  • InputStream用于输入,OutputStream用于输出。
     package src;

     import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; public class Test { public static void main(String[] args) {
//输入外->内,读入数据,输出:内->外,写数据 //任务:从file1文件读取数据到内存,a.输出到控制台验证,b.输出到file2文件中
//1,创建一个给予file1的文件对象,,创建一个给予file2的文件对象,
File f1=new File("c:\\file1.txt"); File f2=new File("c:\\file2.txt");
//2、 建立一个基于c:\\file1.txt文件的输入通道fis,建立一个基于c:\\file2.txt文件的输 出通道fos,
try {
FileInputStream fis=new FileInputStream(f1);
FileOutputStream fos=new FileOutputStream(f2);
//3、把通道fis数据读入到内存,从内存写到file2文件
int m;
while((m=fis.read())!=-1)
{
fos.write(m);
} } catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} }
}

InputStream类:InputStream类是一个输入流,同样也是一个字节流。
InputStream类是表示字节输入流的所有类的超类。其中定义了一些基本的读取字节数据流的方法,由其子类继承并扩展。
OutputStream类是所有输出流的父类,它是一个抽象类,不能被实例化。它提供了一系列和写数据有关的方法。
OutputStream类最重要的方法是写入数据的write()方法。

其它方法:

void close():当完成写操作后,应该关闭输出流。
void flush():OutputStream类本身的flush()方法不执行任何操作,它的一些带有缓冲区的子类(比如BufferedOutputStream和PrintStream类)覆盖了flush()方法。通过带缓冲区的输出流写数据时,数据先保存在缓冲区中,积累到一定程度才会真正写到输出流中。缓冲区通常用字节数组实现,实际上是指一块内存空间。flush()方法强制把缓冲区内的数据写到输出流中

字节流子处理流

缓冲字节流: BufferedInputStream和BufferedOutputStream是缓冲字节流,它们通过减少读写I/O设备次数来加快输入输出速度。

缓冲流不能独立存在。
数据流类:DataInputStream,DateOutputStream,可以按照与平台无关的方式从流中读取基本类型(int,char和long等)的数据.

FileInputStream和FileOutputStream只能读写字节,基本类型数据和字符串用数据流进行包装。
数据流不能独立读写。
处理流不能独立存在,必须依附于结点流

字符流

字符流的基类是抽象类Reader和Writer。Reader负责输入,Writer负责输出。
Reader类是一个输入流,同样也是一个字符流。Reader类是所有输入字符流的超类,也就是说所有的输入字符流都派生自Reader类,其中提供了很多关于字符流输入操作的方法
 package src;

 import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; public class Test { public static void main(String[] args) { File f1=new File("d:\\file1.txt"); File f2=new File("d:\\file2.txt"); try {
FileReader fis=new FileReader(f1);
FileWriter fos=new FileWriter(f2); int m;
while((m=fis.read())!=-1)
{
//输出到控制台上
//System.out.print((char)(m));
//输出到file2.txt文件上
fos.write((char)(m));
} } catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}

字符流之处理流

和字节流一样,字符流也有处理流
缓冲流:BufferedReader输入流,BufferedWriter输出流
转换流:将字节流转换成字符流,InputStreamReader输入流,InputStreamWriter。、
处理流不能独立存在,必须依附于结点流。

系统类及流的概念

System类是Java语言中一个功能强大、非常有用的类,它提供了

标准输入/输出及运行时的系统信息。从System类不能创建对象,也

就是说,System类的所有属性和方法都是静态的,引用时要以

System作为前缀。System.in与System.out是System类的两个静态

属性,分别对应系统的标准输入/输出流。

其中,System.in称为标准输入流,用于程序输入,通常读取用户

从键盘输入的信息;System.out称为标准输出流,用于程序输出,

通常向用户显示信息;System.err称为标准错误流,用于向用户显示

出错信息。

System.in其实也是一个字节输入流。
System.in继承自InputStream类,所以InputStream类中的方法在System.in中都有。 
 
 package src;

 import java.io.IOException;

 public class Test {

     public static void main(String[] args) {

         System.out.println("请输入数据:");
try {
int i = System.in.read();
System.out.println("输入的数据为:"+(char)i);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
 
 //读取控制台信息到文件中去,当输入“q”时退出
package src; import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; public class Test { public static void main(String[] args) { File f = new File("d:\\file1.txt");
try {
FileOutputStream fop = new FileOutputStream(f);
while(true){
//创建缓冲数组
byte[] b = new byte[1024];
System.out.println("请输入数据:");
//将输入的数据放入缓冲区中,返回输入的字符串
int len = System.in.read(b);
if(b[0]=='q'){
System.out.println("退出");
break;
}else{
//将数据从0偏移开始读取len个字符
fop.write(b, 0, len);
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}

数据流

FileInputStream和FileOutputStream只能读写字节,如果我们要读写int、double或者字符串类型就要使用数据流进行包装。
数据流用DataInputStream和DataOutputStream类,不能独立读写,必须对字节流进行包装后才能读写数据。数据流也是一种字节流。 
 

DataInputStream类

构造方法
DataInputStream(InputStream in)
成员方法
boolean readBoolean()  //从输入流读取一个布尔值。
byte readByte()  //从输入流读取一个byte值。
char readChar()  //从输入流读取一个char值。
double readDouble()  //从输入流读取一个double值。
float readFloat()  //从输入流读取一个float值。
int readInt()  //从输入流中读取一个int值。
String readUTF()  //将输入流放回UTF字符串。
 

缓冲流(字符流)

BufferedReader和BufferedWriter类的作用与BufferedInputStream和BufferedOutputStream一样,通过内存缓冲区来减少I/O设备读写响应次数来提高输入输出速度。
BufferedReader和BufferedWriter是针对字符的缓冲输入输出流。同样它也不能独立读写数据必须包装字符流进行读写工作。 

转换流

有时候我们需要将字节流转换成字符流,并且将字节流中读取到的字节按照指定字符集转换成字符并输入显示,或者将要写入的字符按照指定字符集转换成字节输出存储。这个时候就需要用到转换流。
JavaSE API提供了两个转换流:InputStreamReader和OutputStreamWriter。前者用于字节输入流的转换,后者用于字节输出流的转换。 

Java中I/O的分析的更多相关文章

  1. Java中ArrayList源码分析

    一.简介 ArrayList是一个数组队列,相当于动态数组.每个ArrayList实例都有自己的容量,该容量至少和所存储数据的个数一样大小,在每次添加数据时,它会使用ensureCapacity()保 ...

  2. Java中json工具对比分析

    Java中几个json工具分析 1, 环境 JDK1.6+IDE(IntelliJ IDEA)+windowsXP+GBK编码 2,分析对象 jackson1.8.2 http://jackson.c ...

  3. Eclipse中的快捷键快速生成常用代码(例如无参、带参构造,set、get方法),以及Java中重要的内存分析(栈、堆、方法区、常量池)

    (一)Eclipse中的快捷键:  ctrl+shift+f自动整理选择的java代码 alt+/ 生成无参构造器或者提升信息 alt+shift+s+o 生成带参构造 ctrl+shift+o快速导 ...

  4. 大杂烩 -- Java中Iterator的fast-fail分析

    基础大杂烩 -- 目录 Java中的Iterator非常方便地为所有的数据源提供了一个统一的数据读取(删除)的接口,但是新手通常在使用的时候容易报如下错误ConcurrentModificationE ...

  5. Java中的<< 和 >> 和 >>> 分析理解

    Java中的<< 和 >> 和 >>> 详细分析 <<表示左移移,不分正负数,低位补0: 注:以下数据类型默认为byte-8位 左移时不管正负,低 ...

  6. Java中关于“=”和“==”的分析

    Java中变量分为普通原始变量(int char float等)和对象 一"=" (1)普通原始变量 普通原始变量的声明和赋值语句例如以下 int a=3; int b=a; 此时 ...

  7. Java中Iterator的fast-fail分析

    1.fail-fast简介 fail-fast机制是java集合(Collection)中的一个错误机制.当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件. 例如:当某一个线 ...

  8. Java中的递归原理分析

    解释:程序调用自身的编程技巧叫做递归.        程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用 ...

  9. java中i=i++问题分析

    http://www.ticmy.com/?p=43 重点:局部变量表 和 操作数栈的执行过程. 使用javac编译后再使用javap -c Test反编译这个类查看它的字节码,如下(只摘取main方 ...

随机推荐

  1. (转载)Chrome 快捷键 整理版

    (转载)http://www.douban.com/group/topic/13802153/ chrome窗口和标签页快捷键: Ctrl+N 打开新窗口 Ctrl+T 打开新标签页 Ctrl+Shi ...

  2. HDU 5948 Thickest Burger 【模拟】 (2016ACM/ICPC亚洲区沈阳站)

    Thickest Burger Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  3. ASP.NET返回Json数据

    Schedule.ashx: <%@ WebHandler Language="C#" Class="Schedule" %> using Syst ...

  4. Poj 3695-Rectangles 矩形切割

    Rectangles Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3846   Accepted: 1124 Descri ...

  5. MSW下wxWidgets的安装与编译

    教程摘自网上各大博客.贴吧.论坛,结合自己的实践做了一些实质性的修改. 一.安装 首先从http://sourceforge.net/projects/wxwindows/files/2.8.12/w ...

  6. javascript检测属性

    javascript 对象可以看做属性的集合.我们可以通过三种方式来判断某个属性是否存在于某个对象中. 1.in操作符 var o={x:1} "x" in o //True :x ...

  7. weekend110(Hadoop)的 第二天笔记

    (2015年1月11日) 课程目录 01-NN元数据管理机制 02-NN工作机制2 03-DN工作原理 04-HDFS的JAVA客户端编写 05-filesystem设计思想总结 06-hadoop中 ...

  8. latin1字符集在navicat下显示乱码(mysql)

    用navicat查看一个表的内容时显示如下

  9. ReactiveCocoa框架学习1

    写block直接使用inline block的声明类型 在ARC中使用strong,如果不使用strong,则会被销毁 在非ARC中使用copy block在开发中的使用场景 把block保存到对象中 ...

  10. Thoughtworks的技术雷达

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:Thoughtworks的技术雷达.