Java中的流
一、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中的流的更多相关文章
- 理解Java中字符流与字节流的区别
1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...
- Java中IO流的总结
有关Java中IO流总结图 流分类 按方向分 输入流 输出流 按单位分 字节流 字符流 按功能分 节点流 处理流(过滤流) 其他 所有的流继承与这四类流:InputSteam.OutputStream ...
- java中有关流操作的类和接口
一.java操作l流有关的类和接口 1.File 文件类 2.RandomAccessFile 随机存储文件类 3.InputStream 字节输入流 4.OutputStream 字节输出流 5.R ...
- 理解Java中字符流与字节流
1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个"流动的方向",通常可 ...
- 理解Java中字符流与字节流的区别(转)
1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...
- Java中对象流使用的一个注意事项
再写jsp的实验作业的时候,需要用到java中对象流,但是碰到了之前没有遇到过的情况,改bug改到崩溃!!记录下来供大家分享 如果要用对象流去读取一个文件,一定要先判断这个文件的内容是否为空,如果为空 ...
- java 中 IO 流分为几种?(未完成)
java 中 IO 流分为几种?(未完成)
- Java中IO流,输入输出流概述与总结
总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...
- java中IO流小解
下面这张图列出了java中一些处理流: java中根据操作对象的不同可以分为:字节流和字符流. 首先我们先表示一下什么叫节点流和处理流: 节点流:可以从或向一个特定的地方(节点)读写数据.如FileR ...
- 【转】输入/输出流 - 深入理解Java中的流 (Stream)
基于流的数据读写,太抽象了,什么叫基于流,什么是流?Hadoop是Java语言写的,所以想理解好Hadoop的Streaming Data Access,还得从Java流机制入手.流机制也是JAVA及 ...
随机推荐
- 【C#进阶系列】09 关于参数的故事
可选参数和命名参数 不多说,上代码,自然懂 class Program { static void Main(string[] args) { var troy = new Troy(); troy. ...
- 与众不同 windows phone (38) - 8.0 关联启动: 使用外部程序打开一个文件或URI, 关联指定的文件类型或协议
[源码下载] 与众不同 windows phone (38) - 8.0 关联启动: 使用外部程序打开一个文件或URI, 关联指定的文件类型或协议 作者:webabcd 介绍与众不同 windows ...
- visual studio 2013 配置开发环境
https://www.visualstudio.com/explore/xamarin-vs http://sourceforge.net/projects/easyeclipse/files/?s ...
- 才知道百度也提供了智能DNS服务 - 加速乐
http://jiasule.baidu.com/ 智能DNS 依托百度多年积累的高精度DNS识别库,平均只需5秒全球DNS服务器全部生效,百度蜘蛛1秒生效.抗攻击.无限解析记录,免费支持电信.联通. ...
- UGUI之布局的使用
unity的LayoutGroup分为三种, Horizontal Layout Group(水平布局):对象填充总个父物体,水平会填充 Vertical Layout Group(垂直布局):垂直( ...
- ahjesus用forever管理nodejs服务
全局安装forever npm install -g forever 查看帮助 forever -h 查看安装位置 whereis forever 编写自己的sh文件 forever -p web文件 ...
- mysql ALL_O_DIRECT引发的unaligned AIO/DIO导致hang
公司内部有一套mysql环境,使用的是percona server分支(和其他几十套环境的版本.参数完全相同),就这套环境每隔两三天就会hang一次,关键hang的时候服务器cpu也就是百分之三四十, ...
- 【GOF23设计模式】外观模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_外观模式.公司注册流程.迪米特法则 package com.test.facade; public interface 工 ...
- jQuery对复选框(checkbox)的全选,全不选,反选等的操作
效果截图: HTML代码: <body><ul id="list"> <li><label><input type=" ...
- 使用sublime text 2 版本至今我所遇到的问题及解决方法
1.汉化:下载汉化包 .打开程序Preference下的浏览包文件夹.将解压的程序包粘贴进包文件夹2.破解:标题栏上面有带(unregistered)表示还没有注册: 打开HELP→Enter lic ...