目录
一、IO流介绍
字节流的抽象基类:
InputStream,OutputStream
字符流的抽象基类:
Reader,Writer
由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀,如InputStream的子类FileInputStream,Reader的子类FileReader
二、File
1、介绍一下File类:java.io.File
- File对象可以作为参数传递给流的构造器
- File 能新建、删除、重命名文件和目录
- 但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流
2、构造器:
- public File(String pathname)【文件的路径,可以是绝对路径也能是相对路径】
- public File(String parent,String child)【parent是父级目录,child是相对父级目录下的子路径】
- public File(File parent,String child)【parent是父类对象,child是相对父级目录下的子路径】
3、路径分隔符
因为不同的平台可能使用的路径分隔符不同,有用“\\”“、”\“”或者"/"的,为了解决跨平台的问题,java提供了File.seperator常量,能自动根据操作系统,动态使用不同的分隔符
File file1 = new File("d:\\testIO");
File file2 = new File("d:"+File.separator+"testIO");
4、常用方法
- public String getAbsolutePath():获取绝对路径
- public boolean isDirectory():判断是否是文件目录
- public boolean isFile() :判断是否是文件
- public boolean exists() :判断是否存在
- public boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建
- public boolean delete():删除文件或者文件夹(删除的文件夹下不能有文件)
- public boolean mkdirs() :创建文件目录。如果上层文件目录不存在,一并创建注意事项:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。
三、流的分类
- 按照“流”的数据流向,可以将其化分为:输入流和输出流。
- 按照“流”中处理数据的单位,可以将其区分为:字节流和字符流。在java中,字节是占1个Byte,即8位;而字符是占2个Byte,即16位。
四、流的使用
1、使用步骤
不管使用的是字节流还是字符流,其基本的操作流程几乎是一样的,以文件操作为例。
根据文件路径创建File类对象 ;
-
根据字节流或字符流的子类实例化父类对象 ;
-
进行数据的读取或写入操作
-
关闭流(close())
对于IO操作属于资源处理,所有的资源处理操作(IO操作、数据库操作、网络)最后必须要进行关闭。
2、使用说明
我们可以先了解下面这五个类
inputStream-->FileInputStream
OutputStream-->FileOutputStream
字节流读取文件的时候,拿到的是byte型数据
写入文件的时候,也只能写入字节,可以通过getBytes()转换
Reader-->FileReader
Writer-->FileWriter
字符流读取文件的时候,拿到的是char型数据
写入文件的时候,支持直接写入字符串,Writer类提供了一个直接输出字符串的方法
字节流转换成字符流
通过Writer的子类OutputStreamWriter或者Reader的子类InputStreamReader
一定要记得关闭流!!!被引用的要后关!例如下面的testConvert方法中,writer要先关
3、使用示例
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
public class TestFile {
public static void main(String[] args) {
//操作过程都是分三步:初始化--》读或写--》关闭流
try {
testInputStream();
testOutputStream();
testReader();
testWriter();
testConvert();
testConvert2();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void testConvert2() throws IOException {
File file = new File("D:\\bq\\c.txt");
if (file.exists()) {
InputStream is = new FileInputStream(file);
Reader reader = new InputStreamReader(is);
char[] chs = new char[1024];
int len = reader.read(chs);
System.out.println(new String(chs, 0, len));
reader.close();
}
}
private static void testConvert() throws IOException {
File file = new File("D:\\bq\\wirte\\c.txt");
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
OutputStream ot = new FileOutputStream(file);
Writer writer = new OutputStreamWriter(ot);
writer.write("我是testConvert!!!!");
writer.close();
ot.close();
}
private static void testWriter() throws IOException {
File file = new File("D:\\bq\\wirte\\b.txt");
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
Writer writer = new FileWriter(file);
String msg = "我是testWriter!";
writer.write(msg);
writer.close();
}
private static void testReader() throws IOException {
File file = new File("D:\\bq\\b.txt");
if (file.exists()) {
Reader reader = new FileReader(file);
char[] chs = new char[1024];
int len = reader.read(chs);
System.out.println(new String(chs, 0, len));
reader.close();
}
}
private static void testOutputStream() throws IOException {
File file = new File("D:\\bq\\wirte\\a.txt");
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
OutputStream ot = new FileOutputStream(file);
String msg = "我是testOutputStream!";
ot.write(msg.getBytes());
ot.close();
}
private static void testInputStream() throws IOException {
File file = new File("D:\\bq\\a.txt");
if (file.exists()) {
InputStream is = new FileInputStream(file);
byte[] arr = new byte[1024];
int len = is.read(arr);// 此时数据读取到数组中
System.out.println(new String(arr, 0, len));
is.close();
}
}
}