JAVA中FileInputStream和FileOutputStream使用方法
FileInputStream和FileOutputStream分别继承自InputStream和OutputStream这两个抽象类,在对文件进行读取和写入的时候经常用到。InputStream和OutputStream都是称为IO流体系下的字节流,顾名思义就是安装字符为单位进行处理的流
FileInputStream
先来复习一波File
package BasicPractice.FileTest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
public class FileTest01 {
public static void main(String[] args) throws IOException {
File file = new File("src\\filetest.txt");
//取绝对路径
System.out.println(file.getAbsolutePath());
//取相对路径
System.out.println(file.getPath());
//此路径下的文件是否是一个文件
System.out.println(file.isFile());
//此路径下的文件是否是一个文件夹
System.out.println(file.isDirectory());
//取文件的名字
System.out.println(file.getName());
//取该文件的父文件夹
System.out.println(file.getParentFile());
//判断该文件是否存在
System.out.println(file.exists());
//获得该文件最后一次修改时间(得出的是时间戳)
long time = file.lastModified();
System.out.println(time);
System.out.println(new SimpleDateFormat("yyyy年MM月dd HH:mm:ss").format(time));
//创建file01.txt文件
File file1 = new File("src\\file01.txt");
System.out.println(file1.createNewFile());
//创建多级目录
File file2 = new File("D:/a1/b2/c3");
System.out.println(file2.mkdirs());
//删除文件或空文件夹
File file3 = new File("D:/a1/b2/c3/1.txt");
System.out.println(file3.delete());
//file.list()方法会列出所有文件的名字(一级文件)
File file4 = new File("D:/a1/b2/c3");
String[] names = file4.list();
for (String name : names) {
System.out.println(name);
}
//file.listFiles()会返回File对象到一个file数组中(一级文件)
File file5 = new File("D:/a1/b2/c3");
File[] files = file5.listFiles();
for (File file6 : files) {
System.out.println(file6.getAbsolutePath());
}
}
}
妙招:点击项目中你所要选的file,右击选中copyPath即可复制其绝对路径
下面进入到FileInputStream
package BasicPractice.basicJava;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class IOtest01 {
public static void main(String[] args) throws IOException {
InputStream is = new FileInputStream("src\\filetest.txt");
InputStream is02 = new FileInputStream("src\\filetest02.txt");
InputStream is03 = new FileInputStream("src\\filetest03.txt");
//一个字节一个字节读
int b1 = is.read();
System.out.println((char)b1);
int b2 = is.read();
System.out.println((char)b2);
int b3 = is.read();
System.out.println((char)b3);
int c;
while((c = is.read()) != -1){
System.out.print((char)c);
}
//指定一个字节数组,大小为3,这样一次读取3个字节(一般UTF-8的中文汉字一个就是3字节)
byte[] buffer = new byte[3];
int len = is02.read(buffer);
System.out.println("读取字节数:"+ len);
String s = new String(buffer);
System.out.println(s);
//可以规定读取这个buffer里多少字节
int len02 = is02.read(buffer);
System.out.println("读取字节数:"+ len02);
String s2 = new String(buffer, 0, len02);
System.out.println(s2);
//一次性读取这个文件
int len04;
while((len04 = is03.read(buffer)) != -1){
System.out.print(new String(buffer,0, len04));
}
}
}
另一种读取文件所有内容的方式
package BasicPractice.FileTest;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileTest02 {
public static void main(String[] args) throws IOException {
//读取文件所有内容
File file = new File("src\\filetest03.txt");
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[(int)file.length()];
int len = fis.read(buffer);
System.out.println("字节大小:" + len);
System.out.println("文件大小:" + len + "字节");
System.out.println(new String(buffer));
}
}
上面代码可以看出,直接在new的字节数组中传递文件的字节大小(注意,file.length()这个方法返回的是long类型,而new byte[]里支持int型,所以要强制转换类型为int)
FileOutputStream
简单地写入文件
package BasicPractice.FileTest;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class FileTest03 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("src\\filetest04.txt");
byte[] buffer = "abc王者荣耀".getBytes();
fos.write(buffer);
//换行我们一般使用\r\n
fos.write("\r\n".getBytes());
//这里97代表ASCII码中的'a'
fos.write(97);
//写入字母'p'
fos.write('p');
//写入一定要刷新,让写入的东西保存
fos.flush();
//刷新并关闭流
fos.close();
}
}
filetest04.txt如下
一般这样做都是重写了file文件,即便原先你的file文件里由内容也会被覆盖掉,但是如果在FileOutputStream构造方法后面加个true,就代表在原来文件上追加内容。
File file = new FileOutputStream("D://ad",true);
文件拷贝
将filetest04.txt拷贝到同级目录下,新文件名叫filetest05.txt
package BasicPractice.FileTest;
import java.io.*;
public class FileTest04 {
public static void main(String[] args) throws IOException {
//创建一个字节输入流管道
InputStream fis = new FileInputStream("src\\filetest04.txt");
//创建一个字节输出流管道
FileOutputStream fos = new FileOutputStream("src\\filetest05.txt");
//创建一个字节数组用来转移数据
byte[] buffer = new byte[1024];
int len;
while((len = fis.read(buffer)) != -1){
fos.write(buffer, 0, len);
}
//关闭流
fos.close();
fis.close();
}
}
注意:任何文件的底层都是字节,拷贝是拷贝的字节,只要文件格式,编码格式没有问题就行
还有另一种释放资源的方式,利用try catch
package BasicPractice.FileTest;
import java.io.*;
public class FileTest04 {
public static void main(String[] args){
try(
//try括号里只能放资源对象,这些资源对象用完会自动关闭资源,不用手动写close()
//创建一个字节输入流管道
InputStream fis = new FileInputStream("src\\filetest04.txt");
//创建一个字节输出流管道
FileOutputStream fos = new FileOutputStream("src\\filetest05.txt");
){
//创建一个字节数组用来转移数据
byte[] buffer = new byte[1024];
int len;
while((len = fis.read(buffer)) != -1){
fos.write(buffer, 0, len);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
那么什么是资源对象呢?
资源对象都是实现了Closeable或者AutoCloseable接口的类对象
也就是你可以自定义一个类,实现Closeable接口,重写close方法,那么你的自定义类也可以用在try()里了