java 输入流 和 输出流 简单梳理
- 输入流
- InputStream
- FileInputStream
- Reader
- FileReader
- 输出流
- OutputStream
- FileOutputStream
- Writer
- FileWriter
- 特殊流
- 转换流
- 打印流
- 缓存流
- 对象流
- Properties文件的读取、写出
- XML文件的读取、写出
- 网络文件的读取、写出
输入流
输入流分为字节输入流和字符输入流。
为什么会有字符输入流,原因在于当使用字节输入流读取字符时,极有可能出现***字符乱码***,而采用字符输入流读取字符,由于它是以字符为单位,不会出现乱码的情况。
InputStream
字节输入流,顶级父类。它只是一个接口,需要有个类去实现它,这个类就是FileInputStream.
方法:
InputStream is = new FileInputStream("test.txt");
//读取一个字节,返回它的int型表示形式
int i = is.read();
//新建byte数组用来保存读取出来的字节
//下面的2条语句可以使b一次读到3个字节
byte[] b = new byte[3];
//若文件的字节有3个及以上,b在这一次读取中就能读到3个字节
//若文件的字节没有那么多,b就是有多少读多少
//返回实际读取到的字节数
i = is.read(b);
//还可以指定数组的起始下标,将读取的字节从起始下标开始存储
//指定起始下标的同时还有指定读取的长度
//注意该长度加上起始下标不得超过数组的边界,否则会出异常
//下面1条语句表示起始下标为1,长度为2,将读取到的字节放入这个指定的位置
//返回读取到的字节数
i = is.read(b,1,2);
//关闭流,释放资源
is.close();
若read方法返回-1,说明读取到了文件末尾。我们应对此做出处理,比如不再读取,而不是继续读下去。
FileInputStream
常用的方法在上面已经阐述过了。
构造方法:
FileInputStream(String name)
FileInputStream(File file)
fileName:文件名称([绝对|相对]路径+文件名)
file:文件对象
再强调一点:FileInputStream用于读取诸如图像数据的原始字节流。要读取字符,请考虑FileReader。
Reader
字符输入流,顶级父类。它只是一个接口,需要有个类去实现它,这个类就是FileReader.
方法:
Reader reader = new FileReader("a.txt");
//返回读取到的字符的int型
int i = reader.read();
//新建char数组用来保存读取出来的字符
//下面的字符数组一次最多读取5个字符
char[] c = new char[5];
//将读取到的字符都存放到c数组里,返回读取到字符个数
int len = reader.read(c);
//也可以像字节流一样指定起始下标和长度
//返回读取到的字符个数
len = read.read(c,1,3);
和字节流一样,若read方法返回-1,说明读取到了文件末尾。我们应对此做出处理,比如不再读取,而不是继续读下去。
FileReader
常用的方法在上面已经阐述过了。
构造方法:
FileReader(File file)
FileReader(File file, Charset charset)
FileReader(String fileName)
FileReader(String fileName, Charset charset)
fileName:文件名称([绝对|相对]路径+文件名)
file:文件对象
charSet:字符编码集(gbk、utf-8、...)
FileReader reader = new FileReader("a.txt", Charset.forName("gbk"));
输出流
OutputStream
字节输出流,顶级父类。它只是一个接口,需要有个类去实现它,这个类就是FileOutputStream.
方法(无返回值):
//在当前项目文件夹里,若不存在a.txt则自己创建
OutputStream fileOutputStream = new FileOutputStream("a.txt",true);
byte[] b = {'a','b','c','a'};
//将字节写入文件
fileOutputStream.write(b);
//还可以指定起始下标和长度
fileOutputStream.write(b,1,2);
//关闭流,以免占用资源,从而无法让其他程序对该文件进行操作
fileOutputStream.close();
FileOutputStream
常用的方法在上面已经阐述过了。
构造方法:
FileOutputStream(String name)
FileOutputStream(File file)
FileOutputStream(String name, boolean append)
FileOutputStream(File file, boolean append)
fileName:文件名称([绝对|相对]路径+文件名)
file:文件对象
append:
若为true,则表示在原有的内容上写入新的东西。
若为false或使用1参构造器,则表示将文件原有内容清空,再写入新的东西。
Writer
有字符输入流就有相应的字符输出流。
方法(无返回值):
Writer writer = new FileWriter("a.txt");
//字符输入流的write方法有多种形式
writer.write(98);
writer.write('a');
writer.write("abc");
char[] chars = {'a','a','v'};
writer.write(chars);
writer.write(chars,1,2);
//字符输入流一定要使用flush或close方法才能真正将数据写入文件里
writer.flush();
writer.close();
FileWriter
常用的方法在上面已经阐述过了。
构造方法:
FileWriter(File file)
FileWriter(File file, boolean append)
FileWriter(File file, Charset charset)
FileWriter(File file, Charset charset, boolean append)
FileWriter(String fileName)
FileWriter(String fileName, boolean append)
FileWriter(String fileName, Charset charset) 。
FileWriter(String fileName, Charset charset, boolean append)
fileName:文件名称([绝对|相对]路径+文件名)
file:文件对象
charSet:字符编码集(gbk、utf-8、...)
append:
若为true,则表示在原有的内容上写入新的东西。
若为false或使用1参构造器,则表示将文件原有内容清空,再写入新的东西。
四种流的操作方法讲述完毕啦,在整理一下。输入流read单个【字节|字符】时,用int接收数据。而通过数组read时,数据装入数组里,返回的是读取到的长度。输出流write没有返回值。
特殊流
ByteArrayInputStream
ByteArrayOutputStream
转换流
将字节流转换为字符流
new InputStreamReader(inputStream)
new OutputStreamWriter(OutputStream)
打印流
自动刷新管道,只有输出没有输入,不会抛IOException,构造方法的参数是打印的目的地。System.out.println 默认输出在控制台,我们可以进行更改。
特有的方法print,println(打印后换行)
PrintStream,
PrintWriter,
缓存流
可以读取,或写入一行数据
BufferReader,BufferWriter
BufferInputStream,BufferOutputStream
BufferReader如果读到了末尾返回的是null
对象流
ObjectInputStream
ObjectOutputStream
Properties文件的读取、写出
Properties 是一种继承类HashTable的Map集合
但有两个方法可以进行读取和写入,即load,store
XML文件的读取、写出
以下操作需导入相应的jar包
读取。
1.获取文件的读取流–inputStream
2.创建专门的读取工具对象 SAXReader
3.调用SAXReader的read方法,传入步骤一的读取流,会返回一个Docunment对象。—xml文件内容读取成功
写入
网络文件的读取、写出
//1.首先获得URL对象
URL url = new URL("https://www.baidu.com");//注意http一定要加上
//2.通过URL对象,获取URLConnection连接对象
URLConnection uc = url.openConnection();
//3.获取输入流或输出流,在此演示获取输入流
InputStream is = urlConn.getInputStream();
//接下来结合上面的栗子,就可以获取网络文件的信息了