JAVA文件操作各种流
一、文件操作流(File类)
常用方法:
1、创建文件
package JAVAIO;
import java.io.File;
import java.io.IOException;
public class File_ceshi {
public static void main(String[] args) {
File f = new File("E:"+File.separator+"test.txt");
try {
f.createNewFile();
}catch(IOException e){
e.printStackTrace();
}
}
}
2、文件删除
package JAVAIO;
import java.io.File;
import java.io.IOException;
public class File_ceshi {
public static void main(String[] args) {
File f = new File("E:"+File.separator+"test.txt");
if(f.exists()) {
if(f.delete()) {
System.out.println("文件删除成功!");
}
}
else {
try {
f.createNewFile();
}catch(IOException e){
e.printStackTrace();
}
}
}
}
3、创建文件夹
package JAVAIO;
import java.io.File;
public class File_ceshi {
public static void main(String[] args) {
File f = new File("E:"+File.separator+"A");
if(f.mkdir()) {
System.out.println("目录创建成功!");
}
}
}
看码思考:
package JAVAIO;
import java.io.File;
public class File_ceshi {
public static void main(String[] args) {
File f = new File("E:"+File.separator+"A"+File.separator+"B"+File.separator+"C");
if(f.mkdir()) {
System.out.println("目录创建成功!");
}
}
}
现在已经有了A目录了,然后我想在A目录下新建一个B目录,然后在B目录下新建一个C目录。
但是执行不成功。
A目录下的 B、C目录没有创建成功!
这时,需要mkdirs
:
mkdir
和mkdirs
的区别:
- mkdir:只能给创建单目录
- mkdirs:能递归创建个目录,包括父级目录不存在的目录
4、列出指定目录的全部文件
案例一:
package JAVAIO;
import java.io.File;
public class File_ceshi {
public static void main(String[] args) {
File f = new File("E:"+File.separator);
String[] files=f.list();
for(int i=0;i<files.length;i++) {
System.out.println(files[i]);
}
}
}
案例二:
package JAVAIO;
import java.io.File;
public class File_ceshi {
public static void main(String[] args) {
File f = new File("E:"+File.separator);
File[] files=f.listFiles();
for(int i=0;i<files.length;i++) {
System.out.println(files[i]);
}
}
}
list()和listFiles()的区别
:
- list():列出全部名称,返回一个字符串数组(不带路径)。
- listFiles():列出完整的路径+文件名称,返回一个file对象数组(每个元素都是file对象数组)。
5、判断给定的路径是否是目录
package JAVAIO;
import java.io.File;
public class File_ceshi {
public static void main(String[] args) {
File f = new File("E:"+File.separator);
if(f.isDirectory()) {
System.out.println("该路径是一个目录");
}
else {
System.out.println("该路径不是目录");
}
}
}
二、字节流与字符流
字节流:操作的是byte数据类型,以byte数组为为准,主要类是OutputStream和InputStream,但这两个类是抽象类,如果要使用必须用其对应的子类:FileOutputSream和FileInputStream类。
1、字节输出流:OutputStream
常用方法:
案例一:
package lianxi;
import java.io.*;
public class OutputStram {
public static void main(String[] args) {
File file=new File("e:"+File.separator+"a"+File.separator+"1.txt");
String str="My Name is Wangchuang,I from 山东省菏泽市曹县邵庄镇程庄寨村";
byte[] b = str.getBytes();
OutputStream out=null;
try {
//实例化OutputStream
out = new FileOutputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
//写入
out.write(b);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2、字节输入流:InputStream
常用方法:
package lianxi;
import java.io.*;
public class InputStream_ceshi {
public static void main(String[] args) {
InputStream in = null;
// int len=0;
File file = new File("e:"+File.separator+"a"+File.separator+"1.txt");
byte[] b = new byte[(int)file.length()];
try {
in = new FileInputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
in.read(b);
System.out.println(new String(b));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//将字节数组转为字符串输出
// System.out.println(new String(b,0,len));
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
字符流:输入和输出时操作的是字符,而不再是字节,写入的类是Writer和Reader,同样这两个类为抽象类,分别对应的子类时FileWriter和FileReader类。
1、字符输出流
案例一(write(String)将整个字符串写入):
package JAVAIO;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class File_ceshi {
public static void main(String[] args) {
File f = new File("E:"+File.separator+"a"+File.separator+"1.txt");
Writer xie=null;
String str="红军不怕远征难,万水千山只等闲!";
try {
xie = new FileWriter(f,true);
xie.write(str);
xie.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
案例二(write(char[])将整个字符数组一次性写入):
package JAVAIO;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class File_ceshi {
public static void main(String[] args) {
File f = new File("E:"+File.separator+"a"+File.separator+"1.txt");
Writer xie=null;
char[] ch= {'早','安','啊','我','的','公','主'};
try {
xie = new FileWriter(f,true);
xie.write(ch);
xie.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
温馨提示:
2、字符输入流(Reader)
package JAVAIO;
import java.io.*;
public class File_ceshi {
public static void main(String[] args) {
File f = new File("E:"+File.separator+"a"+File.separator+"1.txt");
Reader read=null;
int len=0;
char[] ch=new char[(int)f.length()];
try {
read=new FileReader(f);
}catch(IOException e) {
e.printStackTrace();
}
try {
len=read.read(ch);
}catch(IOException e) {
e.printStackTrace();
}
for(int i=0;i<ch.length;i++) {
System.out.println(ch[i]);
}
System.out.println(new String(ch,0,len));
}
}
三、打印流
打印流主要用来输出信息,主要包含字节打印流(PrintStream)和字符打印流(PrintWriter)。
1、PrintStream:是OutputStream的子类
常用方法:
package JAVAIO;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
public class PrintStreamDemo {
public static void main(String[] args) {
//父(OutputStream)-子(FileOutputSteam)-子(printStream)
File file = new File("e:"+File.separator+"a"+File.separator+"1.txt");
OutputStream out = null;
try {
out = new FileOutputStream(file,true);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
PrintStream ps = new PrintStream(out);
try {
ps.write("早安,我的公主".getBytes()); //将字节数组一次性写入文件,使用的是OutputStream中继承来的方法
ps.write("I Love You".getBytes(),0,6); //从下标为0 的第一个字符开始,到下标为6的字符结束。
ps.write("\r\n".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
ps.close();
}
}
2、PrintWriter
package JAVAIO;
import java.io.*;
public class File_ceshi {
public static void main(String[] args) throws IOException {
File file = new File("E:"+File.separator+"a"+File.separator+"1.txt");
char[] c=new char[(int)file.length()];
Reader in=new FileReader(file);
in.read(c);
String str=new String(c,0,c.length);
String str1="这头";
int m,x=0;
for(int i=0;i<c.length;i++) {
//如果等于-1就说明文件的内容没有指定的这个字符串,则跳出循环
m=str.indexOf(str1,i);
if(m==-1) {
break;
}else {
//在第一次出现的位置上加上指定字符的本身长度(目的就是避免重复增加出现的次数)
i=m+str1.length();
x++;
}
}
System.out.println(x);
in.close();
}
}