流
流:从输入/输出源到目标之间的有序数据
a)比如水流、电流、气流;计算机中流的本质是脉冲电流。
b)为进行数据的输入/输出操作,Java中把不同的输入/输出源(键盘、文件、网络连接等)抽象表述为“流”(stream)
c)Stream是从起源(source)到接收(sink)的有序数据
d)java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能
流的分类
根据处理的单位不同分为:字节流和字符流
根据流向不同分为:输入流和输出流
根据作用不同分为:转换流和包装流(初学者了解即可)
节点流:是可以从一个特定的数据源(节点)读写数据的流(例如文件,内存)。就像是一条单一的管子接到水龙头(节点)上开始放水。
处理流:是“连接”在已经存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。就像在已经接了一条管子(节点流)的基础上,又接了一个过滤器一样
字节输入流
常用类和方法
类
|
说 明
|
FileInputStream
|
将文本文件读取到输入流中
|
ByteArrayInputStream
|
将内存缓冲区中的数组读取到输入流进行操作
|
StringBufferInputStream
|
将一个String对象读取到输入流进行操作
|
PipedInputStream
|
实现了管道(pipe)的概念通常用于线程间的数据传递
|
SequenceInputStream
|
将多个输入流串联在一起
|
方法名称
|
说 明
|
abstract int read( )
|
读取一个字节并返回,返回值=-1表示没有读取到任何字节,读取结束
|
int read(byte b[ ])
|
从流中读取数据,直至流读完或存满数组b,返回值是读取的字节数
|
int read(byte b[ ], int offset, int len)
|
将数据读入数组b,从数组的偏移量offset位置开始存,用len指定读取的最大字节数
|
int available( )
|
获取输入流中可以读取的字节数
|
long skip(long n)
|
跳过N个字节,从N+1处读取
|
boolean markSupported()
|
判断流是否支持标记功能
|
void mark(int readlimit)
|
标记当前位置
|
void reset()
|
回到上一个使用mark方法标记的位置
|
int close( )
|
关闭流
|
注意:若输入流阻塞,available( )可能只会返回0,只有继承了InputStream的子类对象调用才有用
mark(int readlimit)标记会在后续读取字节数达到readlimit和输入流的缓冲区大小两者中的最大值时失效
实例
package io;
import java.io.*;
/**
* 演示InputStream类常用方法
* @author 学霸联盟 - 赵灿
*/
public class InputStreamDemo {
public static void main(String[] args) {
byte[] b = {23,34,56,6,7,8,95,88,98};
//创建输入流的对象
InputStream is = new ByteArrayInputStream(b);
int i=0 ;
try{
//每次循环从输入流is中读取一个字节,将其自动转换成int类型值,并赋值给变量i;
//如果i==-1就代表流中的数据已经读取完毕,结束循环
while((i=is.read())!=-1){
System.out.println(i);
}
System.out.println("第一次读完后,缓冲区中输入流对象is中剩余的字节数为:"+is.available());
System.out.println("判断输入流的对象is是否支持mark/reset:"+is.markSupported());
//重置流到开始位置(下标为0处)
is.reset();
System.out.println("重置后,缓冲区中输入流对象is中剩余的字节数为:"+is.available());
//从流is中跳过n个字节
is.skip(3);
is.mark(10);
System.out.println("跳过3个字节后,缓冲区中输入流对象is中剩余的字节数为:"+is.available());
System.out.println("----------------------------");
byte[] b1 = new byte[20];
//根据传入的第二个参数(偏移量)决定从第一个参数b1的哪个下标开始存入值
//第三个参数:读取的长度,超出流中的长度不会出现异常
// 如果读取长度小于流中值的长度,就按传入的长度读取
is.read(b1,2,5);
System.out.println("----------------------------");
//应该reset至mark方法标记处
is.reset();
System.out.println(is.read());
System.out.println("----------------------------");
for(int k =0;k<b1.length;k++){
System.out.println(b1[k]);
}
}catch(IOException ex){
ex.printStackTrace();
}finally{
try{
//关闭流
is.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
package io;
import java.io.*;
/**
* 演示FileInputStream类
* @author 学霸联盟 - 赵灿
*/
public class FileInDemo {
public static void main(String[] args) {
File file = new File("C:/file.txt");
//创建一个文件输入流
FileInputStream fis = null;
try{
//第一种构造方式创建对象
//fis = new FileInputStream("c:/file.txt");
//第二种构造方式创建对象
fis = new FileInputStream(file);
int i;
while((i=fis.read())!=-1){
System.out.println(i);
}
System.out.println(fis.markSupported());
//FileInputStream类型的输入流,不支持mark/reset,所以调用reset()方法会出现IOException
//fis.reset();
//byte[] b = new byte[1024];
//fis.read(b);
//System.out.println(Arrays.toString(b)+"abc");
}catch (IOException e){
e.printStackTrace();
}finally{
try{
if(fis != null){
fis.close();
//FileInputStream类型的输入流,被关闭后将不能在使用了
//fis.read();
}
}catch(Exception ex){
ex.printStackTrace();
}
}
}
}
实例
package io;
import java.io.*;
/**
* 演示mark方法
* @author 学霸联盟 - 赵灿
*/
public class MarkDemo {
public static void main(String[] args) {
byte[] b = {23,34,56,6,7,8,95,88,98};
//创建输入流的对象
InputStream is = new ByteArrayInputStream(b);
try{
is.read();
//在流中标记当前位置(类似书签);使用该方法之前要注意判断该流是否支持mark/reset
is.mark(1);
is.read();
is.read();
//重置到使用mark标记的位置
is.reset();
System.out.println(is.read());
}catch(Exception e){
}
}
}
字节输出流
常用类和方法
类
|
说 明
|
ByteArrayOutputStream
|
将输出流中的数据写入到数组
|
FileOutputStream
|
将输出流中的数据写入文本文件
|
PipedOutputStream
|
将输出流中的数据写入管道
|
SequenceOutputStream
|
将多个输出流串联在一起
|
方法名称
|
说 明
|
void write(byte b[ ])
|
将参数b中的所有字节写到此输出流
|
void write(byte b[ ], int off, int len)
|
将数组b中,从偏移量off开始的len个字节写到此输出流
|
abstract void write(int b)
|
先将int转换为byte类型,写入到输出流中
|
void flush( )
|
将缓冲区中数据全部输出到流中,并清空缓冲区
|
void close( )
|
关闭流
|
package io;
import java.io.*;
/**
* 演示OutputStream类常用方法
* @author 学霸联盟 - 赵灿
*/
public class OutputStreamDemo {
public static void main(String[] args) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
try{
//向输出流中写入一个值
os.write(10);
byte[] src = {11,12,13,14,15};
os.write(src);
os.write(src,2,src.length - 2);
//获取输出流中的值,并转换成字节数组
byte[] bs = os.toByteArray();
//循环输入
for(byte b:bs){
System.out.println(b);
}
}catch(IOException e){
}finally{
try{
os.flush();
//ByteArrayOutputStream类的close()方法无效
os.close();
//所以此处继续向输出流中写入值不会出现异常
os.write(18);
}catch(IOException ex){
}
}
}
}
package io;
import java.io.*;
/**
* 演示FileOutputStream类
* @author 学霸联盟 - 赵灿
*/
public class FileOutDemo{
public static void main(String[] args) {
//声明一个文件输出流对象
FileOutputStream fos = null;
try{
fos = new FileOutputStream("C:/file.txt",true);
byte[] b = {105,106,107,108,109,120};
fos.write(b);
}catch(IOException e){
e.printStackTrace();
}finally{
try{
fos.flush();
fos.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
NULL 博文链接:https://shihuan830619.iteye.com/blog/2094068
使用最简单的InputStream输入流和OutputStream输出流,制作了文件之间的粘贴复制功能。程序已测试,可以把一个word文件中的内容完整复制到另一个word文件中。
关于InputStream和OutputStream关于InputStream和OutputStream关于InputStream和OutputStream关于InputStream和OutputStream
2、常用21个IO流:FileWriter、FileReader、CharArrayReader、CharArrayWriter、CharSequence、OutputStreamWriter、FileOutputStream、InputStreamReader、PrintWriter、BufferedReader、InputStream、...
字节流:按照字节读取数据(InputStream、OutputStream) 字符流:按照字符读取数据(Reader、Writer) 功能不同: 节点流:可以直接从数据源或目的地读写数据。 处理流:不直接连接到数据源或目的地,是处理流的流...
InputStream与OutputStream及File间互转
本文档涵盖了java中标准输入输出流,包含InputStream、OutputStream字节流还有字符流以及对文件的读写操作等
– 输入流:只能从中读取字节数据,而不能向其写出数据 – 输出流:只能向其写入字节数据,而不能从中读取数据 • 按照流所处理的数据类型 – 字节流:用于处理字节数据。 – 字符流:用于处理Unicode字符数据。 • ...
输入流和输出流 流是程序和外界进行数据交换的通道 分为输入流(InputStream)和输出流(OutputStream)。程序通过输入流从数据源读取数据,通过输出流向目的地写数据。
1. 什么是流 ...Java中基本的两个字节流类是InputStream和OutputStream,它们分别代表了组基本的输入字节流和输出字节流。InputStream类与OutputStream类均为抽象类,我们在实际使用中通常使用Java类库中提
字节输入流(InputStream)和字节输出流(OutputStream):用于处理二进制数据,以字节为单位进行读写。常见的实现类包括FileInputStream、FileOutputStream等。 字符流: 字符输入流(Reader)和字符输出流...
根据数据流向不同分为:输入流和输出流 字符流和字节流 字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。 字节流和字符流的区别: 读写...
InputStream is = new FileInputStream(file1);// 打开文件 byte[] cont = new byte[(int) file1.length()]; is.read(cont);// 读取文件 for (int i = 0; i ; i++) { System.out.print((char) ...
当你还是一个java初学者的时候,是不是还在为你没有一个好的源代码模仿去学习而烦恼,这个代码很容易看懂,对你学习很有帮助
在字节流中输出数据主要是使用OutputStream完成,输入使的是InputStream,在字符流中输出主要是使用Writer类完成,输入流主要使用Reader类完成。(这四个都是抽象类)java中提供了专用于输入输出功能的包Java.io,...
java.io.Reader 和 java.io.InputStream 的区别
Java inputstream outputstream ..... thread runnable..... 内容是中文的
通过jsoup爬取网上图片,其中包括输入流InputStream的用法
什么是IO流? I:input 输入流;read 读取数据 ...文件操作处理单元分类:字节流和字符流 FileInputStream:文件操作输入字节流 FileOutputStream:文件操作输出字节流 FileReader:文件操作输入字节流 FileWri