网站首页 > 技术文章 正文
一、流类
Java的流式输入/输出是建立在四个抽象类的基础上的:InputStream、OutputStream、Reader、Writer。它们用来创建具体的流式子类。尽管程序通过具体子类执行输入/输出操作,但顶层类定义了所有流类的基本通用功能。
InputStream和OutputStream为字节流设计,Reader和Writer为字符流设计,字节流和字符流形成分离的层次结构。一般来说,处理字符或字符串使用字符流类,处理字节或二进制对象使用字节流。
操作文件流时,不管是字符流还是字节流,都可以按照以下方式进行:
1、使用File类找到一个对象
2、通过File类的对象去实例化字节流或字符流的子类
3、进行字节(字符)的读、写操作
4、关闭文件流
二、OutputStream(字节输出流)
OutputStream是定义了Java流式字节输入模式的抽象类。该类的所有方法返回一个void值并且在出错的情况下引发一个IOException,OutputStream提供的抽象方法有:
三、FileOutputStream(文件字节输出流)
FileOutpuStream应该是Java中最常见的字节输出流了,它创建一个可向文件写入字节的类OutputStream,它常用的构造方法如下:
1、FileOutputStream(String name)
2、FileOutputStream(File file)
3、FileOutputStream(File file, boolean append)
前两个构造方法类似,前者输入文件的绝对路径,后者输入File的实例对象,和RandomAccessFile一样,推荐后者。第三个构造方法有一点不同,append如果设置为true,文件则以搜索路径模式打开。FileOutputStream的创建不依赖于文件是否存在,在创建对象时,FileOutputSStream会在打开输出文件之前就创建它。这种情况下如果试图打开一个只读文件,会引发IOException。FileOutputStream,写一个例子,现在我的D盘下的Files文件夹里并没有"stream.txt"这个文件:
package com.demo; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; public class FileOutputStreamTest { public static void main(String[] args) throws Exception{ File file = new File("D:/Files/stream.txt"); OutputStream out = new FileOutputStream(file); byte b[] = "Hello World!!!".getBytes(); //操作字节流,要转换成字节 out.write(b); out.close(); } }
此时打开"stream.txt":
到D盘下的Files文件夹里多了"stream.txt",且文件中的内容和我们写入的一致,同样这个例子也证明了FileOutputStream并不依赖指定路径下的文件是否存在。那如果指定路径下本来就有文件,那么写将会覆盖而不是追加,很好证明:
package com.demo; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; public class FileOutputStreamTest { public static void main(String[] args) throws Exception{ File file = new File("D:/Files/stream.txt"); OutputStream out = new FileOutputStream(file); byte b[] = "abcdefghijklmnopqrstuvwxyz".getBytes(); //操作字节流,要转换成字节 out.write(b); out.close(); } }
此时再打开"stream.txt":
"stream.txt"中的内容变掉了,证明了结论。
四、InputStream(字节输入流)
InputStream是定义了Java流式字节输入模式的抽象类。该类所有方法在出错的时候都会引发一个IOException,InputStream提供的抽象方法有:
方 法作 用int available()返回当前可读的字节数void close()关闭此输入流并释放与该流关联的所有系统资源,关闭之后再读取会产生IOExceptionint mark(int readlimit)在输入流中放置一个标记,该流在读取N个Bytes字节前都保持有效boolean markSupported()如果调用的流支持mark()/reset()就返回trueint read()如果下一个字节可读取则返回一个整形,遇到文件尾时返回-1int read(byte b[])试图读取buffer.length个字节到buffer中,并返回实际成功读取的字节数,遇到文件尾则返回-1int read(byte b[], int off, int len)将输入流中最多len个数组直接读入byte数组,off表示数组b中写入数据的初始偏移量。注意,三个read方法,在输入数据可用、检测到流末尾或者抛出异常前,此方法将一直阻塞void reset()重新设置输入指针到先前设置的标记处long skip(long n)跳过和丢弃此输入流中数据的n个字节
五、FileInputStream(文件字节输入流)
FileInputStream应该是Java中最常见的字节输入流了,它创建一个能从文件读取字节的InputStream类,它的两个常用构造方法如下:
1、FileInputStream(String name)
2、FileInputStream(File file)
和FileOutputStream差不多,推荐后者的用法。FileInputStream,同样写一个例子,操作的是上面D盘下的Files文件夹生成的"stream.txt":
package com.demo; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; public class FileInputStreamTest { public static void main(String[] args) throws Exception{ File file = new File("D:/Files/stream.txt"); InputStream in = new FileInputStream(file); byte b1[] = new byte[(int)file.length()]; int i = 0; i = in.read(b1); System.out.println(i); System.out.println(new String(b1, 0, i)); } }
运行结果为:
26 abcdefghijklmnopqrstuvwxyz
要区分清楚,OutputStream的作用是将内容由Java内存输出到文件中、InputStream是将内容由文件输入到Java内存中。read(byte b[])方法之前讲明了,表示"试图读取buffer.length个字节到buffer中,并返回实际读取的字节数",返回的是实际字节的大小。
猜你喜欢
- 2024-10-20 高效访问海量地图数据--GeoServer手动发布本地Shapefile地图
- 2024-10-20 详解grafana常见报错internal server error如何解决
- 2024-10-20 python教程之FTP相关操作(python2 ftp)
- 2024-10-20 僵尸毁灭工程联机教程 僵尸毁灭工程联机服务器设置
- 2024-10-20 tftp为何timeout?为何server error:(1)File not found
- 2024-10-20 MySQL server PID file could not be found!失败
- 2024-10-20 esp8266_server 的 streamFile 方法
- 2024-10-20 SQL server 2008 R2 图文安装教程(附资源)
- 2024-10-20 GET!无法连接数据库,SOLIDWORKS Electrical解决方法
- 2024-10-20 理解Python Traceback(回溯)(python的回溯和递归)
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)