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及 ...
随机推荐
- Python tools for Visual Studio插件介绍
Python tools for Visual Studio是一个免费开源的VisualStudio的插件,支持 VisualStudio 2010,2012与2013.我们想要实现的是: ...
- [Xamarin.Android] 发布NuGet套件
[Xamarin.Android] 发布NuGet套件 前言 在Xamarin中,可以将自己开发的项目包装成为NuGet套件发布至NuGet Server,来提供其他开发人员使用.本篇介绍如何封装并发 ...
- .net aes加密视频等文件
公司学习平台在app端下载下来的视频需要加密 随查找资料参考一些写法 写了aes的加密方法 记录防止忘记 using System; using System.Collections.Generic; ...
- SQL Server Merge语句的使用
Merge关键字在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根据与源表联接的结果,对目标表执行插 ...
- JavaScript String(字符串)对象 实例
返回字符串的长度: <html> <body> <script type="text/javascript"> var txt="He ...
- ALV常用参数详细描述
调用功能模块: CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_interface_check = '' ...
- DataTable 转换为ArrayList 再转换成 json 格式
//JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer(); //javaScriptSeriali ...
- SharePoint固定的Footer
原文地址:http://www.eliostruyf.com/sticky-footer-solution-for-sharepoint-2013/ 照搬全文: OFFICE 365 & SH ...
- Android自动更新安装后显示‘完成’‘打开’按钮
/** * 安装apk * * @param url */ private void installApk() { File apkfile = new File(apkFilePath); if ( ...
- Python基础(9)--正则表达式
正则表达式是一个很有用的工具,可处理复杂的字符匹配和替换工作.在Python中内置了一个re模块以支持正则表达式. 正则表达式有两种基本的操作,分别是匹配和替换. 匹配就是在一个文本字符串中搜索匹配一 ...