java IO流 之 InputStream 和 OutputStream
文章目录
一、File类
1、File类的使用
java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关。File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。
2、构造方法
这里是官方文档📕
(1)File(String parent, String child)
以parent为父路径,child为子路径创建File对象。
(2)File(String pathname)
以pathname为路径创建File对象,可以是 绝对路径或者相对路径.
(3)File(File parent, String child)
根据一个父File对象和子文件路径创建File对象
用法示例:
public class Main1 {
public static void main(String[] args) {
{
//File(String parent, String child)
// 父结点,一般都是目录
File file = new File("D:\\IO", "Lvvvvv.txt");
System.out.println(file);
}
{
//File(String pathname)
//绝对路径
File file = new File("D:\\IO\\Lvvvvv.txt");
System.out.println(file);
// 对象存在
// 文件并不存在
}
{
//File(File parent, String child)
// 父结点,一般都是目录
File parent = new File("D:\\IO");
File file = new File(parent, "Lvvvvv.txt");
System.out.println(file);
}
}
}
结果:
但需要注意的是,文件路径存在,但文件不一定存在。
3、常用方法
- public String getAbsolutePath():获取绝对路径
- public String getPath() :获取路径
- public String getName() :获取名称
- public String getParent():获取上层文件目录路径。若无,返回null
- public long length() :获取文件长度(即:字节数)。不能获取目录的长度。
- public boolean canRead() :判断是否可读
- public boolean canWrite() :判断是否可写
- public boolean canExecute():判断是否可执行
- public boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
- public boolean mkdirs() :创建文件目录。可以连同父目录一起创建。
- public boolean isFile():判断是否是文件(前提:存在&&是文件)
- public boolean isDirectory():判断是否是目录(前提:存在&&是目录)
还有很多,用的时候记得去官方文档查看。
4、绝对路径&&相对路径
(1)绝对路径
从一棵树的根节点出发,到达相对应节点的完整路径。
如上图所示,Java1文件的绝对路径: D: -> Excaption -> Java1 。
Windows使用反斜杠 \ 作为分隔符,所以其绝对路径可以写为:D:\Excaption\Java1。
在代码中,由于反斜杠 \ 是转义字符,所以需要先用 \ 对 \ 进行转义,完整路径: “D:\Excaption\Java1”
(2)相对路径
相对于“当前位置”而言的路径,此时就不是从根目录出发了。
如上图所示,要去找Java2文件,我们是在D:\Excaption\Java1,所以此时需要:回到上一层->Excaption->Java2。
用…表示回到上一层,用 . 描述当前层
所以相对路径:“… \Excaption\Java2”。
二、IO
Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。
相对于内存来说,从文件或网络连接中读取数据到内存称为输入流(InputStream和Reader),从内存中读取数据往文件中写称为输出流(OutputStream和Writer)。今天就先学一下InputStream和OutputStream。
三、java.io.InputStream
将文件或网络中的数据读到内存(进程)中,就是 InputStream。
public class file_read_1 {
public static void main(String[] args) throws IOException {
File file = new File("hello.txt");//创建文件对象
System.out.println(file.createNewFile());
System.out.println(file.exists());
//这样写得手动关闭文件
// InputStream is=new FileInputStream("hello.txt");
// byte[] b=new byte[20];
// int n= is.read(b); //n:代表读了多少个
// System.out.println(n);
// System.out.println(Arrays.toString(b));
// is.close();
//这样写不用手动关闭文件
try(InputStream is=new FileInputStream("hello.txt");){
byte[] b=new byte[20];
int n= is.read(b);//n:代表本次读了多少字节的数据
System.out.println(n);
System.out.println(Arrays.toString(b));
n=is.read(b);//n:表示下一个字节的数据
System.out.println(n);//此时会输出-1,因为文件里的数据已经读完了(EOS:End Of Stream)
}
}
}
细节问题: -1表示数据读完啦(EOS:End Of Stream)
四、java.io.OutputStream
从内存(进程)往文件或外部设备中写,就是 OutputStream。
需要注意的是,输出是覆盖式的输出,会修改源文件内容。
现在我有一个hello.txt文件,先读一下文件的内容:
public class file_read {
public static void main(String[] args) throws IOException {
try(InputStream is=new FileInputStream("hello.txt")){
Scanner scanner = new Scanner(is,"UTF-8");
while(scanner.hasNext()){
System.out.println(scanner.next());
}
}
}
}
这是文件的内容,当我们使用OutputStream流向该文件写的时候,由于输出是覆盖式的,所以会修改源文件的内容:
public class file_write_1 {
public static void main(String[] args) throws IOException {
try(OutputStream os=new FileOutputStream("hello.txt")){
byte[] b=new byte[]{'h','e','l','l','o','\r','\n','1','2'};
os.write(b);
os.flush();
}
}
}
在这段代码中,向hello.txt文件中写数据,然后我们再读数据,看源文件内容的变化情况:
如图所示,源文件内容已经被改变。所以在使用OutputStream的时候需要注意它覆盖式输出这一点。
总结
IO这儿,会用就行,拜拜🙋♀️