目录
1.常识
文件是存储在硬盘上的
硬盘和内存的区别:
1.内存存储空间小,硬盘空间大
2.内存访问速度快,硬盘速度慢
3.内存成本高,硬盘便宜
4.内存掉电数据丢失,硬盘掉电数据还在
2.File类
文件也是被操作系统管理的,操作系统内核中有一个专门的模块,文件系统
Java针对文件系统/文件进行了一系列的封装
文件操作,Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。
注意,有 File 对象,并不代表真实存在该文件。
即使本来存在这个文件,但是还是要调用File类来创建对象,从而达到操作文件的后续方法的实现
file类里面的方法与构造方法
public class Demo {
public static void main(String[] args) throws IOException {
File file = new File("d:/java/test.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());获取唯一的绝对路径
}
}
有些表示方法会用文件名的上层目录简单的用"."或者".."表示
如果路径中包含“.”或“..”等当前路径及上层路径表示法
public class Demo {
public static void main(String[] args) throws IOException {
File file = new File("./test.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());
}
}
getCanonicalPath()方法则会从路径名中删除“.”和“..”使用真实路径代替,这点是与相对获取绝对路径不同的一点.
"."代表当前这一层的文件,".."代表(所有的)父节点
IDEA中,直接运行一个程序,此时的基准目录就是当前项目所在的目录
相对路径是当前文件到目标文件的路径,而当前文件在IDEA指的是当前项目.
2.普通文件的创建与删除
public class Demo1 {//创建文件目录
public static void main(String[] args) throws IOException {
File file = new File("text/aaa/111/222");//在这里我们想要创建一个文件目录
System.out.println(file.exists());//一开始还没有创建目录之前是没有文件存在的
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println(file.createNewFile());
System.out.println("=====================");
//file.mkdir();//创建目录,如果中间目录不存在,则创建失败
file.mkdirs();//创建多级目录
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println(file.createNewFile());
}
}
File file = new File("test/aaa/111");
file.mkdirs();//创建多级目录
System.out.println(file.delete())//这个直接把文件删除
file.deleteOnExist();//这个知道程序结束后把文件删除
System.out.pintln(file.exist());//这个虽然会返回ture,但是因为程序还在运行所以没被删除
由此可见程序运行后,111这个文件还是被删除了
3.文件的重命名
File file = new File("some-file.txt"); // 要求 some-file.txt 得存在,可以
是普通文件,可以是目录
File dest = new File("dest.txt"); // 要求 dest.txt 不存在
System.out.println(file.renameTo(dest));//最后返回true
public class Demo1 {//创建文件目录
public static void main(String[] args) throws IOException {
File file = new File("./linjie.txt"); // 要求 原文件得存在,可以
//是普通文件,可以是目录
File dest = new File("./huawei.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());
修改之后得到
3.文件内容的读写
3.1文件的读取
1.InputStream类读取数据,由于是抽象类,所以用FileInputStream类创建对象,读取的是字节流的数据
想要读取英文字母时,返回的是它的ASCII码值,读取汉字的时候,按照utf8的编码规则,会得到三个字节一个汉字的编码
例子:
public static void main(String[] args) throws IOException {
//使用一下InputStream
//1.打开文件
InputStream inputStream = new FileInputStream("./text.txt");//相对路径
//2.读取文件
/* while(true){
int b = inputStream.read();
if( b == -1){
//返回值为-1说明文件读完
break;
}
System.out.println(b);
}
*/
byte[] b = new byte[1024];
int len = inputStream.read(b);
System.out.println(len);
for (int i = 0; i < len; i++){
System.out.println(b[i]);
}
//3.关闭文件
inputStream.close();
}
}
在文本文件里输入hello,返回
各自的ASCII码值
如果输入的是汉字
则一个汉字需要三个字节的数字表示,具体规则得看utf8的编码表
2.Read类采取字符流的方式读取数据
public class Demo2 {
//使用字符流读一下文件
public static void main(String[] args) throws IOException {
Reader reader = new FileReader("text.txt");
char [] buffer = new char[1024];
int len = reader.read(buffer);;
for (int i = 0; i < len; i++) {
System.out.println(buffer[i]);
}
reader.close();
}
}
字符流读取文档的方式较字节流更方便
但Scanner类是一种最简单读取数据的方法
Scanner scanner = new Scanner(System.in)
String a = scanner.next();
System.out.println(a);
这里的in就是代表我们上面说到的inputStream,System代表在系统用户自行输入数据
如果要在我们的文件读取的话,就修改一下Scanner的构造方法
public class Demo4 {
public static void main(String[] args) throws FileNotFoundException {
InputStream inputStream = new FileInputStream("text.txt");
Scanner scanner = new Scanner(inputStream);
String a = scanner.next();
System.out.println(a);
}
}
这个方法可以得到与我们输入完全一致的答案
3.2文件的写入
字节流:OutputStream/FileOutputStream
字符流:Writer/FileWriter
和Scanner相对的,还可以使用PrintWriter
printWriter跟我们的System.out.println有相像之处,前者在文件显示写入的内容,后者在系统面板上显示输出的内容
public static void main(String[] args) {
try(OutputStream outputStream = new FileOutputStream("text.txt")){
PrintWriter printWriter = new PrintWriter(outputStream);
printWriter.println("hello");
printWriter.flush();//刷新缓冲区,显示内容
}catch(IOException e){
e.printStackTrace();
}
}