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及 ...
随机推荐
- spring注解配置启动过程
最近看起spring源码,突然想知道没有web.xml的配置,spring是怎么通过一个继承于AbstractAnnotationConfigDispatcherServletInitializer的 ...
- Python函数:一个简单的迭代
#!/usr/bin/env python # -*- coding: utf-8 -*- def fact(n): if n == 1 : return 1 return n * fact(n-1) ...
- 如何rename sqlserver database
Problem Sometimes there is a need to change the name of your database whether this is because the or ...
- MVC中的CSRF解决方案
我们使用Ajax访问请求的时候,攻击者可能盗用了用户身份,以用户合法身份发送恶意请求. 具体预防措施, 1.在Html表单里面使用@Html.AntiForgeryToken(),这玩意会生成一对加密 ...
- 桥牌笔记:Show up Squeeze显露挤牌法
南主打4S,注意一个叫牌过程,西家叫过加倍,东家应叫过2D. 西连打红桃K.A,然后再打红桃J让东家将吃.东家上手后,回小方块.此时庄家已经失了3墩了,如何完成这个4S? 庄家必须拿到所有剩下的牌墩. ...
- Jenkins部署.net自动化构建
1.环境部署: windows server 2008R2环境 2.相关软件 SVN(源代码管理器:jenkins通过插件从源代码管理器下载代码) Jenkins(主角)地址:http://f ...
- 【转】c++中引用的全方位解读
对于习惯使用C进行开发的朋友们,在看到c++中出现的&符号,可能会犯迷糊,因为在C语言中这个符号表示了取地址符,但是在C++中它却有着不同的用途,掌握C++的&符号,是提高代码执行效率 ...
- 在xib中添加手势控件后运行可能会出现的错误
如果出现错误: // -[UITapGestureRecognizer superview]: unrecognized selector sent to instance 0x8e407a0 // ...
- iOS开发~UI布局(二)storyboard中autolayout和size class的使用详解
一.概要:前一篇初步的描述了size class的概念,那么实际中如何使用呢,下面两个问题是我们一定会遇到的: 1.Xcode6中增加了size class,在storyboard中如何使用? 2.a ...
- C# C/S WPF 远程操作服务器上面的文件
作的时候用的是WPF,需要做一个上传附件的功能,服务器上有一个文件夹,附件都上传到里面,只知道URL路径. 文件夹是在服务器上的IIS里面(就比如说你发布一个网站,把文件夹建在网站下面,当然这个网站啥 ...