一、操作文件的类——File
1、创建新文件
import java.io.File; import java.io.IOException; public class FileDemo1 { public static void main(String[] args) { File file = new File("D:\test.txt"); try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } }
2、删除文件
import java.io.File; import java.io.IOException; public class FileDemo1 { public static void main(String[] args) throws IOException { File file = new File("D:\test.txt"); try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } if (file.exists()){ file.delete(); }else { file.createNewFile(); } } }
3、File中的separator,表示分隔符。
import java.io.File; import java.io.IOException; public class FileDemo1 { public static void main(String[] args) throws IOException { File file = new File("d:"+File.separator+"test.txt"); file.createNewFile(); } }
4、新建文件夹,在文件夹下新建文件。
import java.io.File; import java.io.IOException; public class FileDemo1 { public static void main(String[] args) throws IOException { File file = new File("d:"+File.separator+"demo"+File.separator+"test.txt"); if (!file.getParentFile().exists()){ file.getParentFile().mkdir(); } if (file.exists()){ file.delete(); }else { System.out.println(file.createNewFile()); } } }
5、列出指定目录的全部文件
import java.io.File; import java.io.IOException; public class FileDemo1 { public static void main(String[] args) throws IOException { File file = new File("d:"+File.separator); String [] str = file.list(); for (String i:str){ System.out.println(i); } } }
6、模拟资源管理器列出目录中的全部内容
public class FileDemo1 { public static void main(String[] args) throws IOException { File file = new File("d:"+File.separator); File [] result = file.listFiles(); BigDecimal b1 = new BigDecimal((double) file.length()/1024/1024); for (int i = 0;i<result.length;i++){ System.out.println(result[i].getName()+" "+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(file.lastModified()))+" "+ (result[i].isDirectory()?"文件夹":"文件")+" "+ (result[i].isFile()?b1.divide(b1,2,BigDecimal.ROUND_HALF_UP):"")); } } }
二、字节流与字符流基本操作
1、字节输出流(OutputStream)
文件内容的输出(采用字符数组):
import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; public class OutputStreamDemo1 { public static void main(String[] args) throws Exception { //1、定义输出文件的路径 File file = new File("d:"+File.separator+"demo"+File.separator+"test.txt"); if (!(file.getParentFile().exists())){ //文件目录不存在 file.getParentFile().mkdir(); //创建目录 } //2、使用Outputstream与其子类进行对象的实例化,此时目录存在,文件不存在。 OutputStream outputStream = new FileOutputStream(file); //3、进行文件内容的输出 String str = "hello world"; outputStream.write(str.getBytes()); //将字符串变为字符数组 //4、资源操作后一定要进行关闭 outputStream.close(); } }
采用单个字节的输出:
public class OutputStreamDemo1 { public static void main(String[] args) throws Exception { //1、定义输出文件的路径 File file = new File("d:"+File.separator+"demo"+File.separator+"test.txt"); if (!(file.getParentFile().exists())){ //文件目录不存在 file.getParentFile().mkdir(); //创建目录 } //2、使用Outputstream与其子类进行对象的实例化,此时目录存在,文件不存在。 OutputStream outputStream = new FileOutputStream(file); //3、进行文件内容的输出 String str = "welp"; byte [] bytes = str.getBytes(); for (byte x:bytes){ outputStream.write(x); } //4、资源操作后一定要进行关闭 outputStream.close(); } }
输出部分字节数组:
import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; public class OutputStreamDemo1 { public static void main(String[] args) throws Exception { //1、定义输出文件的路径 File file = new File("d:"+File.separator+"demo"+File.separator+"test.txt"); if (!(file.getParentFile().exists())){ //文件目录不存在 file.getParentFile().mkdir(); //创建目录 } //2、使用Outputstream与其子类进行对象的实例化,此时目录存在,文件不存在。 OutputStream outputStream = new FileOutputStream(file); //3、进行文件内容的输出 String str = "你吃饭了吗"; byte [] bytes = str.getBytes(); outputStream.write(bytes,0,bytes.length); //4、资源操作后一定要进行关闭 outputStream.close(); } }
追加新内容:
public class OutputStreamDemo1 { public static void main(String[] args) throws Exception { //1、定义输出文件的路径 File file = new File("d:"+File.separator+"demo"+File.separator+"test.txt"); if (!(file.getParentFile().exists())){ //文件目录不存在 file.getParentFile().mkdir(); //创建目录 } //2、使用Outputstream与其子类进行对象的实例化,此时目录存在,文件不存在。 OutputStream outputStream = new FileOutputStream(file,true); //3、进行文件内容的输出 String str = "你吃饭了吗 "; byte [] bytes = str.getBytes(); outputStream.write(bytes,3,9); //4、资源操作后一定要进行关闭 outputStream.close(); } }
2、字节输入流(InputStream)
从文件中读取内容:
import java.io.File; import java.io.FileInputStream; import java.io.InputStream; public class InputStreamDemo1 { public static void main(String[] args)throws Exception { //1、定义要输入文件的路径 File file = new File("d:"+File.separator+"demo"+File.separator+"test.txt"); //需要判断文件是否存在后,才可以进行读取 if (file.exists()){ //2、使用InputStream读取 InputStream inputStream = new FileInputStream(file); //3、进行数据读取 byte [] bytes = new byte[1024]; int len = inputStream.read(bytes); //4、关闭输入流 inputStream.close(); System.out.println("["+new String(bytes,0,len)+"]"); } } }
单个字节数据取出:(重点)
import java.io.File; import java.io.FileInputStream; import java.io.InputStream; public class InputStreamDemo1 { public static void main(String[] args)throws Exception { //1、定义要输入文件的路径 File file = new File("d:"+File.separator+"demo"+File.separator+"test.txt"); //需要判断文件是否存在后,才可以进行读取 if (file.exists()){ //2、使用InputStream读取 InputStream inputStream = new FileInputStream(file); //3、进行数据读取 byte [] bytes = new byte[1024]; int foot = 0; int temp = 0; while ((temp = inputStream.read())!=-1){ bytes[foot++] = (byte) temp; } //4、关闭输入流 inputStream.close(); System.out.println("["+new String(bytes,0,foot)+"]"); } } }
3、字符输出流(Writer)
import java.io.File; import java.io.FileWriter; import java.io.Writer; public class WriterDemo1 { public static void main(String[] args) throws Exception { //定义要输入文件的路径 File file = new File("d:"+File.separator+"demo"+File.separator+"test.txt"); if (!file.getParentFile().exists()){ file.mkdir(); } //通过子类实例化父类对象 Writer writer = new FileWriter(file); //进行写操作 String str = "hello world"; writer.write(str); //关闭输出流 writer.close(); } }
4、字符输入流(Reader)
import java.io.File; import java.io.FileReader; import java.io.Reader; public class ReaderDemo1 { public static void main(String[] args) throws Exception { File file = new File("d:"+File.separator+"demo"+File.separator+"test.txt"); Reader reader = new FileReader(file); int foot = 0; int temp = 0; char [] chars = new char[1024]; while ((temp=reader.read())!=-1){ chars[foot++]= (char) temp; } reader.close(); System.out.println("["+new String(chars,0,foot)+"]"); } }
5、字节流和字符流的区别?
字节流直接与终端进行数据交互,字符流需要将数据先进入缓冲区。
字节流不关闭输出流,缓冲区的数据将不会被强制清空,除非使用flush。
import java.io.File; import java.io.FileWriter; import java.io.Writer; public class WriterDemo1 { public static void main(String[] args) throws Exception { //定义要输入文件的路径 File file = new File("d:"+File.separator+"demo"+File.separator+"test.txt"); if (!file.getParentFile().exists()){ file.mkdir(); } //通过子类实例化父类对象 Writer writer = new FileWriter(file); //进行写操作 String str = "hello world"; writer.write(str); writer.flush(); } }
6、转换流OuputStreamWriter类 与 InputStreamReader类
import java.io.*; public class OutputStreamWriterDemo1 { public static void main(String[] args) throws Exception { File file = new File("d:"+File.separator+"demo"+File.separator+"test.txt"); if (!file.getParentFile().exists()){ file.mkdir(); } OutputStream output = new FileOutputStream(file,true); //将OutputStream对象传递给OutputStreamWriter类的构造方法,而后向上转型为Writer OutputStreamWriter out = new OutputStreamWriter(output); Writer writer = (Writer)out; out.write("Hello world!!!"); writer.flush(); writer.close(); } }
7、文件复制
public class CopyDemo1 { public static void main(String[] args) throws Exception{ if (args.length!=2){ System.out.println("输入的参数不正确"); System.out.println("例如:java Copy 源文件路径 目标文件路径"); System.exit(1); } File file = new File(args[0]); File file1 = new File(args[1]); if (!file.exists()){ System.out.println("源文件不存在"); System.exit(1); } if (!file1.getParentFile().exists()){ file1.getParentFile().mkdir(); } InputStream input = null; OutputStream out = null; input = new FileInputStream(file); out = new FileOutputStream(file1); if (input!=null&&out!=null){ int temp = 0; while ((temp=input.read())!=-1){ out.write(temp); } System.out.println("复制完成"); } input.close(); out.close(); } }
先运行一次程序,可以初始化参数。
拷贝的优化:
int temp = 0; //保存每次读取的个数 byte [] data = new byte[1024]; while ((temp=input.read(data))!=-1){ out.write(data,0,temp); }