文件流有很多类
FileInputStream FileoutputStream FileReader FileWriter
BufferedInputStream BufferedOutputSteam BufferReader BufferWriter 缓冲流 它们用来加快读取时间的,
然后直接看代码了:
第一个知识点是文件的创建和目录的创建:
/*
* File:既可以表示文件(.txt,doc,ppt,mp3,...)也可以表示文件目录(即文件夹),与平台无关
* File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。
* 路径:相对路径 % 绝对路径
*/
@Test
public void test2() throws IOException{
//采用字符串的形式,如果文件目录不存在,先执行文件的目录创建,再执行文件的创建
String filename = "G:\\test\\io2\\IO.txt";
File file = new File("G:\\test\\io2\\IO.txt");
boolean b = file.exists();
System.out.println(b);
if(!file.exists()){//如果文件不存在的话,那么需要去创建
//boolean b1 = file.createNewFile();//直接执行代码,肯定有系统找不到指定路径的异常抛出
boolean b1 =new File(filename.substring(0, filename.lastIndexOf("\\"))).mkdirs();//创建目录
if(b1){
boolean b2 = file.createNewFile();//创建文件
System.out.println(b2);
}
}
}
这里我们需要知道目录创建和文件的创建有什么不同:
函数介绍:
目录操作相关 mkDir()只能创建一级目录 mkDirs()可以创建多级目录 list() listFiles()
文件操作相关 createNewFile() 创建文件的, delete() 删除文件的
测试代码:
运行看看就知道是什么样子的,
@Test
public void test1() throws IOException{
//File file = new File("helloworld.txt");
File file = new File("G:\\test\\io\\hellowordl.txt");
boolean b = file.exists();
System.out.println(b);
if(!file.exists()){
//boolean b1 = file.createNewFile();//直接执行代码,肯定有系统找不到指定路径的异常抛出
boolean b1 = file.mkdirs();//创建目录
System.out.println(b1);
}
//System.out.println("!"+file.delete());
File file1 = new File("file");
System.out.println(file1.exists());
if(!file1.exists()){
boolean b2 = file1.mkdir();//默认路径是user.dir,也就是当前项目的路径下面
System.out.println("@"+b2);
}
}
上面的代码来自尚硅谷课程代码 大家自己可以去下载
二 输入流的测试:
/**
* 测试输入流,也就是从外部存储设备中读取数据到程序的内存中,称作输入操作
* @throws Exception
*/
@Test
public void testFileInputStream() throws Exception{
//首先需要一个文件,可以放到参数里面
File file = new File("file/iotest.txt");
//接下来需要申明一个输入流操作,注意是文件输入流,它是基类InputStream的子类
FileInputStream in = new FileInputStream(file);//存在文件没有找到的异常
//接下来需要从输入流中把内容数据读出来,
char temp ;//临时保存内容
if((in.read())!=-1){
temp =(char) in.read();//这种读法是每个字符每个字符的读取,而且这里读取的是第二个字符了,因为上面的if语句里面已经读取了一个字符了
System.out.println(temp);
}
}
上面的函数使用的是read(),它只能一个字符一个字符的读,
@Test
public void testFileInputStream() throws Exception{
//首先需要一个文件,可以放到参数里面
File file = new File("file/iotest.txt");
//接下来需要申明一个输入流操作,注意是文件输入流,它是基类InputStream的子类
FileInputStream in = new FileInputStream(file);//存在文件没有找到的异常
//接下来需要从输入流中把内容数据读出来,
int i ;//临时保存内容
while((i=in.read())!=-1){
char temp =(char)i;//这种读法是每个字符每个字符的读取,而且这里读取的是第二个字符了,因为上面的if语句里面已经读取了一个字符了
System.out.print(temp);
}
}
输出结果:就是文件里面所有的字符
最后一定要加上这一句:in.close();
这里我把它单独写出来,是因为显眼些:原因是
程序中打开的文件流io资源不属于内存里的资源,java垃圾回收机制无法回收该资源,所以需要显是关闭文件的io流
比较标准的写法:
public void testFileInputStream1() {
// 1.创建一个File的对象
File file = new File("file/iotest.txt");
// 2.将此File类的对象作为形参传递给InputStream的实现类FileInputStream的构造器中
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
// 3.通过调用流的read()方法将文件中的内容读入
int i;
while ((i = fis.read()) != -1) {
System.out.print((char) i);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 4.关闭现有的流
if (fis != null) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
三 测试输出流,也就是写操作:将内存中的数据输出到外部设备中,比如磁盘,光盘,等
// 测试输出流:将程序的内存数据输出到外部设备上,简称写操作
@Test
public void testFileOutputStream() {
File file = new File("file/outputstream.txt");
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
byte[] b = "now is outputstream test!".getBytes();//将一个字符串转换成byte数组
fos.write(b);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}