对于文件的创建、修改,基本上每天都要发生在大部分人的电脑上,只不过我们是通过windows系统提供的功能进行操作。当然我们也可以自己通过代码来实现一些基本的文件操作。
#基础的文件操作
File file = new File("D:/text.txt");
在操作文件之前需要先创建一个文件变量,其构造方法如下:
我们用的最多的就只是第二种,我们通常使用的都是文件的绝对路径,相对路径则是用一个点(.)或是两个点(..)来表示,一个.表示当前目录,..表示当前目录的父目录。在创建好文件变量后,我们就可以对文件进行操作了。
1.获得文件属性
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("..\\hello-world.txt"); // 并不要求该文件真实存在
System.out.println(file.getParent());//得到父目录
System.out.println(file.getName());//得到文件名字
System.out.println(file.getPath());//得到当前所表示的路径
System.out.println(file.getAbsolutePath());//得到绝对路径
System.out.println(file.getCanonicalPath());//得到File修饰过的绝对路径
}
}
在上述代码中使用的就是相对路径,在IDEA中表示创建工程文件的父目录。
2.创建删除普通文件
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("hello-world.txt"); // 要求该文件不存在,才能看到相同
的现象
System.out.println(file.exists());//判断文件是否存在
System.out.println(file.isDirectory());//判断是否是目录
System.out.println(file.isFile());//判段是否是文件
System.out.println(file.createNewFile());//创建一个新文件
System.out.println(file.delete());//删除一个文件
}
}
同时删除文件中有一个特殊的方法就是deleteOnExit,
public class Demo5 {
public static void main(String[] args) throws IOException {
File file = new File("D:/text1.txt");
if(!file.exists()){
file.createNewFile();
}
System.out.println(file.exists());
file.deleteOnExit();
System.out.println(file.exists());
}
}
运行结果如下:
也就是说执行deleteOnExit后文件并没有立即删除而是当程序执行完后才删除。
3.目录的创建
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File dir = new File("some-dir"); // 要求该目录不存在,才能看到相同的现象
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
System.out.println(dir.mkdir());//创建目录
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
}
}
运行结果:
同时mkdir在中间目录不存在是可能会创建失败,此时我们就可以用mkdirs,
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File dir = new File("some-parent\\some-dir"); // some-parent 和 somedir 都不存在
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
System.out.println(dir.mkdirs());
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
}
}
运行结果:
4.文件的重命名
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File file = new File("some-file.txt"); // 要求 some-file.txt 得存在,可以
//是普通文件,可以是目录
File dest = new File("dest.txt"); // 要求 dest.txt 不存在
System.out.println(file.exists());
System.out.println(dest.exists());
System.out.println(file.renameTo(dest));
System.out.println(file.exists());
System.out.println(dest.exists());
}
}
运行结果:
因为将文件名字更改后会出现重名的文件所以要求dest.txt不存在。
#文件IO
在了解了文件的基本操作后我们就可以来对文件进行写入与读出了。
1.从文件中读入到控制台
此时我们要完成的操作是从文件中读取数据到控制台上,在这里我们要用到InputStream流从文件中读取,具体代码如下:
File file = new File("D:/text.txt");
InputStream input = new FileInputStream(file);
byte[] buff = new byte[1024];
int len = -1;
StringBuilder sb = new StringBuilder();
while((len = input.read(buff)) != -1){
sb.append(new String(buff,0,len));
}
System.out.println(sb);
这样就会从文件中读取数据并打印到控制台,其中buff相当于一个缓冲区,它代表了我们每次从文件中最多读取的字节数目(当前是根据字节流读取),我们多次读取文件将读取的字节数记录到len中而后通过字符串完成拼接,如果当我们读到文件的末尾就会返回EOF(end of file)此时len被赋值为-1则读取结束。当然,我们通过字节流读取一些英文字母不会出现问题,但是如果我们用其读取汉字则有可能会出现乱码,这是因为多次读取的汉字进行拼接时可能会出现一些乱码,当然如果缓存区能够一次放下所有数据那么也不会出现问题。
此时我们就可以采用字符流来读取,具体代码如下:
File file = new File("D:/text.txt");
Reader reader = new FileReader(file);
char[] buff = new char[1024];
int len = -1;
StringBuilder sb = new StringBuilder();
while((len = reader.read(buff)) != -1){
sb.append(new String(buff,0,len));
}
System.out.println(sb);
与字节流不同的时字符流读取是以字符为单位读取,所以说字节流适合读一些英文字符,字符流适合读一些中文汉字。
2.从控制台写入文件
学会了从文件中读取数据到控制台,那么从控制台中写入数据到文件也就不是意见难事。
具体代码如下:
File file = new File("D:/text.txt");
OutputStream out = new FileOutputStream(file);
BufferedOutputStream buff = new BufferedOutputStream(out);
String s = "hello world";
buff.write(s.getBytes(),0,s.getBytes().length);
buff.close();
写入文件的代码与写入控制台的代码并没有本质的区别,只不过此时写入的缓冲区存在一个专门的类BufferOutputStream,同时注意由于我们写入是按字节流,所以我们要将字符串转化为字节类型时得到的也是字节的长度,最后在使用写入操作中使用缓冲区要记得关闭缓存来刷新缓冲区否则由于缓冲区未满则可能不会将数据写入文件。
同样的通过字符流写入文件的代码如下:
File file = new File("D:/text.txt");
Writer writer = new FileWriter(file);
String s = "你好 世界";
writer.write(s.toCharArray(),0,s.toCharArray().length);
writer.close();