java 常用的文件操作以及I/O流
一、File类的使用
1、概述
java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关。
File能创建、删除、重命名文件和目录并获得文件大小、修改时间等,但File不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出。
想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。
File对象常常作为参数传递给流的构造器,指明读取或写入的“终点”。
三种创建方式:
import org.testng.annotations.Test; import java.io.File; import java.io.IOException; public class FileTest { public static void main(){ } //方式1 @Test public void create1() throws IOException { String filePath = "d:\\file1.txt"; File file = new File(filePath); try { file.createNewFile(); System.out.println("创建文件1成功"); }catch (IOException e){ e.printStackTrace(); } } //方式2 @Test public void create2(){ File parentFile = new File("D:\\"); String fileName = "file2.txt"; File file = new File(parentFile,fileName); try { file.createNewFile(); System.out.println("文件2 创建成功"); } catch (IOException e) { throw new RuntimeException(e); } } //方式3 @Test public void create3(){ String parentPath = "d:\\"; String filePath = "file3.txt"; File file = new File(parentPath,filePath); try { file.createNewFile(); System.out.println("文件3创建成功"); } catch (IOException e) { throw new RuntimeException(e); } } }
获取文件的相关信息常见方法:
import org.testng.annotations.Test; import javax.xml.transform.Source; import javax.xml.transform.sax.SAXSource; import java.io.File; import java.sql.SQLOutput; public class FileFormation { public static void main(String[] args){ } // 获取文件信息 @Test public void Info(){ //先创建文件对象 File file = new File("D:\\file1.txt"); //调用相应方法,得到相应信息 System.out.println("文件名称:"+file.getName()); System.out.println("文件绝对路径:"+file.getAbsoluteFile()); System.out.println("文件父目录:"+file.getParent()); System.out.println("文件大小(字节):"+file.length()); System.out.println("文件是否存在:"+file.exists()); System.out.println("是否是文件:"+file.isFile()); System.out.println("是否是目录:"+file.isDirectory()); } }
目录的操作:
import org.testng.annotations.Test; import java.io.File; public class FileDirectory { public static void main(String[] args){ } @Test //删除文件 public void FileDelete(){ String filePath = "D:\\file1.txt"; File file = new File(filePath); if(file.exists()) { if (file.delete()) { System.out.println(filePath + " 删除成功"); } else { System.out.println(filePath + " 删除失败"); }; }else{ System.out.println(filePath+ " 文件不存在"); } } //删除目录 @Test public void FileDeleteD(){ String filePath = "D:\\file1.txt"; File file = new File(filePath); if(file.exists()) { if (file.delete()) { System.out.println(filePath + "删除成功"); } else { System.out.println(filePath + "删除失败"); }; }else{ System.out.println(filePath+ "目录不存在"); } } //判断目录是否存在,不存在就创建 @Test public void fileDeleteD1(){ String dirPath = "D:\\test\\dir1.txt"; File file = new File(dirPath); if(file.exists()){ System.out.println(dirPath + "该目录已经存在"); }else{ if(file.mkdir()){ System.out.println("创建成功"); }else{ System.out.println("创建失败"); }; } } }
二、IO流原理及流的分类
1、原理
I/O是Input/Output的缩写,I/O技术用于处理设备之间的数据传输,如读写文件、网络通讯等。
Java程序中,对于数据的输入/输出操作以“流”的方式进行。
java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。
输入:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。
输出:将程序(内存)数据输出到磁盘、光盘等存储设备中。
2、流的分类
按操作数据单位不同分为:字节流(8bit)、字符流(16bit)
按数据流的流向不同分为:输入流、输出流
按流的角色的不同分为:节点流、处理流
Java的IO流共涉及40多个类,实际上非常规则,都是从如下4个抽象基类派生的。
由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。
3、 具体的实现方法
InputStream的实现方法:
import org.testng.annotations.Test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class fileInputStream { public static void main(String[] args){ } @Test public void file1(){ String filePath="D:\\testfile.txt"; int readData; FileInputStream fileInputStream = null; try { //创建FileInputStream对象,用于读取文件 fileInputStream = new FileInputStream(filePath); while ((readData = fileInputStream.read())!=-1){ System.out.println((char)readData); }; } catch (IOException e) { e.printStackTrace(); }finally { //关闭文件流 try { fileInputStream.close(); }catch (IOException e){ throw new RuntimeException(e); } } } @Test public void fileIn2(){ String filePath = "D:\\testfile.txt"; int readData; int readLength = 0; //字节数组 byte[] buf = new byte[8]; FileInputStream fileInputStream = null; try { //创建fileInputStream对象,用于读取文件 fileInputStream =new FileInputStream(filePath); while ((readLength=fileInputStream.read(buf))!=-1){ System.out.println(new String(buf,0,readLength)); }; } catch (IOException e) { e.printStackTrace(); }finally { //关闭文件流 try { fileInputStream.close(); }catch (IOException e ){ throw new RuntimeException(e); } } } @Test public void fileIn3(){ String filePath = "D:\\testfile.txt"; int readData; int readLength = 0; //字节数组 byte[] buf = new byte[8]; FileInputStream fileInputStream = null; try { //创建fileInputStream对象,用于读取文件 fileInputStream =new FileInputStream(filePath); while ((readLength=fileInputStream.read(buf))!=-1){ System.out.println(new String(buf,0,readLength)); }; } catch (IOException e) { e.printStackTrace(); }finally { //关闭文件流 try { fileInputStream.close(); }catch (IOException e ){ throw new RuntimeException(e); } } } }
OutputStream的实现方法:
import org.testng.annotations.Test; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class outputStream { public static void main(String[] args){ } //使用fileOutStream将数据写到文件中 //如果不存在,则创建文件 @Test public void writeFile(){ String filePath = "d:\\fileout.txt"; //创建对象 FileOutputStream fileOutputStream = null; try { fileOutputStream = new FileOutputStream(filePath); // 1.写入一个字节 // fileOutputStream.write("H"); // 2.写入一个字符串 // String str = "hello socket"; // str.getBytes();将字符串转换成字节数组 // fileOutputStream.write(str.getBytes()); // 3.写入字符串 String str = "hello zhangsan"; fileOutputStream.write(str.getBytes(),0,str.length()); } catch (IOException e) { e.printStackTrace(); }finally { try { fileOutputStream.close(); }catch (IOException e){ throw new RuntimeException(e); } } } }
文件的复制方法:
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; public class copyPic { public static void main(String[] args) throws Exception{ //创建file对象 File f = new File("d:\\test.jpg"); //判断文件是否存在 if(f.exists()){ System.out.println("test.jpg文件存在,可以复制"); }else{ f.createNewFile(); System.out.println("test.jpg文件不存在,创建成功,可以复制"); } //创建FileInputStream对象 FileInputStream inp = new FileInputStream(f); //创建 //判断demo目录是否存在 File f1 = new File("d:\\demo"); if(f1.isDirectory()){ FileOutputStream out = new FileOutputStream("e:\\demo\\"+f.getName()); byte bytes[] = new byte[1024]; int temp = 0;; //边读边写 while ((temp=inp.read(bytes))!=-1){//读 out.write(bytes,0,temp);//写 } //结束 inp.close(); out.close(); System.out.println("文件拷贝成功!"); }else { //创建demo目录 f1.mkdir(); System.out.println("demo 目录不存在, 已经创建成功,继续复制"); FileOutputStream out = new FileOutputStream("d:\\demo\\"+f.getName()); byte bytes[]=new byte[1024]; int temp = 0;; //边读边写 while ((temp=inp.read(bytes))!=-1){//读 out.write(bytes,0,temp);//写 } //结束 inp.close(); out.close(); System.out.println("文件拷贝成功!"); } } }