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. java常用重构优化总结--自己亲身体验

    代码重构  6大原则:    单一职责原则(一个类最好最好只有一种行为动机,太多承担职责会导致耦合度太高).    开放封闭原则(功能可以扩展,但是不可以内部修改).    依赖倒转原则(应该依赖抽象 ...

  2. SRM 358(1-250,500pt)

    DIV1 250pt 题意:电视目前停留在第100台,有一个遥控器,可以向上或向下换台(需要按键一次),也可以按一些数字,然后直接跳到该台(需要按键次数等于数字数,不需要按确定键).但是,这个遥控一些 ...

  3. SOA技术的进化史

    SOA 是一种程序设计思想,其实早在远古时代(计算机史)它就已经出现了.无非就是把系统分解,将数据和业务逻辑部分尽量独立出来,然后以服务形式提供给另外的系统共用. 那时也有一些可以实现 SOA 的工具 ...

  4. 20169210《Linux内核原理与分析》第五周作业

    本次内容分为两部分,第一部分是实验,第二部分是教材的第四章和第六章. 第一部分:实验 本次的实验内容是构造一个简单的Linux系统MenuOS,过程如下. 首先使用如下命令进入LinuxKernel ...

  5. (转)BAT及各大互联网公司2014前端笔试面试题--Html,Css篇

    BAT及各大互联网公司2014前端笔试面试题--Html,Css篇   很多面试题是我自己面试BAT亲身经历碰到的.整理分享出来希望更多的前端er共同进步吧,不仅适用于求职者,对于巩固复习前端基础更是 ...

  6. SSH开源框架考试题

    一.选择题 1.不属于Action接口中定义的字符串常量的是____B___. A.SUCCESS                              B.FAILURE C.ERROR     ...

  7. Conditionals with Omitted Operands (x ? : y)

    Conditionals with Omitted Operands The middle operand in a conditional expression may be omitted. Th ...

  8. MachineKey

    我是在收到用户发来的这个错误信息的截图后才认识到什么是MachineKey的. 有关MachineKey的概念.MachineKey的生成以及web.config文件里的配置,网上一搜一大堆,为了方便 ...

  9. Android Socket编程基础

    前些天写了一个Android手机在局域网内利用Wifi进行文件传输的Demo,其中用到了Socket编程,故此总结(盗了网友的一些图和文字).好久好久没来博客园了~~ 1.什么是Socket? soc ...

  10. OPENCV中滑动条的使用

    //文中存在两种不同的图像的平滑类型.一类是彩色图像,还有一类是灰度图像.经证明,两种均能够 #include<cv.h> #include<highgui.h> #inclu ...