Java IO 技术之基本流类 (图+讲解+代码)
来源:互联网 发布:海淘 知乎 直邮 编辑:程序博客网 时间:2024/06/06 00:11
流式IO
流(Stream)是字节的源或目的。
两种基本的流是:输入流(Input Stream)和输出流(Output Stream)。可从中读出一系列字节的对象称为输入流。而能向其中写入一系列字节的对象称为输出流。
流的分类
节点流:从特定的地方读写的流类,例如:磁盘或一块内存区域。
过滤流:使用节点流作为输入或输出。过滤流是使用一个已经存在的输入流或输出流连接创建的。
InputStream
三个基本的读方法
abstract int read() :读取一个字节数据,并返回读到的数据,如果返回-1,表示读到了输入流的末尾。
int read(byte[]?b) :将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。
int read(byte[]?b, int?off, int?len) :将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。off指定在数组b中存放数据的起始偏移位置;len指定读取的最大字节数。
其它方法
long skip(long?n) :在输入流中跳过n个字节,并返回实际跳过的字节数。
int available() :返回在不发生阻塞的情况下,可读取的字节数。
void close() :关闭输入流,释放和这个流相关的系统资源。
void mark(int?readlimit) :在输入流的当前位置放置一个标记,如果读取的字节数多于readlimit设置的值,则流忽略这个标记。
void reset() :返回到上一个标记。
boolean markSupported() :测试当前流是否支持mark和reset方法。如果支持,返回true,否则返回false。
java.io包中 InputStream的类层次
OutputStream
三个基本的写方法
abstract void write(int?b) :往输出流中写入一个字节。
void write(byte[]?b) :往输出流中写入数组b中的所有字节。
void write(byte[]?b, int?off, int?len) :往输出流中写入数组b中从偏移量off开始的len个字节的数据。
其它方法
void flush() :刷新输出流,强制缓冲区中的输出字节被写出。
void close() :关闭输出流,释放和这个流相关的系统资源。
java.io包中 OutputStream的类层次
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Demo1:在控制台读取键盘输入,然后显示。Ctrl+C结束运行
-------------------------------------------------------------------------------
public class StreamDemo {
public static void main(String[] args) throws Exception {
int data;
while ((data = System.in.read()) != - 1 ) {
System.out.write(data);
}
}
}
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
基本的流类
1、FileInputStream和FileOutputStream
节点流,用于从文件中读取或往文件中写入字节流。如果在构造FileOutputStream时,文件已经存在,则覆盖这个文件。
-------------------------------------------------------------------------------
Demo2:将字符串写入特定文件,注意write方法只接收字符数组。
-------------------------------------------------------------------------------
public class StreamDemo {
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream( " 1.txt " );
/** *//**/ /*
* 注意:FileOutputStream的write方法接收字符数组,不能接收String字符串,
* 所以要用String的getBytes方法生成一个字符数组
*/
fos.write( " http://www.cnblogs.com " .getBytes());
fos.close();
}
}
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
String的构造方法的API:
------------
Java API:
------------
String
public String(byte[] bytes,
int offset,
int length)
构造一个新的 String,方法是使用指定的字符集解码字节的指定子数组。新的 String 的长度是一个字符集函数,因此不能等于该子数组的长度。
当给定字节在给定字符集中无效的情况下,该构造方法无指定的行为。当需要进一步控制解码过程时,应使用 CharsetDecoder 类。
参数:
bytes - 要解码为字符的字节
offset - 要解码的首字节的索引
length - 要解码的字节数
抛出:
IndexOutOfBoundsException - 如果 offset 和 length 参数索引字符超出 bytes 数组的范围
从以下版本开始:
JDK1.1
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Demo3:将字符串写入特定文件,注意write方法只接收字符数组。
然后通过文件输出流读取数据,注意使用String特定的构造方法。
-------------------------------------------------------------------------------
public class StreamDemo {
public static void main(String[] args) throws Exception {
FileOutputStream fos = new FileOutputStream( " 1.txt " );
/** *//**/ /*
* 注意:FileOutputStream的write方法接收字符数组,不能接收String字符串,
* 所以要用String的getBytes方法生成一个字符数组
*/
fos.write( " http://www.cnblogs.com " .getBytes());
fos.close();
// 使用String的这个构造方法:
// String(byte[] bytes, int offset, int length)
FileInputStream fis = new FileInputStream( " 1.txt " );
byte [] buf = new byte [ 100 ];
int len = fis.read(buf);
// 使用String的这个构造方法:
// String(byte[] bytes, int offset, int length)
System.out.println( new String(buf, 0 , len));
fis.close(); // 使用完后记得关闭文件流
}
}
-------------------------------------------------------------------------------
运行结果:http://www.cnblogs.com/
-------------------------------------------------------------------------------
2、BufferedInputStream和BufferedOutputStream
过滤流,需要使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率。
------------
Java API:
------------
构造方法摘要
BufferedOutputStream(OutputStream out)
创建一个新的缓冲输出流,以将数据写入指定的基础输出流。
BufferedOutputStream(OutputStream out, int size)
创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的基础输出流。
-------------------------------------------------------------------------------
BufferedOutputStream
public BufferedOutputStream(OutputStream out)
创建一个新的缓冲输出流,以将数据写入指定的基础输出流。
参数:
out - 基础输出流。
BufferedOutputStream
public BufferedOutputStream(OutputStream out,
int size)
创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的基础输出流。
参数:
out - 基础输出流。
size - 缓冲区的大小。
抛出:
IllegalArgumentException - 如果 size <= 0
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
Demo4:通过一个OutputStream对象来构造一个BufferedOutputStream对象。
而FileOutputStream类是OutputStream类的子类,所以可以用它来构造。
-------------------------------------------------------------------------------
2
3 public class StreamDemo {
4
5 public static void main(String[] args) throws Exception {
6
7 FileOutputStream fos = new FileOutputStream( " 1.txt " );
8 BufferedOutputStream bos = new BufferedOutputStream(fos);
9 bos.write( " http://www.cnblogs.com " .getBytes());
10 }
11
12 }
-------------------------------------------------------------------------------
运行结果:1.txt文件为空。原因:缓冲区没有写满,程序没有向文件写数据。
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
解决方法1:使用flush()方法:
-------------------------------------------------------------------------------
Demo4:使用flush()方法,可以使程序立即向文件写数据。
-------------------------------------------------------------------------------
2
3 public class StreamDemo {
4
5 public static void main(String[] args) throws Exception {
6
7 FileOutputStream fos = new FileOutputStream( " 1.txt " );
8 BufferedOutputStream bos = new BufferedOutputStream(fos);
9 bos.write( " http://www.cnblogs.com " .getBytes());
10
11 bos.flush();
12 }
13
14 }
-------------------------------------------------------------------------------
运行结果:数据被写入相应的文件。
-------------------------------------------------------------------------------
解决方法2:使用close()方法:
-------------------------------------------------------------------------------
Demo5:使用close()方法,同样可以使程序立即向文件写数据。
-------------------------------------------------------------------------------
2
3 public class StreamDemo {
4
5 public static void main(String[] args) throws Exception {
6
7 FileOutputStream fos = new FileOutputStream( " 1.txt " );
8 BufferedOutputStream bos = new BufferedOutputStream(fos);
9 bos.write( " http://www.cnblogs.com " .getBytes());
10
11 bos.close();
12 }
13
14 }
-------------------------------------------------------------------------------
运行结果:数据被写入相应的文件。
-------------------------------------------------------------------------------
flush()和close()的区别:
还要使用流对象,还需要写数据,使用flush(),否则使用close()。
另外,使用close()将关闭自己的流对象,同时会关闭与之相关的流对象,如FileOutputStream流。
-------------------------------------------------------------------------------
Demo6:使用BufferedInputStream流,从文件中读取数据。
同样要用InputStream流对象或者其子类的对象来构造。
-------------------------------------------------------------------------------
2
3 public class StreamDemo {
4
5 public static void main(String[] args) throws Exception {
6
7 FileOutputStream fos = new FileOutputStream( " 1.txt " );
8 BufferedOutputStream bos = new BufferedOutputStream(fos);
9 bos.write( " http://www.cnblogs.com " .getBytes());
10
11 bos.close();
12
13 FileInputStream fis = new FileInputStream( " 1.txt " );
14 BufferedInputStream bis = new BufferedInputStream(fis);
15 byte [] buf = new byte [ 100 ];
16 int len = bis.read(buf);
17
18 // 使用String的这个构造方法:
19 // String(byte[] bytes, int offset, int length)
20 System.out.println( new String(buf, 0 , len));
21 bis.close();
22 }
23
24 }
- Java IO 技术之基本流类 (图+讲解+代码)
- Java IO 技术之基本流类 ~~~~~~~~ (图+讲解+代码) 好好看 有好处
- Java IO 技术之基本流类 ~~~~~~~~ (图+讲解+代码) 好好看 有好处
- Java IO 技术之基本流类
- Java之IO流技术
- JAVA IO流之简介(图+代码)
- Java IO流 讲解
- JAVA-13-IO流之字符流;设计模式讲解
- Java IO流之装饰模式与适配器模式讲解
- 讲解JAVA中的IO流
- java--IO流基本
- Java.io流的基本常用类
- Java基本IO操作(流)
- Java基本IO操作(流)续
- Java 流的基本讲解
- JAVA流技术(IO编程)
- 15、Java入门—Java IO流之RandomAccessFile类的基本操作
- java学习之 io流的基本操作(1)
- #ifdef _cpluscplus
- 修改电脑的启动项
- Myeclipse创建一个基于Xfire的webservice
- fsb,fev文件格式转换,提取与打包
- 杭电 1248 寒冰王座
- Java IO 技术之基本流类 (图+讲解+代码)
- 九月十月百度,迅雷,华为,阿里巴巴笔试面试六十题(第411~470题)
- 组队周赛_山东省第一届ACM大学生程序设计竞赛
- MongoDB学习之旅七:MongoDB高级查询の条件操作符
- Android开发如何去除标题栏title
- 使用C++机器学习库 mlpack
- Reader应用---》访问URL后获取返回值
- if <-> unless
- 组合数学