inputstream用法,Java常用的字符流类有哪些?
inputstream用法,Java常用的字符流类有哪些?详细介绍
本文目录一览: Android inputStream.read(Buffer)!= -1说明什么?
说明还没有读完 如富哦Buffer的内容读完了 返回值就是 -1
inputStream.read(Buffer)!= -1 表示从InputStream中读取一个数组的数据,如果返回-1 则表示数据读取完成了。
关于InputStream的用法:
获取InputStream实例
InputStream is = new FileInputStream(new File("文件路径"));
读取数据
byte[] by = new byte[1024];
int len = 0;
while( (len = is.read(by,0,by.length) != -1){
//循环读取 数据
}
数据读取完关闭inputStream
is.close(); 即可
java 中配置文件路径读取使用FileReader和InputStream区别和用法?
一、按数据来源(去向)分类:
1、是文件: FileInputStream, FileOutputStream, FileReader, FileWriter
2、是byte[]:ByteArrayInputStream, ByteArrayOutputStream
3、是Char[]: CharArrayReader, CharArrayWriter
4、是String: StringBufferInputStream, StringReader, StringWriter
5、网络数据流:InputStream, OutputStream, Reader, Writer
二、按是否格式化输出分:
1、要格式化输出:PrintStream, PrintWriter
三、按是否要缓冲分:
1、要缓冲:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter
四、按数据格式分:
1、二进制格式(只要不能确定是纯文本的): InputStream, OutputStream及其所有带Stream结束的子类
2、纯文本格式(含纯英文与汉字或其他编码方式);Reader, Writer及其所有带Reader, Writer的子类
五、按输入输出分:
1、输入:Reader, InputStream类型的子类
2、输出:Writer, OutputStream类型的子类
六、特殊需要:
1、从Stream到Reader,Writer的转换类:InputStreamReader, OutputStreamWriter
2、对象输入输出:ObjectInputStream, ObjectOutputStream
3、进程间通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
4、合并输入:SequenceInputStream
5、更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader
决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):
首先,考虑最原始的数据格式是什么: 原则四
第二,是输入还是输出:原则五
第三,是否需要转换流:原则六第1点
第四,数据来源(去向)是什么:原则一
第五,是否要缓冲:原则三 (特别注明:一定要注意的是readLine()是否有定义,有什么比read, write更特殊的输入或输出方法)
第六,是否要格式化输出:原则二
Java中Inputstream与Reader的区别
Reader支持16位的Unicode字符输出,InputStream支持8位的字符输出。
Reader和InputStream分别是I/O库提供的两套平行独立的等级机构,
InputStream、OutputStream是用来处理8位元的流,
Reader、Writer是用来处理16位元的流。
而在JAVA语言中,byte类型是8位的,char类型是16位的,所以在处理中文的时候需要用Reader和Writer。
值得说明的是,在这两种等级机构下,还有一道桥梁InputStreamReader、OutputStreamWriter负责进行InputStream到Reader的适配和由OutputStream到Writer的适配。
java.io.Reader 和 java.io.InputStream 组成了 Java输入类。Reader 用于读入16位字符,也就是 Unicode编码的字符;而 InputStream 用于读入 ASCII字符和二进制数据。
在 Java中,有不同类型的 Reader 输入流对应于不同的数据源:
FileReader 用于从文件输入;
CharArrayReader 用于从程序中的字符数组输入;
StringReader 用于从程序中的字符串输入;
PipedReader 用于读取从另一个线程中的 PipedWriter 写入管道的数据。
相应的也有不同类型的 InputStream 输入流对应于不同的数据源:FileInputStream,ByteArrayInputStream,StringBufferInputStream,PipedInputStream。另外,还有两种没有对应 Reader 类型的 InputStream 输入流:
Socket 用于套接字;
URLConnection 用于 URL 连接。
这两个类使用 getInputStream() 来读取数据。
相应的,java.io.Writer 和 java.io.OutputStream 也有类似的区别。
java流的主要方法
方法太多了。
去查查API什么都有了.
看api啊
主要read,write,flush,close等
Java的流操作分为字节流和字符流两种。
1、 字节流
所有的读操作都继承自一个公共超类java.io.InputStream类。
所有的写操作都继承自一个公共超类java.io.OutputStream类。
InputStream和OutputStream都是抽象类。
InputStream有6个低级输入流:
低级流
流的用途
ByteArrayInputStream
从内存数组中读取数据字节
FileInputStream
从本地文件系统中读取数据字节
PipedInputStream
从线程管道中读取数据字节
StringBufferInputStream
从字符串中读取数据字节
SequenceInputStream
从两个或多个低级流中读取数据字节,当到达流的末尾时从一个流转到另一个流
System.in
从用户控制台读取数据字节
InputStream还有一个子类:过滤器流java.io.FilterInputStream。过滤器流即能把基本流包裹起来,提供更多方便的用法。
FilterInputStream 类的构造方法为FilterInputStream(InputStream),在指定的输入流之上,创建一个输入流过滤器。
过滤器输入流
流的用途
BufferedInputStream
缓冲区对数据的访问,以提高效率
DataInputStream
从输入流中读取基本数据类型,如int、float、double或者甚至一行文本
LineNumberInputStream
在翻译行结束符的基础上,维护一个计数器,该计数器表明正在读取的是哪一行。
PushbackInputStream
允许把数据字节向后推到流的首部
2、 字符流
注:是在jdk1.1里面引进的,上面字节流是在jdk1.0引进的。当用于处理文本数据时,选择字符流比字节流更好。但对只出路基本数据类型的开发者,可以继续使用字节流。
所有的读操作都继承自一个公共超类java.io.Reader类。
所有的写操作都继承自一个公共超类java.io.Writer类。
同样Reader和Writer也是抽象类。
Reader的常用的子类如下:
低级读取器
流的用途
CharArrayReader
从字符数组中读取数据
InputStreamReader
FileReader(InputStreamReader的子类)
从本地文件系统中读取字符序列
StringReader
从字符串中读取字符序列
PipedReader
从线程管道中读取字符序列
InputStreamReader重点讲解:
InputStreamReader是从输入流中读取数据,连接输入流于读取器。如:
new InputStreamReader(System.in)
构造方法:
InputStreamReader(InputStream)
用缺省的字符编码方式,创建一个 InputStreamReader。
InputStreamReader(InputStream, String) 用已命名的字符编码方式,创建一个 InputStreamReader。 常用的过滤器读取器:
过滤器读取器
流的用途
BufferedReader
缓冲数据的访问,以提高效率
LineNumberReader(BufferedReader的子类)
维护一个计数器,该计数器表明正在读取的是哪一行。
FilterReader(抽象类)
提供一个类创建过滤器时可以扩展这个类
PushbackReader(FilterReader的子类)
允许把文本数据推回到读取器的流中
这些过滤器读取器都可以传入一个Reader作为构造方法的参数。
java输入输出流怎么写,
Java IO的一般使用原则:
-------------------------------------------------------------------
一、按数据来源(去向)分类:
1、是文件: FileInputStream, FileOutputStream, FileReader, FileWriter
2、是byte[]:ByteArrayInputStream, ByteArrayOutputStream
3、是Char[]: CharArrayReader, CharArrayWriter
4、是String: StringBufferInputStream, StringReader, StringWriter
5、网络数据流:InputStream, OutputStream, Reader, Writer
-------------------------------------------------------------------
二、按是否格式化输出分:
1、要格式化输出:PrintStream, PrintWriter
-------------------------------------------------------------------
三、按是否要缓冲分:
1、要缓冲:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter
-------------------------------------------------------------------
四、按数据格式分:
1、二进制格式(只要不能确定是纯文本的): InputStream, OutputStream及其所有带Stream结束的子类
2、纯文本格式(含纯英文与汉字或其他编码方式);Reader, Writer及其所有带Reader, Writer的子类
-------------------------------------------------------------------
五、按输入输出分:
1、输入:Reader, InputStream类型的子类
2、输出:Writer, OutputStream类型的子类
-------------------------------------------------------------------
六、特殊需要:
1、从Stream到Reader,Writer的转换类:InputStreamReader, OutputStreamWriter
2、对象输入输出:ObjectInputStream, ObjectOutputStream
3、进程间通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
4、合并输入:SequenceInputStream
5、更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader
-------------------------------------------------------------------
决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):
第一,考虑最原始的数据格式是什么:是否为文本?
第二,是输入还是输出?
第三,是否需要转换流:InputStreamReader, OutputStreamWriter?
第四,数据来源(去向)是什么:文件?内存?网络?
第五,是否要缓冲:bufferedReader (特别注明:一定要注意的是readLine()是否有定义,有什么比read, write更特殊的输入或输出方法)
第六,是否要格式化输出:print?
InputStream:输入流
OuputStream:输出流
他们俩都是抽象类。仅实现了某些基础功能方法。如何写在这里一句两句说不清的,推荐你看看《核心技术》中的javaio流章节。
import java.io.*;// 可以认为是输入输出流的头
x.flush();//清空缓冲区使输出流写出
x.close(); // 关闭流
这个简单,主要就是几个类,本人专业就是JAVA编程,把手教你邮件联系
stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在Java的IO中,所有的stream(包括Inputstream和Out stream)都包括两种类型:
(1)字节流
表示以字节为单位从stream中读取或往stream中写入信息,即io包中的inputstream类和outputstream类的派生类。通常用来读取二进制数据,如图象和声音。
(2)字符流
以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。
区别:
Reader和Writer要解决的,最主要的问题就是国际化。原先的I/O类库只支持8位的字节流,因此不可能很好地处理16位的Unicode字符流。Unicode是国际化的字符集(更何况Java内置的char就是16位的Unicode字符),这样加了Reader和Writer之后,所有的I/O就都支持Unicode了。此外新类库的性能也比旧的好。
但是,Read和Write并不是取代InputStream和OutputStream,有时,你还必须同时使用"基于byte的类"和"基于字符的类"。为此,它还提供了两个"适配器(adapter)"类。InputStreamReader负责将InputStream转化成Reader,而OutputStreamWriter则将OutputStream转化成Writer。
一.流的层次结构
定义:
(1) java将读取数据对象成为输入流,能向其写入的对象叫输出流。结构图如下:输入流:
输出流
二.InputStream类
inputstream类和outputstream类都为抽象类,不能创建对象,可以通过子类来实例化。
InputStream是输入字节数据用的类,所以InputStream类提供了3种重载的read方法.Inputstream类中的常用方法:
(1) public abstract int read( ):读取一个byte的数据,返回值是高位补0的int类型值。
(2) public int read(byte b[ ]):读取b.length个字节的数据放到b数组中。返回值是读取的字节数。该方法实际上是调用下一个方法实现的
(3) public int read(byte b[ ], int off, int len):从输入流中最多读取len个字节的数据,存放到偏移量为off的b数组中。
(4) public int available( ):返回输入流中可以读取的字节数。注意:若输入阻塞,当前线程将被挂起,如果InputStream对象调用这个方法的话,它只会返回0,这个方法必须由继承InputStream类的子类对象调用才有用,
(5) public long skip(long n):忽略输入流中的n个字节,返回值是实际忽略的字节数, 跳过一些字节来读取
(6) public int close( ) :我们在使用完后,必须对我们打开的流进行关闭.
三.OutputStream类
OutputStream提供了3个write方法来做数据的输出,这个是和InputStream是相对应的。
1. public void write(byte b[ ]):将参数b中的字节写到输出流。
2. public void write(byte b[ ], int off, int len) :将参数b的从偏移量off开始的len个字节写到输出流。
3. public abstract void write(int b) :先将int转换为byte类型,把低字节写入到输出流中。
4. public void flush( ) : 将数据缓冲区中数据全部输出,并清空缓冲区。
5. public void close( ) : 关闭输出流并释放与流相关的系统资源。
注意:
1. 上述各方法都有可能引起异常。
2. InputStream和OutputStream都是抽象类,不能创建这种类型的对象。
四.FileInputStream类
FileInputStream类是InputStream类的子类,用来处理以文件作为数据输入源的数据流。使用方法:
方式1:
File fin=new File("d:/abc.txt");
FileInputStream in=new FileInputStream(fin);
方式2:
FileInputStream in=new
FileInputStream("d: /abc.txt");
方式3:
构造函数将 FileDescriptor()对象作为其参数。
FileDescriptor() fd=new FileDescriptor();
FileInputStream f2=new FileInputStream(fd);
五.FileOutputStream类
FileOutputStream类用来处理以文件作为数据输出目的数据流;一个表示文件名的字符串,也可以是File或FileDescriptor对象。
创建一个文件流对象有两种方法:
方式1:
File f=new File("d:/abc.txt");
FileOutputStream out=new FileOutputStream (f);
方式2:
FileOutputStream out=new
FileOutputStream("d:/abc.txt");
方式3:构造函数将 FileDescriptor()对象作为其参数。
FileDescriptor() fd=new FileDescriptor();
FileOutputStream f2=new FileOutputStream(fd);
方式4:构造函数将文件名作为其第一参数,将布尔值作为第二参数。
FileOutputStream f=new FileOutputStream("d:/abc.txt",true);
注意:
(1)文件中写数据时,若文件已经存在,则覆盖存在的文件;(2)的读/写操作结束时,应调用close方法关闭流。
举例:2-1
六.File类
File类与InputStream / OutputStream类同属于一个包,它不允许访问文件内容。
File类主要用于命名文件、查询文件属性和处理文件目录。
举例:2-2
七.从一个流构造另一个流
java的流类提供了结构化方法,如,底层流和高层过滤流。
而高层流不是从输入设备读取,而是从其他流读取。同样高层输出流也不是写入输出设备,而是写入其他流。
使用"分层对象(layered objects)",为单个对象动态地,透明地添加功能的做法,被称为Decorator Pattern。Decorator模式要求所有包覆在原始对象之外的对象,都必须具有与之完全相同的接口。这使得decorator的用法变得非常的透明--无论对象是否被decorate过,传给它的消息总是相同的。这也是Java I/O类库要有"filter(过滤器)"类的原因:抽象的"filter"类是所有decorator的基类。Decorator模式常用于如下的情形:如果用继承来解决各种需求的话,类的数量会多到不切实际的地步。Java的I/O类库需要提供很多功能的组合,于是decorator模式就有了用武之地。
为InputStream和OutputStream定义decorator类接口的类,分别是FilterInputStream和FilterOutputStream。
7.1 FilterInputStream
FilterInputStream的种类
类
功能
构造函数的参数
用法
DataInputStream
与DataOutputStream配合使用,这样你就能以一种"可携带的方式(portable fashion)"从流里读取primitives了(int,char,long等)
InputStream
包含了一整套读取primitive数据的接口。
BufferedInputStream
用这个类来解决"每次要用数据的时候都要进行物理读取"的问题。你的意思是"用缓冲区。"
InputStream,以及可选的缓冲区的容量
它本身并不提供接口,只是提供一个缓冲区。需要连到一个"有接口的对象(interface object)"。
LineNumberInputStream
跟踪输入流的行号;有getLineNumber( )和setLineNumber(int)方法
InputStream
只是加一个行号,所以还得连一个"有接口的对象"。
PushbackInputStream
有一个"弹压单字节"的缓冲区(has a one byte push-back buffer),这样你就能把最后读到的那个字节再压回去了。
InputStream
主要用于编译器的扫描程序。可能是为支持Java的编译器而设计的。用的机会不多。
FilterOutputStream的种类
类
功能
构造函数的参数
用法
DataOutputStream
与DataInputStream配合使用,这样你就可以用一种"可携带的方式(portable fashion)"往流里写primitive了(int, char, long,等)
OutputStream
包括写入primitive数据的全套接口。
PrintStream
负责生成带格式的输出(formatted output)。DataOutputStrem负责数据的存储,而PrintStream负责数据的显示。
一个OutputStream以及一个可选的boolean值。这个boolean值表示,要不要清空换行符后面的缓冲区。
应该是OutputStream对象的最终包覆层。用的机会很多。
BufferedOutputStream
用 这个类解决"每次往流里写数据,都要进行物理操作"的问题。也就是说"用缓冲区"。用flush( )清空缓冲区。
OutputStream, 以及一个可选的缓冲区大小
本身并不提供接口,只是加了一个缓冲区。需要链接一个有接口的对象。
DataInputStream类对象可以读取各种类型的数据。
DataOutputStream类对象可以写各种类型的数据;
创建这两类对象时,必须使新建立的对象指向构造函数中的参数对象。例如:
FileInputStream in=new FileInputStream("d:/abc.txt");
DataInputStream din=new DataInputStream(in);
7.2BufferInputStream和bufferOutputStream
允许程序在不降低系统性能的情况下一次一个字节的从流中读取数据。
BufferInputstream定义了两种构造函数
(1) BufferInputStream b= new BufferInputstream(in);
(2) BufferInputStream b=new BufferInputStream(in,size)
第二个参数表示指定缓冲器的大小。
同样BufferOutputStream也有两种构造函数。一次一个字节的向流中写数据。
7.3printstream
用于写入文本或基本类型
两种构造函数方法:
PrintStream ps=new PrintStream(out);
PrintStream ps=new PrintStream(out, autoflush)
第二个参数为布尔值,控制每次输出换行符时java是否刷新输出流。
八.字符流的读取和写入
java.io.Reader 和 java.io.InputStream 组成了 Java 输入类。Reader 用于读入16位字符,也就是 Unicode 编码的字符;而 InputStream 用于读入 ASCII 字符和二进制数据。
Reader的体系结构
(1) FileReader
FileReader主要用来读取字符文件,使用缺省的字符编码,有三种构造函数:
--将文件名作为字符串
FileReader f=new FileReader(“c:/temp.txt”);
--构造函数将File对象作为其参数。
File f=new file(“c:/temp.txt”);
FileReader f1=new FileReader(f);
--构造函数将FileDescriptor对象作为参数
FileDescriptor() fd=new FileDescriptor()
FileReader f2=new FileReader(fd);
(2) charArrayReader
将字符数组作为输入流,构造函数为:
public CharArrayReader(char[] ch);
(3) StringReader
读取字符串,构造函数如下:
public StringReader(String s);
(4) InputStreamReader
从输入流读取字节,在将它们转换成字符。
Public inputstreamReader(inputstream is);
(5) FilterReader
允许过滤字符流
protected filterReader(Reader r);
(6) BufferReader
接受Reader对象作为参数,并对其添加字符缓冲器,使用readline()方法可以读取一行。
Public BufferReader(Reader r);
Writer类体系结构
(1) FileWrite
将字符类型数据写入文件,使用缺省字符编码和缓冲器大小。
Public FileWrite(file f);
(2)chararrayWrite()
将字符缓冲器用作输出。
Public CharArrayWrite();
(3) PrintWrite
生成格式化输出
public PrintWriter(outputstream os);
(4) filterWriter
用于写入过滤字符流
protected FilterWriter(Writer w);
FilterOutputStream的种类
类
功能
构造函数的参数
用法
DataOutputStream
与DataInputStream配合使用,这样你就可以用一种"可携带的方式(portable fashion)"往流里写primitive了(int, char, long,等)
OutputStream
包括写入primitive数据的全套接口。
PrintStream
负责生成带格式的输出(formatted output)。DataOutputStrem负责数据的存储,而PrintStream负责数据的显示。
一个OutputStream以及一个可选的boolean值。这个boolean值表示,要不要清空换行符后面的缓冲区。
应该是OutputStream对象的最终包覆层。用的机会很多。
BufferedOutputStream
用 这个类解决"每次往流里写数据,都要进行物理操作"的问题。也就是说"用缓冲区"。用flush( )清空缓冲区。
OutputStream, 以及一个可选的缓冲区大小
本身并不提供接口,只是加了一个缓冲区。需要链接一个有接口的对象。
DataInputStream类对象可以读取各种类型的数据。
DataOutputStream类对象可以写各种类型的数据;
创建这两类对象时,必须使新建立的对象指向构造函数中的参数对象。例如:
FileInputStream in=new FileInputStream("d:/abc.txt");
DataInputStream din=new DataInputStream(in);
7.2BufferInputStream和bufferOutputStream
允许程序在不降低系统性能的情况下一次一个字节的从流中读取数据。
BufferInputstream定义了两种构造函数
(1) BufferInputStream b= new BufferInputstream(in);
(2) BufferInputStream b=new BufferInputStream(in,size)
第二个参数表示指定缓冲器的大小。
同样BufferOutputStream也有两种构造函数。一次一个字节的向流中写数据。
7.3printstream
用于写入文本或基本类型
两种构造函数方法:
PrintStream ps=new PrintStream(out);
PrintStream ps=new PrintStream(out, autoflush)
第二个参数为布尔值,控制每次输出换行符时java是否刷新输出流
一个很简单的fileinputstream——JAVA问题
我试验了一下,你的程序没有问题,你可以检查一下d:\filetest\file1.txt 文件是否存在?不存在的时候的确会报错
你的这个D:\filetes路径下没有file1.txt 文件
你新建一个就好了
FileInputStream就是文件输入流,用法如下:
File file =new FIle("文件的绝对路径");
FileIputStream fs = new FileInputStream(file);
Java中的FileInputStream,FileOutputStram,BufferedWriter
他们都是一个“流类”,相信楼主对JAVA有所了解,所谓“流类” 顾名思义,就是跟数据流有关系的类。楼主说的FileInputSteam、FileOutputStream和BufferedWriter虽然都是“流类”,但是却属于两个不同的大类。这里建议楼主有必要区分一下。FileInputSteam和FileOutputStream是属于“字节流”类,但却都是用来处理File储存类型的文件的。而BufferedWriter属于“字符流”类。处理对象是“纯文本”(记事本里的文字)对象等。希望对你有帮助,不懂还可以再提问。。
读取的方式不一样大小不一样 流的用的用法大致是这样的 你打开一个文件 你建立一个链接 你只能用一个字符或者字节 你这样读起来很不爽 你就再在它的外面套一个管子 让它缓冲一下 然后你就 在外面套的这个可以直接读取 一行 或者更多
1、public class FileInputStream extends InputStream FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。
2、public class FileOutputStream extends OutputStream 文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。文件是否可用或能否可以被创建取决于基础平台。特别是某些平台一次只允许一个 FileOutputStream(或其他文件写入对象)打开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。FileOutputStream 用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用 FileWriter。 3、public class BufferedWriter extends Writer 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。
该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。并非所有平台都使用新行符('\n') 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。通常 Writer 将其输出立即发送到底层字符或字节流。除非要求提示输出,否则建议用 BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer(如 FileWriters 和 OutputStreamWriters)。例如,
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
将缓冲 PrintWriter 对文件的输出。如果没有缓冲,则每次调用 print() 方法会导致将字符转换为字节,然后立即写入到文件,而这是极其低效的。
Java常用的字符流类有哪些?
所有的读操作都继承自一个公共超类java.io.InputStream类。
所有的写操作都继承自一个公共超类java.io.OutputStream类。
InputStream和OutputStream都是抽象类。
InputStream有6个低级输入流:
低级流
流的用途
ByteArrayInputStream
从内存数组中读取数据字节
FileInputStream
从本地文件系统中读取数据字节
PipedInputStream
从线程管道中读取数据字节
StringBufferInputStream
从字符串中读取数据字节
SequenceInputStream
从两个或多个低级流中读取数据字节,当到达流的末尾时从一个流转到另一个流
System.in
从用户控制台读取数据字节
InputStream还有一个子类:过滤器流java.io.FilterInputStream。过滤器流即能把基本流包裹起来,提供更多方便的用法。
FilterInputStream 类的构造方法为FilterInputStream(InputStream),在指定的输入流之上,创建一个输入流过滤器。
FilterInputStream的常用的子类如下:
过滤器输入流
流的用途
BufferedInputStream
缓冲区对数据的访问,以提高效率
DataInputStream
从输入流中读取基本数据类型,如int、float、double或者甚至一行文本
LineNumberInputStream
在翻译行结束符的基础上,维护一个计数器,该计数器表明正在读取的是哪一行。
PushbackInputStream
允许把数据字节向后推到流的首部
OutputStream(略)
OutputStream的结构基本和InputStream是一样的。
字符流:
以Reader和Writer结尾的都是字符流,每次处理两个Unicode字节,Reader是输入流,Writer是输出流。常见的有FileReader,FileWriter;BufferReader,BufferWriter等,查看jdkapi文档就知道了。
字节流:
以OutputStream和InputStream结尾的流都是字节流,每次只能处理一个字节,在使用时常常在字节流上套上字符流或缓冲流或转换流等来方便对数据的处理。
java中的OutputStreamWriter用法
是把将输出的字符流变为字节流,这算是一个中间类。需要包装,比如
Writer out = new BufferedWriter(new OutputStreamWriter(System.out));
就是将BUfferedWriter输出所要求的字符流,由OutputStreamWriter将字符和字节作为一个转换,你自己想反了。具体请看Java的API文档上的说明。
Java:BufferedInputStream这种用法看不懂,求解
/***
* @author outofmemory.cn*/
public class Main {/**
* 从文件中读取文本*/
public void readFromFile(String filename) {
BufferedInputStream bufferedInput = null;
byte[] buffer = new byte[1024];try {
//创建BufferedInputStream 对象
bufferedInput = new BufferedInputStream(new FileInputStream(filename));
int bytesRead = 0;
//从文件中按字节读取内容,到文件尾部时read方法将返回-1
while ((bytesRead = bufferedInput.read(buffer)) != -1) {
//将读取的字节转为字符串对象
String chunk = new String(buffer, 0, bytesRead);
System.out.print(chunk);}
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
} finally {
//关闭 BufferedInputStreamtry {
if (bufferedInput != null)
bufferedInput.close();
} catch (IOException ex) {
ex.printStackTrace();}}}/**
* @param args 命令行参数*/
BufferedInputStream 是有缓冲的 如果按一般的demo是用法是不使用缓冲区的,而且实际使用缓冲会因为填充缓冲区反倒比直接读的要慢。
BufferedInputStream的缓冲是为了重复读取流的,使用前需要先用mark方法指定缓冲数组的大小,然后每次读流的时候 BufferedInputStream 会自动把的读取的字节充填进缓冲数组,当调用reset方法后就能通过read方法重新读取标记过的流。