I/O(输入/输出)
从本质上来讲,输入流来读取数据,输出流来写入数据
输入流
InputStream类
InputStream类是子节输入流的抽象类,是所有字节输入流的父类
InputStream类中的所有方法遇到错误时,都会引发IOException异常
方法 | 返回值 | 说明 |
---|---|---|
read() | int | 从输入流中读取数据的下一个子节。返回0~255范围内的int字节值。如果因为已经到达流末尾而没有可以用的字节,则返回值-1 |
read(byte[] b) | int | 从输入流中读入一定长度的子节,并以整数的形式返回字节数 |
mark(int readlimit) | void | 在输入流的当前位置放置一个标记,readlimit参数告知此输出流在标记位置失效之前允许读取的字节数 |
reset() | void | 将输入指针返回到当前所做的标记处 |
skip(long n) | long | 跳过输入流上的n个子节并返回实际跳过的字节数 |
markSupported() | boolean | 如果当前流支持mark()/reset()操作就返回True |
close() | void | 关闭此输入流并释放与该流关联的所有系统资源 |
Reader类
Reader类是字符输入流的抽象类,所有字符输入流的实现都是它的子类
它的方法与InputStream中的方法类似,但是提供了一个ready()方法,该方法用来判断是否准备读取流,返回值为boolean类型
输出流
OutputStream类
OutputStream类是字节输出流的抽象类,此抽象类是表示输出字节流的所有类的超类
OutputStream类中的所有方法均返回void,在遇到错误时会引发IOException异常
Writer类
Writer类是字符输出流的抽象类,右手字符输出类的实现都是它的子类
File类
创建File对象
File(String pathname)
该构造方法通过将给定路径名字符串转换为抽象路径名来创建一个新File实例。
new File(String pathname)
//其中pathname值路径名称(包含文件名)例如
File file =new File("d:/1.txt");
File(String parent,String child)
该构造方法根据定义的父路径和子路径字符串(包含文件名)创建一个新的File对象
new File(String parent,String child)
//parent:父路径字符串,例如D:/或者D:/doc/
//child:子路径字符串,例如letter,txt
File(File f,String child)
该构造方法根据parent抽象路径名和child路径名字符串创建一个新File实例。
new File(File parent,String child)
//parent:父路径对象,例如D:/doc/
//child:子路径字符串,例如letter.txt
文件操作
import java.io.File;
import java.io.IOException;
import java.sql.Date;
import java.text.SimpleDateFormat;
public class FileText {
public static void main(String[] args) {
// TODO Auto-generated method stub
File file = new File("test.txt");// 创建文件对象
if (!file.exists()) { // 文件不存在
System.out.println("未在指定目录下找到文件名为“test”的文本文件!正在创建...");
try {
file.createNewFile(); // 创建文件
System.out.println("文件创建成功!");
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
} else {
System.out.println("找到文件名为”text“的文本文件!");
if (file.isFile() && file.canRead()) { // 该文件是一个标准文件且可读
System.out.println("文件可读,正在读取文件信息...");
String fileName = file.getName(); // 获得文件名
String filePath = file.getAbsolutePath();// 获得该文件的绝对路径
boolean hidden = file.isHidden(); // 获得该文件是否被隐藏
long len = file.length(); // 获取该文件中的字节数
long tempTime = file.lastModified(); // 获取该文件最后的修改时间
// 创建SimpleDateFormat对象,指定目标格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date(tempTime); // 使用“文件最后修改时间”创建Date对象
String time = sdf.format(date); // 格式化“文件最后的修改时间”
System.out.println("文件名:" + fileName);// 输出文件名
System.out.println("文件的绝对路径:" + filePath);// 输出文件的绝对路径
System.out.println("文件是否是隐藏文件:" + hidden);// 输出文件是否被隐藏
System.out.println("文件中的字节数:" + len);// 输出文件中的字节数
System.out.println("文件最后的修改时间:" + time);// 输出文件最后的修改时间
file.delete(); // 查完该文件信息后删除文件
System.out.println("这个文件已经被洗白了");
} else { // 文件不可读
System.out.println("文件不可读!");
}
}
}
}
文件夹操作
import java.io.File;
import java.util.*;
public class FolderTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String path="C:\\Test"; //声明文件夹Test所在的目录
for(int i=1;i<=10;i++){ //循环获得i值,并用i命名新的文件夹
File folder=new File(path+"\\"+i);//根据新的目录创建File对象
if(!folder.exists()){
folder.mkdirs();//创建新的文件夹(包括不存在的父类文件夹)
}
System.out.println("文件夹创建成功,请打开C盘查看!\n\nC盘文件及文件夹列表如下");
File file=new File("C:\\");//根据路径名创建File对象
File[] files=file.listFiles();//获取C盘的所有文件和文件夹
for(File folder :files){
if(folder.isFile())//判断是否为文件
System.out.println(folder.getName()+" 文件");//输出C盘下的所有文件的名称
else if(folder.isDirectory())//判断是否为文件夹
System.out.println(folder.getName()+" 文件夹");//输出C盘下的所有文件夹的名称
}
}
}
}
文件输入/输出流
FileInputStream类与FileOutputStream类
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileStreamTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
File file=new File("word.txt");
try {
FileOutputStream out =new FileOutputStream(file);
String content="你见过洛杉矶凌晨4点的样子吗?";
byte buy[]=content.getBytes();
out.write(buy);//将数组中的信息写入到文件中
out.close();//将流关闭
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
try {
FileInputStream in=new FileInputStream(file);
byte byt[]=new byte[1024];
int len=in.read(byt);
System.out.println("文件中的信息是:"+new String(byt,0,len));
in.close();
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
FileReader类与FileWriter类
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.InputMismatchException;
import java.util.Scanner;
public class ReaderAndWriter {
public static void main(String[] agrs) {
while (true) {// 设置无限循环,实现控制台的多次输入
try {
File file = new File("word.txt");
if (!file.exists()) {
file.createNewFile();
}
System.out.println("请输入要执行的操作序号:(1.写入文件;2.读取文件)");
Scanner sc = new Scanner(System.in);
int choice = sc.nextInt();
switch (choice) {
case 1:
System.out.println("请输入要写入文件的内容:");
String tempStr = sc.next();
FileWriter fw = null;// 声明字符输出流
try {
fw = new FileWriter(file, true);
// 创建可扩展的字符输出流,向文件中写入新数据时不覆盖已存在的数据
fw.write(tempStr + "\r\n");// 把控制台上的文本内容写入“word.txt”
} catch (IOException e) {
e.printStackTrace();
} finally {
fw.close();// 关闭字符输出流
}
System.out.println("上述内容已写到文本文件中!");
break;
case 2:
FileReader fr = null;
if (file.length() == 0) {// "word.txt"中的字符数为0时,控制台输出“文本中的字符数为0!”
System.out.println("文本中的字符数为0!");
} else {// "word.txt"中的字符数不为0
try {
fr = new FileReader(file);
char[] cbuf = new char[1024];
// 创建可容纳1024个字符的数组,用来储存读取的字符数的缓冲区
int hasread = -1;// 初始化已读的字符数
while ((hasread = fr.read(cbuf)) != -1) {
System.out.println("文件“word.txt”中的内容:\n" + new String(cbuf, 0, hasread));
// 把char数组中的内容转换为String类型输出
}
} catch (IOException e) {
e.printStackTrace();
} finally {
fr.close();// 关闭字符输入流
}
}
break;
default:
System.out.println("请输入符合要求的有效数字");
break;
}
} catch (InputMismatchException imexc) {
System.out.println("输入的文本格式不正确!请重新输入...");
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}