一、Java中流的原理

流是个抽象的概念,是对输入输出设备的抽象,Java程序中,对于数据的输入/输出操作都是以“流”的方式进行。设备可以是文件,网络,内存等。

四种基本流InputStream,OutputStream,Reader,Writer又分别有更具体的子类,分为文件流,缓冲流,数据流,转换流,Print流,Object流等,都分别有特定的功能或用来操作特定的数据。

二、字节流

    2.1 InputStream

继承自InputStream的流用于向程序中输入数据,且数据的单位是8bit。

代码示例:

 public static void main(String[] args) throws IOException{

         File f=new File("f:\\a.txt");
if(f.exists()){
System.out.println("文件存在");
}else{
f.createNewFile();//用于创建文件
//f.setReadOnly();
System.out.println(f.getName()+"文件是否可读:"+f.canRead());
System.out.println(f.getName()+"文件是否可写:"+f.canWrite());
} InputStream in=new FileInputStream(f);
int data=in.read();
while(data!=-1)
{
char e = (char)data;
System.out.print(e + " ");
data = in.read();
} }

read()方法是一个字节一个字节地往外读,每读取一个字节,就处理一个字节。read(byte[] buffer)方法读取数据时,先把读取到的数据填满这个byte[]类型的数组buffer(buffer是内存里面的一块缓冲区),然后再处理数组里面的数据。

2.2、OutputStream

OutputStream和InputStream相对应为字节输出流,用于向外部设备例如文件中写数据

代码示例:

 File f=new File("f:\\a.txt");
if(f.exists()){
System.out.println("文件存在");
}else{
f.createNewFile();//用于创建文件
//f.setReadOnly();
System.out.println(f.getName()+"文件是否可读:"+f.canRead());
System.out.println(f.getName()+"文件是否可写:"+f.canWrite());
} OutputStream out=new FileOutputStream(f);
String str="Hello world!";
byte[] b=str.getBytes();
out.write(b);
out.flush();
out.close();

write(byte[] b):将 b.length 个字节从指定的 byte 数组写入此输出流。

write(byte[] b, int off, int len):将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。

write(int b):将指定的字节写入此输出流,b为ascll码。

2.3、字节缓冲流

三、字符流

    字节流和字符流的区别就是读取方式一个为按字节读取,一个是按字符读取。在读取文件想对文件内容进行处理,比如修改某一行的时候一般使用字符流,二仅仅是读取文件一般使用字节流。

3.1、Reader流和writer流

代码示例:

 import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; public class wr { public static void main(String[] args) throws IOException{
File f=new File("f:\\a.txt");
if(f.exists()){
System.out.println("文件存在");
}else{
f.createNewFile();//用于创建文件
//f.setReadOnly();
System.out.println(f.getName()+"文件是否可读:"+f.canRead());
System.out.println(f.getName()+"文件是否可写:"+f.canWrite());
} FileWriter fw = new FileWriter(f);
String str="asdw";
fw.write(str);//向文件中写入asdw
fw.write(str,0,2);//向文件中写入as
char c='a';
fw.write(c);//向文件中写入a
fw.flush();//使用字符流必须要对缓存进行刷新才能向文件中写入内容
fw.close();//调用close()函数时自动对缓存进行刷新
//注意,OutputStream中还有append()方法可以对文件内容进行追加输出,详见Java API。 FileReader fr = new FileReader(f);
int b=0,num=0;
while((b = fr.read())!= -1){
System.out.print((char)b );
num++;
}
System.out.println("输出了"+num+"个字符!");
} }

3.2 字符缓冲流

带有缓冲区的,缓冲区(Buffer)就是内存里面的一小块区域,读写数据时都是先把数据放到这块缓冲区域里面,最后对缓冲区内容统一操作,减少io对硬盘的访问次数,保护我们的硬盘。

-BufferedWriter bw = new BufferedWriteer(fw);

-BufferedReader br = new BufferedReader(fr);

 import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter; public class Buffertry { public static void main(String args[]){ try{
File f=new File("f:\\a.txt");
if(f.exists()){
System.out.println("文件存在");
}else{
f.createNewFile();//用于创建文件
//f.setReadOnly();
System.out.println(f.getName()+"文件是否可读:"+f.canRead());
System.out.println(f.getName()+"文件是否可写:"+f.canWrite());
} BufferedWriter bw = new BufferedWriter(new FileWriter(f));
String s = null;
for(int i=0;i<100;i++){
s = String.valueOf(Math.random());//“Math.random()”将会生成一系列介于0~1之间的随机数。
bw.write(s);
bw.newLine();//调用newLine()方法使得每写入一个随机数就换行显示
}
bw.flush();//调用flush()方法清空缓冲区 BufferedReader br = new BufferedReader(new FileReader(f));
while((s = br.readLine())!=null){
//使用BufferedReader处理流里面提供String readLine()方法读取文件中的数据时是一行一行读取的
System.out.println(s);
}
bw.close();
br.close();
}catch(Exception e){
e.printStackTrace();
}
}
}

3.3、转换流

