1.I/O流
流是一组有序的数据序列,根据操作类型,可分为输入流和输出流。I/O(Input/Output,输入流/输出流)流是用来处理设备间的数据传输。在Java中对于数据的操作是通过流的方式操作的,用于操作这些流的类都放在java.io包中。
2.输入流:
InputStream类是字节输入流的抽象类,是所有字节输入流的父类。该类中所有的方法遇到错误都会引发IOException异常。
该类中的一些方法:
(1).read()方法:从输入流中读取数据的下一个字节。返回值0~255范围内的int字节值。如果因为读取到达末尾没有可用的字节,返回值为-1。
(2).read(byte[] b)方法:从输入流中读入一定长度的字节,并以整数的形式返回字节。
(3).make(int readlimit)方法:在输入流的当前位置放置一个标记,readlimit参数告知此输出流在标记位置失效之前运行读取的字节数。
(4).reset()方法:将输入指针返回到当前所做的标记处。
(5).skip():跳过输入流上的n个字节并返回实际跳过的字节数。
(6).markSupported():如果当前流支持mark()/reset()操作就返回ture;
(7).close():关闭此输入流并释放与该流关联的所有系统资源。
3.输出流
OutputStream类是字节输出流的抽象类,此抽象类是表示输出字节流的所有类的超类。该类中所有的方法返回值均为void,遇到错误都会引发IOException异常。
该类中的一些方法:
(1).write(int b)方法:将指定字节写入此输入流。
(2).write(byte[] b)方法:将b个字节从指定的byte数组写入此输出流。
(3).write(byte[] b,int off,int len)方法:将指定byte数组中从偏移量off开始的len个字节写入此输出流。
(4).flush()方法:彻底完成输出并清空缓存区。
(5)close()方法:关闭输出流。
4.File类
File类是java.io包中唯一代表磁盘文件的对象。File类定义了一些与平台无关的方法来操作文件,可以通过调用File类中的方法,实现创建、删除、重命名文件等操作。File类的对象主要用来获取文本本身的一些信息,如文件所在的目录、文件的长度、文件的读写权限等。数据流可以将数据写入文件,文件也是数据流最常用的数据媒体。
4.1.文件的创建于删除
使用File来创建文件对象常用的2种构造方法:
(1)File(String pathname)
该构造方法通常将给定路径名字字符串转换成抽象路径来创建一个新的File实例。
语法:new File(String pathname) //pathname表示包含文件名的路径名
示例:File file=new File("D:\a.txt");//表示在D盘创建一个a.txt的文本对象
(2)File(String parent,String child)
该构造方法根据定义的父路径和子路径字符串(含文件名)创建一个新的File对象。
语法:File(String parent,Staring child)//parent:父路径 child:子路径(含文件名)
示例:File file=new File("D:\","a.txt");//表示方法同(1)中示例
File类的常用方法:
方法 | 返回值类型 | 说明 |
getName() | String | 获取文件的名称 |
canRead() | boolean | 判断文件是否为可读 |
canWrite() | boolean | 判断文件是否可被写入 |
exits() | boolean | 判断文件是否存在 |
length() | long | 获取文件的长度(以字节为单位) |
getAbsolutePath() | String | 获取文件的绝对路径 |
getParent() | String | 获取文件的父路径 |
isFile() | boolean | 判断文件是否存在 |
isDirectory() | boolean | 判断文件是否为一个目录 |
isHidden() | boolean | 判断文件是否为隐藏文件 |
lastModified() | long | 获取文件最后的修改时间 |
注:lastModified()返回值,表示文件最后一次被修改的时间的 long 值,用该时间与历元(1970 年 1 月 1 日,00:00:00 GMT)的时间差来计算此值(以毫秒为单位)。
上述的部分File操作如下:
package test;
import java.io.*;
public class FileText {
public static void main(String[] args) {
File file=new File("d:/a.txt");
if(file.exists()) //文件存在时
{
System.out.println("该文件存在!");
}
else { //文件不存在时
System.out.println("该文件不存在!");
try { //try语句块捕捉可能出现的异常信息
file.createNewFile(); //创建文件
System.out.println("文件已创建");
}
catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("该文件的名字是:"+file.getName());//显示文件名称
System.out.println("该文件是否可读:"+file.canRead());//判断文件可读性 false=不可读 true=可读
System.out.println("该文件是否可写:"+file.canWrite());//判断文件可写性 false=不可写 true=可写
System.out.println("该文件是否为一个目录:"+file.isDirectory());//判断文件是否为目录
System.out.println("该文件是否为隐藏文件:"+file.isHidden());//判断文件是否为隐藏文件
System.out.println("该文件的长度为:"+file.length()+"字节");//输出文件的长度,即文件多少字节
System.out.println("该文件的绝对路径为:"+file.getAbsolutePath());//输出文件的绝对路径
System.out.println("该文件的父路径为:"+file.getParent());//输出文件的父路径
System.out.println("该文件最后修改时间为:"+file.lastModified());//输出文件的最后修改时间,注:输出的位一个long型整数
//1970年1月1日 00:00:00的时间只差(单位为毫秒)
String str=file.getName();
file.delete();//删除文件
System.out.println("文件"+str+"已删除");
}
}
5.FileReader和FileWriter
5.1.FileReader对文件数据读操作步骤:
(1).使用FileReader流关联文件
(2).利用FileReader的读方法读数据
(3).利用FileReader的关流方法释放占用的系统底层资源
5.2.FileReader方法
(1).构造方法
FileReader(String fileName) 传入一个文件的路径
(2).成员方法
void read(int s) 读取单个字符
void read(char [] str) 读取一个字符数组
void close() 关流释放系统底层资源
5.3.FileWriter向文件中写数据操作步骤:
(1).使用FileWriter流关联文件
(2).利用FileWriter的写方法写数据
(3).利用FileWriter的刷新方法将数据从内存刷到硬盘上
(4).利用FileWriter的关流方法释放占用的系统底层资源
5.4FileWriter方法:
(1)构造方法
FileWriter(String fileName) 传入一个文件的路径
(2)成员方法
void write(String str) 向文件中写str
void write(String str,int begin,int end) 将str中指定段落写入文件
void write(char ch) 写入一个字符
void write(char [] str) 写入一个字符数组
void flush() 将内存中的数据刷新到文件中
void close() 关流释放系统底层资源
FileReader和FileWriter部分方法的实现:
package test;
import java.io.*;
import java.util.*;
public class ReadWriteTest {
public static void main(String[] args) throws IOException{
Scanner sc=new Scanner(System.in);
//文件写操作
FileWriter fw=new FileWriter("D:\\a.txt");
System.out.println("文件写操作:");
System.out.print("请输出一串字符串:");
String str=sc.nextLine();
fw.write(str); //写入刚才输入的字符串
fw.flush();
fw.write(str); //如果重复执行该操作,将会继续在文件第一次写入的末尾不换行继续中写入字符串str的内容
fw.flush();
fw.write(str,1,3); //该操作是将下标索引为1到3的内容写入文件(1<=n<=3)即字符串中从索引为1开始写入到索引为3截止
fw.flush();
//输出\n时可以实现文本换行,但是Windows系统自带的记事本中,系统识别的换行时\r\n,而不是\n
//Windows : \r\n
//Linux : \n
fw.write("\r\n"); //换行
fw.write(str); //换行后重新写入str
fw.close(); //释放资源
//文件读操作(一次读取一个字符)
System.out.println("文件读操作1:");
FileReader fr1=new FileReader("D:\\a.txt");
int ch=0; //存储fr1.read()的返回值,当读取的是字符时,将该变量强制转换成对应的字符输出
while((ch=fr1.read())!=-1) //当读取到文件末尾时,返回值为-1
{
System.out.print((char)ch); //因为读取时是将字符按照编码读取,所以需要强制转换成字符
}
System.out.println();
fr1.close(); //释放资源
//用字符数组进行文件读操作
System.out.println("文件读操作2:");
FileReader fr2=new FileReader("D:\\a.txt");
char[] str2=new char[1024]; //申请字符数组
int ch2=0; //存储fr1.read()的返回值,仅用于文件结束判断
while((ch2=fr2.read(str2))!=-1) //将读取到的字符数据存储到字符数组中,当读取到文件末尾时,返回值为-1,
{
System.out.print(str2); //将字符数组的内容输出
}
System.out.println();
fr2.close(); //释放资源
}
}
/*
* 运行样例:
文件写操作:
请输出一串字符串:0123456
文件读操作1:
01234560123456123
0123456
文件读操作2:
01234560123456123
0123456
注:因为文件流读取时使用的编码方式和文件本身编码方式不同,会造成读取出来文件乱码.
*/