java.io包中,流分为两种 **字节流与字符流 **
1.1 字节流:
InputStream
(输入流) , OutputStream(输出流);输入流与输出流是相对参考系的而言的
字节操作流:原生操作,不需要处理;
应用场景:进行网络传输、磁盘数据保存 时的数据类型:字节(文件储存、网络传输);
1.2 字符流:
Reader
,Writer
;
字符操作流:通过转换得来的,需要中间处理;
应用场景:用于蚊子处理,尤其是处理中文时支持较好,除此以外所有流处理均使用字节流
1.3 流的基本操作流程
1.根据文件路径创建File类对象(取得终端对象);
2.根据字节流或字符流的子类实例化父类对象;
3.进行数据的读取或写入操作(进行数据的输入和输出);
4.关闭流;(对于IO操作属于资源处理,所有的资源处理操作(IO、数据库、网络操作)最后都必须进行关闭);
1.4 AutoCloseable 自动关闭支持
从JDK1.7 开始追加一个AutoCloseable 接口,这个接口的主要目的是进行流的自动关闭,但是这种处理方法必须处在try代码块中时才会自动调用。
2.字节输出流(OutputStream)(抽象类)
2.1 定义结构
使用此类在程序中往文件中写入数据
public abstract class OutputStream implements Closeable,Flushable
2.2 方法
2.2.1 接口方法
OutputStream
类实现了Closeable
,Flushable
两个接口,实现的抽象方法有:
1.Closeable
(关闭):public void close() throws IOException;
2.Flushable
(刷新缓冲区):public void Flushable() throws IOException;
2.2.2 其他方法:
1.将给定的字节数组内容全部输出
public void write(byte b[]) throws IOException
2.将部分字节数组内容输出
public void write(byte b[],int off,int len) throws IOException
3.输出单个字节
public abstract void write( int b) throws IOException
2.3 FileOutputStream 类
因为OutputStream
是一个抽象类,实例化对象必须由子类实现,引入FileOutputStream
类
2.3.1 定义
public class FileOutputStream extends OutputStream
- 文件输出流是用于将数据写入到输出流
File
或一个FileDescriptor
。 文件是否可用或可能被创建取决于底层平台。 特别是某些平台允许一次只能打开一个文件来写入一个FileOutputStream
(或其他文件写入对象)。 在这种情况下,如果所涉及的文件已经打开,则此类中的构造函数将失败。 FileOutputStream
用于写入诸如图像数据的原始字节流。 对于写入字符流,请考虑使用FileWriter
。
2.3.2 构造方法
1.接收File类(覆盖)
public FileOutputStream(File file) throw FileNotFoundException
//创建文件输出流以写入由指定的 File对象表示的文件
package JAVASE.IOtext;
import java.io.*;
/**
* @Name: 实现文件内容的输出
* @Author:ZYJ
* @Date:2019-05-09-16:48
* @Description: 使用OutputStream 类
*/
public class Test6 {
public static void main(String[] args) throws IOException {
//1.取得终端对象
File file = new File("C:\\Users\\ZYJ\\Desktop\\javaIO\\ioTest\\hello.txt");
if(!file.getParentFile().exists()){//判断父路径是否存在
file.getParentFile().mkdirs();//若不存在 创建目录
}
//2.取得相应终端输出流
OutputStream output = new FileOutputStream(file);//子类向上转型
String msg ="hello world!";
//3.数据的读取或写入
output.write(msg.getBytes());//getBytes() 转为字节数组 write() 接收数组类型
//4.关闭流
output.close();
}
}
使用此方法,写入的内容会覆盖,若要追加使用以下重载方法
2.接收File类(追加)
public FileOutputStream(File file,boolean append)//创建文件输出流以写入由指定的 File对象表示的文件
追加参数为boolean
类型 ,默认为false,若要追加,将其置为true
package JAVASE.IOtext;
import java.io.*;
/**
* @Name: 追加文件内容
* @Author:ZYJ
* @Date:2019-05-09-17:33
* @Description: ;使用FileOutputstream(Flie file,boolean append)
*/
public class Test7 {
public static void main(String[] args) throws Exception {
//1.取得终端对象
File file = new File("C:\\Users\\ZYJ\\Desktop\\javaIO\\ioTest\\hello.txt");
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
//2.取得相应终端输出流
OutputStream outputStream = new FileOutputStream(file,true);
String msg=" hello java!";
//3.数据的读取和写入
outputStream.write(msg.getBytes());
//4.关闭流
outputStream.close();
}
}
3. 字节输入流 InputStream
3.1 定义结构
使用此类在程序中读取文件内的数据
public abstract class InputStream implements Closeable
3.2 方法
1.读取单个字节,每次读取一个字节的内容,直到没有数据返回-1;
public abstract int read() throws IOException
2.读取数据到字节数组中,返回数据的读取个数。如果此时开辟的字节数组大小大于读取的数据大小,则返回的就是读取个数;如果要读取的数据大于数组的内容,那么这个时候返回的就是数组长度;如果没有数据了还在读,则返回-1
public int read(byte b[]) throws IOException
3读取部分数据到字节数组中,每次只读取传递数组的部分内容,如果读取满则返回长度(len),如果没有读取满则返回读取的数据个数,如果读取到最后没有数据了返回-1
public int read(byte b[],int off,int len) throws IOException
代码示例
package JAVASE.IOtext;
import java.io.*;
/**
* @Name:字节输入流操作
* @Author:ZYJ
* @Date:2019-05-15-16:03
* @Description:
*/
public class Test8 {
public static void main(String[] args) {
//1.定义文件路径
File file = new File("C:\\Users\\ZYJ\\Desktop\\javaIO\\ioTest\\hello.txt");
//保证文件存在
if(file.exists()){
try {
//输入流接收文件
InputStream input = new FileInputStream(file);
//定义字节数组
byte[] data = new byte[1024];
//输入流文件调用read() 方法读取文件中内容,传入至data参数中 长度用len接收
//返回-1 说明读取完成
int len = input.read(data);
//将字节数组的内容转为字符串 此处使用构造方法参数分别为 源数据 ,起始位置,结束位置
String result = new String(data,0,len);
System.out.println(result);
//关闭流
input.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4.字符输出流writer
4.1 定义
从程序中给文件写入内容
public abstract class Writer implements Appendable,Closeable,Flushable
4.2 缓冲区
字符流中有缓冲区,程序先将缓冲区内容输出至终端,后输出;若不关闭流,则处理失败(数据默认保存在缓冲区,不会输出至终端) 若想在不关闭流的基础上输出缓冲度内容,可使用Flushable()
强制刷新缓冲区,此时终端输出成功,但是流未关闭
4.3 方法
public void write(String str) throws IOException//直接将字符串写入程序
package JAVASE.IOtext;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
/**
* @Name:字符输出流使用
* @Author:ZYJ
* @Date:2019-05-15-17:01
* @Description:
*/
public class Test9 {
public static void main(String[] args) throws IOException {
//1.取得终端对象
File file = new File("C:\\Users\\ZYJ\\Desktop\\javaIO\\ioTest\\hello.txt");
if(!(file.getParentFile().exists())){
file.getParentFile().mkdirs();
}
String str = "哈哈哈哈哈!!! ";
//2.取得输出流
Writer out = new FileWriter(file,true);
//3.输出
out.write(str);
//4.关闭流
out.close();
}
}
5. 字符输入流 Reader
Reader类中没有方法可以直接读取字符串类型,这个时候只能通过字符数组进行读取操作
package JAVASE.IOtext;
import java.io.*;
/**
* @Name:字符输入流
* @Author:ZYJ
* @Date:2019-05-15-17:26
* @Description:
*/
public class Test10 {
public static void main(String[] args) throws IOException {
//1.获取终端流
File file = new File("C:\\Users\\ZYJ\\Desktop\\javaIO\\ioTest\\hello.txt");
if(file.exists()){
//2.获取输入流
Reader in = new FileReader(file);
char[] data = new char[1024];
//3.读取数据
int len = in.read(data);
String result = new String(data,0,len);
System.out.println(result);
//4.关闭流
in.close();
}
}
}