FileI/O
什么是流
流,是指一连串的流动的字符,是以先进的方式发送和接受数据的通道。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UhULhQfE-1626682565960)(F:\Typora文件\IO流.JPG)]
输入流::只能读取数据
输出流:只能写入数据
按照操作的数据单元格不同又可以分为字节流和字符流。
如何区分字节流与字符流
字节流的最小单元格为8位的字节,而字符流的最下单元格为16为的字符。
字节流通常用于二进制的文件,而字符流用于文本。他们的用法几乎一模一样。
按照"流"的流向还可以换分为输出流和输入流
字节的输入流:InputStream基类
字节的输出流:OutputStream基类
字符的输入流:Reader基类
字符的输出流:Writer基类
以字符的为例
字符的输入
package cn.bdqn.hClass.Sl;
import java.io.FileReader;
import java.io.IOException;
public class ReaderStream {
public static void main(String[] args) {
FileReader fdr = null;
try {
fdr=new FileReader("F:\\FileMethods\\hello.txt");//文件路径
char[] aChar = new char[32];//声明数组
//获取这个文件的大小
int hasReader =0;
//判断条件 Read()方法读取文件如果读取不到会返回-1
while ((hasReader=fdr.read(aChar))!=-1) {
System.out.println(new String(aChar, 0 , hasReader));//new strign对象实现输出 String(赋值的数组,开始的位置,结束的位置 );
}
//IO的错误必须
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
//关闭输入流 不关的话会消耗系统资源
fdr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K9BrY5M7-1626682565962)(F:\截图\QQ图片20210719111209.png)]
字符的输出
package cn.bdqn.hClass.Sl;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterTest {
public static void main(String[] args) {
//获取文件的路径 加true 可以保留文件里的原来的东西
try(FileWriter fw = new FileWriter("F:\\FileMethods\\hello.txt",true)){
//先给想打印的东西赋值给变量
String aString = "\n我是格里弗斯,闻到老子的狐臭了没有";
System.out.println();//换行
//输出
fw.write(aString);
} catch (IOException e) {
e.printStackTrace();
}
}
}
效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tYampwMC-1626682565964)(F:\截图\QQ图片20210719111353.png)]
使用字节流读文本的步骤
package cn.bdqn.hClass.Sl
import java.io.File;
public class FileMethods {
public static void main(String[] args) {
//创建FileMethods对象
FileMethods fm = new FileMethods();
//获取文件路径
File file = new File("F:\\FileMethods\\hello.txt");
//调用showFileInfo方法传入文件路径
fm.showFileInfo(file);
}
/**
* 显示文件信息
*/
public void showFileInfo(File file) {
if(file.exists()) {
if(file.isFile()) {
System.out.println("名称 "+file.getName());
System.out.println("相对"+file.getPath());
System.out.println("文件大 小"+file.length()+"字节");
}
}else {
System.out.println("文件不存在");
}
}
}
使用什么字节流更高效
可以用read()方法从输入流批量读取若干个字节,可以减少物理读文件或键盘的次数,提高输入/输出效率。
例如:
read(byte[]b)或read(byte[]b,int off,int len)
File类的常用方法
方法名称 | 说明 |
---|---|
boolean exists() | 判断目录或者文件是否存在 |
boolean isFile() | 判断是否是文件 |
boolean isDirectory() | 判断是否是目录 |
String getPath() | 返回此对象表示的相对路径 |
String getAbsolutePath() | 返回此对象表示的绝对路径 |
String getName() | 返回此对象表示的文件或目录名称 |
boolean delete() | 删除此对象指定的文件或目录 |
boolean createNewFile() | 创建名称的空文件,不创建文件夹 |
long length() | 返回文件的长度,单位为字节,若文件不存在,返回OL |
mkdir() | 创建目录 |
读取数据的常用方法
方法名 | 说明 |
---|---|
int read() | 读取一个字节 |
int read(byte[] b ) | 将数据读取到字节数组中 |
int read(byte[] b, int off,int len) | 从输入流中读取最多的len长度字节,保存到字节数组b中,保存位置从off开始 |
void close() | 关闭输入流 |
int available() | 返回输入流读取的估计字节数 |
OutputStream类的常用方法
方法名 | 说明 |
---|---|
void write(int c) | 写入一个字节数据 |
void write(byte[] b buf) | 写入数组buf的所有字节 |
void write(bute[] b,int off,int len) | 将字节数组中从off位置开始,长度为len的字节数据输出到流中 |
void close() | 关闭输入流 |
Reader类的常用方法
方法名 | 说明 |
---|---|
int read() | 从输入流中读取单个字符的长度 |
int read(byte[] b) | 从输入流中读取c.length长度的字符,保存到数组c中,返回实际的字符数 |
read(char[] c,int off,int len) | 从数据流中读取最多的len的长度字符,保存到字符数据组c中,保存位置从off开始,len结束 |
void close() | 关闭流 |
writer类常用方法
方法名 | 说明 |
---|---|
writer(String str) | 将str字符串里包含的字符输出到指定的输出流 |
writer(String str,int off,int len) | 将str字符串里从off位置开始长度len结束 |
void close() | 关闭输出流 |
void flush() | 刷新输出流 |
二进制文件的读写
1.使用字节流(DataInputStream)读取
FileInputStream fis=new FileInputStream("C:\Users\jijia\Desktop\Text\txt.txt");
DataInputStream dis=new DataInputStream(fis);
2.使用字节流(DataOutputStream)写入
FileOutputStream fos=new FileOutputStream("C:\Users\jijia\Desktop\Text\txt1.txt");
DataOutputStream out=new DataOutputStream(fos);
DataInputStream(fis);
2.使用字节流(DataOutputStream)写入
```java
FileOutputStream fos=new FileOutputStream("C:\Users\jijia\Desktop\Text\txt1.txt");
DataOutputStream out=new DataOutputStream(fos);