字节输入流转换为字符输入流:InputStreamReader是字节流转化为字符流的桥梁,它将字节去出并且按照指定方式解码为字符,构造方法为

InputStreamReader(InputStream in);//详见Java API

字节输出流转换为字符输出流:OutputStreamWriter继承自Writer,可以将指定写入流中的字符编码为字节

OutputStreamWriter(OutputStream out);//详见Java API

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; public class changetry { public static void main(String[] args) throws IOException{ InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
System.out.println("请输入:");
String str=br.readLine();
System.out.println("输入内容:"+str); } }
         File f=new File("f:\\a.txt");
FileOutputStream fos = new FileOutputStream(f);
OutputStreamWriter os = new OutputStreamWriter(fos);
BufferedWriter bos = new BufferedWriter(os);
bos.write("hahahaha");
bos.close();
os.close();
fos.close();

Java中的流的更多相关文章

  1. 理解Java中字符流与字节流的区别

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...

  2. Java中IO流的总结

    有关Java中IO流总结图 流分类 按方向分 输入流 输出流 按单位分 字节流 字符流 按功能分 节点流 处理流(过滤流) 其他 所有的流继承与这四类流:InputSteam.OutputStream ...

  3. java中有关流操作的类和接口

    一.java操作l流有关的类和接口 1.File 文件类 2.RandomAccessFile 随机存储文件类 3.InputStream 字节输入流 4.OutputStream 字节输出流 5.R ...

  4. 理解Java中字符流与字节流

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个"流动的方向",通常可 ...

  5. 理解Java中字符流与字节流的区别(转)

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...

  6. Java中对象流使用的一个注意事项

    再写jsp的实验作业的时候,需要用到java中对象流,但是碰到了之前没有遇到过的情况,改bug改到崩溃!!记录下来供大家分享 如果要用对象流去读取一个文件,一定要先判断这个文件的内容是否为空,如果为空 ...

  7. java 中 IO 流分为几种?(未完成)

    java 中 IO 流分为几种?(未完成)

  8. Java中IO流,输入输出流概述与总结

    总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...

  9. java中IO流小解

    下面这张图列出了java中一些处理流: java中根据操作对象的不同可以分为:字节流和字符流. 首先我们先表示一下什么叫节点流和处理流: 节点流:可以从或向一个特定的地方(节点)读写数据.如FileR ...

  10. 【转】输入/输出流 - 深入理解Java中的流 (Stream)

    基于流的数据读写,太抽象了,什么叫基于流,什么是流?Hadoop是Java语言写的,所以想理解好Hadoop的Streaming Data Access,还得从Java流机制入手.流机制也是JAVA及 ...

随机推荐

  1. 重新想象 Windows 8.1 Store Apps (82) - 绑定: DataContextChanged, TargetNullValue, FallbackValue, UpdateSourceTrigger

    [源码下载] 重新想象 Windows 8.1 Store Apps (82) - 绑定: DataContextChanged, TargetNullValue, FallbackValue, Up ...

  2. 【Android】Android SDK Manager更新慢/失败的问题

    前言:更新下载Intel x86 Atom_64 System Image的时候总是失败,速度只有几KB,我这是10M的网啊. 最后找到一篇日志,解决了这个问题.非常感谢!其参考地址:http://w ...

  3. SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法

    最近angularjs post到后台 400一头雾水 没有任何错误. 最后发现好文,感谢作者 SpringMVC中出现" 400 Bad Request "错误(用@Respon ...

  4. HTML JavaScript简介

    一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司 ...

  5. C++之多态的一个例子

    [例12.1] 先建立一个Point(点)类,包含数据成员x,y(坐标点).以它为基类,派生出一个Circle(圆)类,增加数据成员r(半径),再以Circle类为直接基类,派生出一个Cylinder ...

  6. JY游戏之手游《打卡乐猫》

    JY游戏之手游戏<打卡乐猫> JY是一款专门制作js小游戏的js库,它集成了一些对网页类小游戏的功能帮助 ,能帮你更快的完成js开发,它的主体框架包JY.JYG.Sprite.Sprite ...

  7. 配置SharePoint使用ADFS

    1. 如果网站应用程序没有使用声明式验证 $wpp = Get-SPWebApplication <URL> $wpp.UseClaimsAuthentication = 1 $wpp.U ...

  8. Linux0.11内核剖析--内核体系结构

    一个完整可用的操作系统主要由 4 部分组成:硬件.操作系统内核.操作系统服务和用户应用程序,如下图所示: 用户应用程序是指那些字处理程序. Internet 浏览器程序或用户自行编制的各种应用程序: ...

  9. asp xmlhttp 读取文件

    Response.Write LoadTxtFile("URL") Function LoadTxtFile(LoadFile) Dim XMLHTTP, XMLDOC, Resp ...

  10. C语言-05-内存分析

    一.进制 1> 内存细节 根据数据类型分配相应大小的内存空间 内存空间由高地址向低地址分配 数据一般按照从高位到低位存储 2> 常用的进制格式 十进制 ① 由0~9十个数字组成 ② 逢10 ...