文章目录
基本概念
文件:计算机上的文件分为两种,文本文件与二进制文件,文本文件是可以用记事本打开的文件,二进制文件是不可以用记事本直接打开的文件,比如多媒体文件等。
内存与硬盘:文件存储在硬盘中,硬盘可实现文件的持久化保存,当要对文件进行操作时,要先将硬盘中的文件读到内存中进行操作,操作后再将数据保存到硬盘中,将硬盘中的文件读入到内存需要使用输入流,将内存中的数据保存到硬盘需要用到输出流,这里的输入输出是相对于内存的描述。
文件的基本操作
指定文件
指定文件对象-通过目录 File f = new File("F:\\test\\ss.txt");
目录结构
文件判断
判断文件是否存在 System.out.println("文件是否存在"+f.exists()); 判断文件是否是个目录 System.out.println("文件是目录?"+f.isDirectory()); 判断文件是否是File(非目录) System.out.println("文件是文件?"+f.isFile());
输出
创建, 删除,重命名,移动(剪切)
创建文件夹 f.mkdir() ; //只能创建一级目录 f.mkdirs() ; //可创建多级目录 创建文件 f.createNewFile(); //创建文件 删除文件 f.delete(); 改名 f.renameTo(new File("abc.txt")); 移动 f.renameTo(new File(""D:\\test\\ss.txt")); //路径不同,可实现移动
获得相关文件信息
常用的方法 f.getAbsolutePath(); //获得绝对路径 f.getPath(); //获得相对路径 f.getName() ; //获得文件名 f.getParent(); //获得父目录 f.length() ; //获得文件大小
获取文件夹下的文件
String[] str = f.list(); //获取文件夹下所有文件名(包含文件夹) for (String string : str) { System.out.println(string); } System.out.println("---------------------------"); File[] files = f.listFiles(); //获取文件夹下所有文件(包含文件夹) for (File file : files) { System.out.println(file.getAbsolutePath()); }
目录结构:abc为空,bbb不为空
输出结果:
IO流
字节输入流 — FileInputStream
FileInputStream .read()
读取一个字节 ;
FileInputStream .read(byte[])
用字节数组保存读取到的数据,返回读取到的字节数 ;
简单实现,通过一个4字节数组,往复读取文本文件并显示出来。
public void InputStreamTest() {
FileInputStream input = null;
try {
input = new FileInputStream("StreamTest");
byte[] data = new byte[4];
int length = -1;
while ((length = input.read(data))!=-1) {
System.out.print(new String(data,0,length));
}
} catch (Exception e) {
}finally {
try {
if (input!=null) {
input.close(); //关闭输入流
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
字节输出流 — FileOutputStream
FileInputStream .write()
写入一个字节 ;
FileInputStream .write(byte[])
将字节数组写入
简单示例:
public static void main(String[] args) {
// TODO Auto-generated method stub
FileOutputStream output = null;
try {
output = new FileOutputStream("StreamTest");
output.write("123456dddd".getBytes(),0,6); //字节数组写
} catch (Exception e) {
// TODO: handle exception
}finally {
try { //关闭输出流
if (output!=null) {
output.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
两次运行-输出:
output = new FileOutputStream("StreamTest",true);
//true 追加写入,默认覆盖
public static void main(String[] args) {
// TODO Auto-generated method stub
FileOutputStream output = null;
try {
output = new FileOutputStream("StreamTest",true);
//true 追加写入,默认覆盖
output.write("123456dddd".getBytes(),0,6); //字节数组写
} catch (Exception e) {
// TODO: handle exception
}finally {
try { //关闭输出流
if (output!=null) {
output.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
两次运行-输出:
缓冲字节流 BufferedOutputStream / BufferedInputStream
缓冲区流是一种包装流,对基本流进行包装管理。为其加入缓冲区,减少不必要的IO操作,增加效率。
public static void main(String[] args) {
// TODO Auto-generated method stub
BufferedOutputStream bfoutput = null;
try {
bfoutput = new BufferedOutputStream(new FileOutputStream("StreamTest"));
写入操作与 FileOutputStream 相同
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
bfoutput.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
缓冲区满了,或者关闭流的时候才会将缓冲区中内容写入硬盘。
主动写入可使用 : bfoutput.flush();
缓冲输入流一次读取一个缓冲区的数据,程序读取数据时将从缓冲区提供给程序。
基本字符流:OutputStreamWriter / InputStreamReader
OutputStreamWriter 和 InputStreamReader 也是包装流。
OutputStreamWriter 和 InputStreamReader 自带缓冲区
OutputStreamWriter 的写方法:
public static void main(String[] args) {
// TODO Auto-generated method stub
OutputStreamWriter writer = null;
try {
writer = new OutputStreamWriter(new FileOutputStream("StreamTest"),"UTF-8");
可以指定编码格式
writer.write("你好中国");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
InputStreamReader 类似
InputStreamReader 的读方法:
public static void main(String[] args) throws Exception {
InputStreamReader reader = new InputStreamReader(new FileInputStream("StreamTest"),"GBK");
char[] data = new char[1024];
reader.read(data);
System.out.println(data);
}
简化字符流:FileWriter / FileReader
FileWriter / FileReader 是 OutputStreamWriter / InputStreamReader 的简化,是基本流,可以直接使用文件路径初始化。
实际上只是重写了OutputStreamWriter / InputStreamReader 的构造方法,内部实现了字节流的创建和包装。
但是FileWriter / FileReader 无法指定编码方式
,会按照默认GBK方式读写
public static void main(String[] args) throws Exception {
FileReader reader = new FileReader("SteamText");
FileWriter writer = new FileWriter("SteamText");
}
缓冲字符流 BufferedWriter / BufferedReader
虽然OutputStreamWriter 和 InputStreamReader 自带缓冲区
,但是缓冲区不可改变大小。
缓冲字符流 BufferedWriter / BufferedReader是对字符流
进行包装。
public static void main(String[] args) throws Exception {
BufferedReader reader = new BufferedReader(new FileReader("SteamText"));
BufferedWriter writer = new BufferedWriter(new FileWriter("SteamText"));
reader.readLine();可以读取一行
}