目录
8.3 对字节流操作:InputStream(读取)OutputStream(写入)
8.1 流的概念
Java 语言采用流的机制来实现输入/输出。所谓流,就是数据的有序排列。
而流可以是从某个源(称为流源,Source of Stream)出来,到某个目的地(称为流汇 ,Sink of Stream)去的。
8.1.1 流的分类
- 流向分:输入流、输出流
- 流源分:字符流、字节流
- 功能分:节点流、处理流
java 中统一将流的类放在 java.io 包下。
8.1.2 流的处理工程
有两个分别是:FileInputStream、FileoutputStream.
1、Java 中可以使用 FileInputStream 从一个文件中读取数据,FileInputStream 就是一个流处理器
2、类似的也可以通过FileOutputStream向一个文件中写入数据。
3、Java 中提供了一种称作为链接的机制,可以将一个流处理器与另一个流处理器首尾相连,形成一个流管道的链接。
8.2 写流时用到的辅助类
8.2.1 File类
输入输出流的载体是文件
File类用于封装系统的文件和目录的相关信息。在该类中定义了一些与平台无关的方法来操作文件。例如文件的大小、修改时间、文件路径等。
//创建File对象的三种方法
new File (String pathName);
File file = new File("E://1.txt");
//parent :父抽象路径名 child:子路径名字符串
new File(String parent , String child);
方法:
返回 | 方法 | 说明 |
---|---|---|
String | getName | 获取文件名称 |
String | getParent | 获取文件的父路径字符串 |
String | getPath | 获取文件的相对路径字符串 |
String | getAbsolutePath | 获取文件的绝对路径字符串 |
boolean | exists | 判断文件或者文件夹是否存在 |
boolean | isFile | 判断是不是文件类型 |
boolean | isDirectory | 判断是不是文件夹类型 |
boolean | delete | 删除文件或文件夹,如果删除成功返回结果为true |
boolean | mkdir | 创建文件夹,创建成功返回true |
boolean | setReadOnly | 设置文件或文件夹的只读属性 |
long | length | 获取文件的长度 |
long | lastModified | 获取文件的最后修改时间 |
String[ ] | list | 获取文件夹中的文件和子文件夹的名称,并存放到字符串数组中 |
注意:在使用delete()方法删除File对象时,如果删除的对象是目录,该目录中的内容必须为空。
8.2.2 byte类
(1)读取时:
byte byt[] = new byte[1024]; //1024是什么意思
byte数组的初始化,数组的长度为1024, 代码看来表达的是每次从文件读取1024个字节。
8bit(位)是1byte(字节)
1024byte(字节)是1kb
byte[] bytes = new byte[1024]是1kb
(2)写入时:
new String(byt, 0, len); //这里的0是什么意思
这是将字节数组中角标为 0 到角标为 len-1 转化为字符串。
第一个byt参数就是你定义的数据名;
第二个0就是从数组里角标为0(也就是第一位)开始转换字符串;
第三个len就是你读取文件所读到的字节个数。
8.3 对字节流操作:InputStream(读取)OutputStream(写入)
8.3.1 抽象类:InputStream类(读取)
方法:
返回 | 方法 | 说明 |
---|---|---|
int | available() | 返回当前输入流的数据读取方法可以读取的有效字节数量 |
Abstract int | read() | 从当前数据流中读取一个字节。若已达到流结尾,则返回-1 |
int | read(byte[ ] bytes) | 从当前输入流读取一定的byte数据,并存取在数组中,然后返回读取的byte数据的数量,若已到达流结尾,则返回-1。 |
void | reset() | 将当前的输入流重新定位到最后一次调用mark()方法时的位置 |
void | mark(int readlimit) | 在当前输入流中做标记位置,当调用reset()方法时将返回到该位置,从标记位置开始,到再读入readlimit个字符为止,这个标记都维持有效。 |
Boolean | markSupported() | 测试当前输入流是否支持mark()和reset()方法,只要其中一个不支持,则返回false |
long | skip(long n) | 跳过和丢弃当前输入的n个字节数据 |
void | close() | 关闭当前输入流,并释放任何与之相关联的系统资源 |
createNewFile() | 创建同名文件! |
8.3.2 实例化:FileInputStream
注意:
1、File得到文件名
2、read读取字节
3、new String(bytes2, 0, len) 实现将字节转换成字符串输出
package aaa;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 创建OutputStream实例out,并将其赋值为System.out标准输出流,通过write方法向流中写入数据
*/
public class FileCreate {
public static void main(String[] args) {
File file = new File("D:/", "word.txt"); //创建文件对象
try {
FileInputStream input = new FileInputStream(file);
byte[] bytes2 = new byte[1024];
int len = input.read(bytes2); //获取字节长度
System.out.println("文件中的信息是:" + new String(bytes2, 0, len)); //将字节转化成字符串输出!!!因为我们要的是字符串!
input.close();
} catch (FileNotFoundException e)
{
System.out.println("文件不存在或者文件不可读或者文件是目录");
}
catch (IOException e)
{
System.out.println("读取过程存在异常");
}
}
}
8.3.3 抽象类:OutputStream(写入)
返回 | 方法 | 说明 |
---|---|---|
void | write(byte[ ] b) | 将byte[ ] 数组中的数据写入当前输出流 |
void | write(byte[] b ,int off, int len) | 将byte[ ]数组下标off开始的len长度的数据写入当前输出流 |
Abstract void | write(int b) | 写入一个byte数据到当前输出流 |
void | flush() | 刷新当前输出流,并强制写入所有缓冲的字节数据 |
void | close() | 关闭当前输出流 |
8.3.4 实例化:FileOutputStream
(1)覆盖式写入:
创建FileOutputStream流以写入数据到File对象表示的文件。 如果第二个参数为FLASE(默认),则字节将覆盖式写入。
package aaa;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 创建OutputStream实例out,并将其赋值为System.out标准输出流,通过write方法向流中写入数据
*/
public class FileCreate {
public static void main(String[] args) {
File file = new File("D:/", "word.txt"); //创建文件对象
try {
if (!file.exists()) { //如果文件不存在则新建文件
file.createNewFile();
}
FileOutputStream output = new FileOutputStream(file);
byte[] bytes = "Java数据交流管道".getBytes(); //根据上方的图可知,流之间交换的是字节,所以这句话的含义是将文字转换成字节
output.write(bytes); //将数组的信息写入文件中,多次运行直接覆盖之前的内容!
output.close(); //一定要关闭!!
} catch (FileNotFoundException e)
{
System.out.println("文件不存在或者文件不可读或者文件是目录");
}
catch (IOException e)
{
System.out.println("读取过程存在异常");
}
}}
(2)续写式写入:
创建FileOutputStream流以写入数据到File对象表示的文件。 如果第二个参数为TRUE,则字节将覆盖式写入。
实例:
8.4 对字符流操作:Reader类、Writer类
8.4.1 抽象类:Reader
方法:
返回 | 方法 | 说明 |
---|---|---|
boolean | ready() | 判断此数据流是否准备好 |
int | read() | 读入一个字符,若已读到流结尾,则返回值为-1 |
int | read(char[ ]) | 读取一些字符到char[ ]数组内,并返回所读入的字符的数量,若已到达流结尾,则返回-1 |
Abscract int | read(char[ ] chars,int off,int len) | 读取一些字符到char[ ]数组下标从off开始到off+len的位置,并返回所读入的字符的数量,若已到达流结尾,则返回-1; |
void | reset() | 将当前输入流重新定位到最后一次mark()方法时的位置 |
void | mark(int readLimit) | 将当前输入流中做标记,当调用reset方法时将返回到该位置,从标记位置开始,到再读入readLimit个字符为止,这个标记都维持有效 |
boolean | markSupported | 测试当前输入流是否支持mark()方法和reset()方法。只要有一个方法不支持,则返回-1 |
long | skip(long n) | 跳过参数n指定的字符数量,并返回所跳过字符的数量 |
Abstract void | close() | 关闭字符输入流,并释放与之关联的所有资源 |
8.4.2 实例化:FileReader(读取)
package aaa;
import java.io.File;
import java.io.FileReader;
public class FileInAndOut {
public static void main(String[] args) {
//定义指定磁盘的文件的File对象
File file = new File("D://word.txt");
if(! file.exists()){
System.out.println("对不起,不包含指定路径的文件");
}else{
//根据指定路径的File对象创建FileReader对象
try {
FileReader fr = new FileReader(file);
char[] data = new char[23]; //定义char数组
int length = 0;
while((length = fr.read(data))>0){ //循环读取文件中的数据
String str = new String(data,0,length); //根据读取文件的内容创建String 对象
System.out.println(str); //输出读取内容
}
fr.close(); //关闭流
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
8.4.3 抽象类:Writer(写入)
方法:
返回 | 方法 | 说明 |
---|---|---|
void | write(char[ ] cbuf) | 将字符数组的数据写入字符输出流 |
Abstract void | write(char[ ] cbuf int off ,int len) | 将字符数组从下标off 开始向输入流写入长度为len的数据 |
void | write(int c ) | 向字符输入流中写入一个字符数据 |
void | write(String str ) | 向输入流中写入一个字符串数据 |
void | write(String str , int off ,int len) | 向输入流中写入一个字符串从off 开始长度为len的数据 |
Abstract void | flush() | 刷新当前输出流,并强制写入所有缓冲区的字节数据 |
void | close() | 向输出流中写入缓冲区的数据,然后关闭当前输出流,释放所有与当前输出流相关联的系统资源 |
8.4.4 实例化:FileWriter
(1)覆盖式写入:
【和字节流中的一样】
FileWriter fw = new FileWriter(file);
package aaa;
/**
* 通过给定的String类型参数的指定文件名称与路径,创建FileWriter类
*/
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo {
public static void main(String[] args) {
File file = new File("D://4.txt"); //创建指定文件
try {
if(! file.exists()){
file.createNewFile(); //如果指定文件不存在,新建文件
}
FileReader fr = new FileReader("D://4.txt");
FileWriter fw = new FileWriter(file); //创建FileWriter对象
fw.write("12345"); //向文件写入数据
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
(2)续写式写入:
FileWriter fw = new FileWriter(file,true);