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();
//接下来结合上面的栗子,就可以获取网络文件的信息了