Java io文件操作(按字符、字节、行、随机读取,追加,文件操作)

什么是流:

流是一个抽象的概念。当Java程序需要从数据源读取数据时,会开启一个到数据源的流。数据源可以是文件,内存或者网络等。同样,当程序需要输出数据到目的地时也一样会开启一个流,数据目的地也可以是文件、内存或者网络等。流的创建是为了更方便地处理数据的输入输出。

流分为字节流和字符流。字节流也称为原始数据,需要用户读入后进行相应的编码转换。而字符流的实现是基于自动转换的,读取数据时会把数据按照JVM的默认编码自动转换成字符。

字节流由InputStream和OutputStream处理,而字符流由Reader和Writer处理。Reader和Writer是Java后加入的处理类,出于让数据的处理更方便的目的。

字节流处理类概述:

字节流的处理类有很多,他们都继承自InputStream或者OutputStream抽象类。

输入流:

先谈谈输入流,输入流中跟数据源直接接触的类有:FileInputStream和ByteArrayInputStream,他们分别实现了从文件或者内存中的字节数组读入数据到输入流。

其他的输入流处理类都是装饰类(Decorator模式),下面对他们进行一下简单介绍:

BufferedInputStream: 提供了缓冲功能。

DataInputStream: 允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。

PipedInputStream: 允许以管道的方式来处理流。当连接到一个PipedOutputStream后,它会读取后者输出到管道的数据。

PushbackInputStream: 允许放回已经读取的数据。

SequenceInputStream: 能对多个inputstream进行顺序处理。

输出流:

基本上每个输入流类都有一个相应的输出流类,提供相应的输出流处理。

同样,跟数据目的地直接接触的类有:FileOutputStream和ByteArrayOutputStream,前者实现了把数据流写入文件的功能,后者实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用toByteArray()toString() 获取数据。

下面对其它的装饰类做一下简单介绍:

BufferedOutputStream: 提供了缓冲功能的输出流,在写出完成之前要调用flush来保证数据的输出。

DataOutputStream: 数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。

PipedOutputStream: 允许以管道的方式来处理流。可以将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。通常,数据由某个线程写入PipedOutputStream 对象,并由其他线程从连接的 PipedInputStream 读取。

PrintStream: 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。我们经常用到的System.out或者System.err都是PrintStream。

字符流处理类概述:

输入流:

跟数据源直接接触的类:

CharArrayReader: 从内存中的字符数组中读入数据,以对数据进行流式读取。

StringReader:从内存中的字符串读入数据,以对数据进行流式读取。

FileReader:从文件中读入数据。注意这里读入数据时会根据JVM的默认编码对数据进行内转换,而不能指定使用的编码。所以当文件使用的编码不是JVM默认编码时,不要使用这种方式。要正确地转码,使用InputStreamReader。

装饰类:

BufferedReader:提供缓冲功能,可以读取行:readLine();

LineNumberReader: 提供读取行的控制:getLineNumber()等方法。

InputStreamReader: 字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。

输出流:

根数据目的相关的类:

CharArrayWriter:把内存中的字符数组写入输出流,输出流的缓冲区会自动增加大小。输出流的数据可以通过一些方法重新获取。

StringWriter: 一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。

FileWriter:把数据写入文件。

装饰类:

BufferedWriter:提供缓冲功能。

OutputStreamWriter:字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。

PrintWriter: 向文本输出流打印对象的格式化表示形式。

Writer或者OutputStream中的flush(): 刷新该流的缓冲,用于确保数据的输出。

close(): 关闭流并释放与之关联的所有系统资源

其实大家看到下面的图应该就很明白了。

看到这里相信大家对字节流、字符流有一个大致认识了,也对操作流的类有了一个清晰的认识,下面还是通过写代码的方式让大家理解如何操作的。

一、多种方式读文件内容。

1、按字节读取文件内容
2、按字符读取文件内容
3、按行读取文件内容
4、随机读取文件内容

  1. package test.file;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileReader;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.InputStreamReader;
  9. import java.io.RandomAccessFile;
  10. import java.io.Reader;
  11. public class ReadFromFile {
  12. /**
  13. * 以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。
  14. * @param fileName 文件的名
  15. */
  16. public static void readFileByBytes(String fileName){
  17. File file = new File(fileName);
  18. InputStream in = null;
  19. try {
  20. System.out.println("以字节为单位读取文件内容,一次读一个字节:");
  21. // 一次读一个字节
  22. in = new FileInputStream(file);
  23. int tempbyte;
  24. while((tempbyte=in.read()) != -1){
  25. System.out.write(tempbyte);
  26. }
  27. in.close();
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. return;
  31. }
  32. try {
  33. System.out.println("以字节为单位读取文件内容,一次读多个字节:");
  34. //一次读多个字节
  35. byte[] tempbytes = new byte[100];
  36. int byteread = 0;
  37. in = new FileInputStream(fileName);
  38. ReadFromFile.showAvailableBytes(in);
  39. //读入多个字节到字节数组中,byteread为一次读入的字节数
  40. while ((byteread = in.read(tempbytes)) != -1){
  41. System.out.write(tempbytes, 0, byteread);
  42. }
  43. } catch (Exception e1) {
  44. e1.printStackTrace();
  45. } finally {
  46. if (in != null){
  47. try {
  48. in.close();
  49. } catch (IOException e1) {
  50. }
  51. }
  52. }
  53. }
  54. /**
  55. * 以字符为单位读取文件,常用于读文本,数字等类型的文件
  56. * @param fileName 文件名
  57. */
  58. public static void readFileByChars(String fileName){
  59. File file = new File(fileName);
  60. Reader reader = null;
  61. try {
  62. System.out.println("以字符为单位读取文件内容,一次读一个字节:");
  63. // 一次读一个字符
  64. reader = new InputStreamReader(new FileInputStream(file));
  65. int tempchar;
  66. while ((tempchar = reader.read()) != -1){
  67. //对于windows下,/r/n这两个字符在一起时,表示一个换行。
  68. //但如果这两个字符分开显示时,会换两次行。
  69. //因此,屏蔽掉/r,或者屏蔽/n。否则,将会多出很多空行。
  70. if (((char)tempchar) != '\r'){
  71. System.out.print((char)tempchar);
  72. }
  73. }
  74. reader.close();
  75. } catch (Exception e) {
  76. e.printStackTrace();
  77. }
  78. try {
  79. System.out.println("以字符为单位读取文件内容,一次读多个字节:");
  80. //一次读多个字符
  81. char[] tempchars = new char[30];
  82. int charread = 0;
  83. reader = new InputStreamReader(new FileInputStream(fileName));
  84. //读入多个字符到字符数组中,charread为一次读取字符数
  85. while ((charread = reader.read(tempchars))!=-1){
  86. //同样屏蔽掉/r不显示
  87. if ((charread == tempchars.length)&&(tempchars[tempchars.length-1] != '\r')){
  88. System.out.print(tempchars);
  89. }else{
  90. for (int i=0; i<charread; i++){
  91. if(tempchars[i] == '\r'){
  92. continue;
  93. }else{
  94. System.out.print(tempchars[i]);
  95. }
  96. }
  97. }
  98. }
  99. } catch (Exception e1) {
  100. e1.printStackTrace();
  101. }finally {
  102. if (reader != null){
  103. try {
  104. reader.close();
  105. } catch (IOException e1) {
  106. }
  107. }
  108. }
  109. }
  110. /**
  111. * 以行为单位读取文件,常用于读面向行的格式化文件
  112. * @param fileName 文件名
  113. */
  114. public static void readFileByLines(String fileName){
  115. File file = new File(fileName);
  116. BufferedReader reader = null;
  117. try {
  118. System.out.println("以行为单位读取文件内容,一次读一整行:");
  119. reader = new BufferedReader(new FileReader(file));
  120. String tempString = null;
  121. int line = 1;
  122. //一次读入一行,直到读入null为文件结束
  123. while ((tempString = reader.readLine()) != null){
  124. //显示行号
  125. System.out.println("line " + line + ": " + tempString);
  126. line++;
  127. }
  128. reader.close();
  129. } catch (IOException e) {
  130. e.printStackTrace();
  131. } finally {
  132. if (reader != null){
  133. try {
  134. reader.close();
  135. } catch (IOException e1) {
  136. }
  137. }
  138. }
  139. }
  140. /**
  141. * 随机读取文件内容
  142. * @param fileName 文件名
  143. */
  144. public static void readFileByRandomAccess(String fileName){
  145. RandomAccessFile randomFile = null;
  146. try {
  147. System.out.println("随机读取一段文件内容:");
  148. // 打开一个随机访问文件流,按只读方式
  149. randomFile = new RandomAccessFile(fileName, "r");
  150. // 文件长度,字节数
  151. long fileLength = randomFile.length();
  152. // 读文件的起始位置
  153. int beginIndex = (fileLength > 4) ? 4 : 0;
  154. //将读文件的开始位置移到beginIndex位置。
  155. randomFile.seek(beginIndex);
  156. byte[] bytes = new byte[10];
  157. int byteread = 0;
  158. //一次读10个字节,如果文件内容不足10个字节,则读剩下的字节。
  159. //将一次读取的字节数赋给byteread
  160. while ((byteread = randomFile.read(bytes)) != -1){
  161. System.out.write(bytes, 0, byteread);
  162. }
  163. } catch (IOException e){
  164. e.printStackTrace();
  165. } finally {
  166. if (randomFile != null){
  167. try {
  168. randomFile.close();
  169. } catch (IOException e1) {
  170. }
  171. }
  172. }
  173. }
  174. /**
  175. * 显示输入流中还剩的字节数
  176. * @param in
  177. */
  178. private static void showAvailableBytes(InputStream in){
  179. try {
  180. System.out.println("当前字节输入流中的字节数为:" + in.available());
  181. } catch (IOException e) {
  182. e.printStackTrace();
  183. }
  184. }
  185. public static void main(String[] args) {
  186. String fileName = "C:/temp/newTemp.txt";
  187. ReadFromFile.readFileByBytes(fileName);
  188. ReadFromFile.readFileByChars(fileName);
  189. ReadFromFile.readFileByLines(fileName);
  190. ReadFromFile.readFileByRandomAccess(fileName);
  191. }
  192. }
package test.file;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.io.Reader;

public class ReadFromFile {

	/**  

	   * 以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。  

	   * @param fileName 文件的名  

	   */ 

	public static void readFileByBytes(String fileName){  

	   File file = new File(fileName);  

	   InputStream in = null;  

	   try {  

	    System.out.println("以字节为单位读取文件内容,一次读一个字节:");  

	    // 一次读一个字节  

	    in = new FileInputStream(file);  

	    int tempbyte;  

	    while((tempbyte=in.read()) != -1){  

	     System.out.write(tempbyte);  

	    }  

	    in.close();  

	   } catch (IOException e) {  

	    e.printStackTrace();  

	    return;  

	   }  

	   try {  

	    System.out.println("以字节为单位读取文件内容,一次读多个字节:");  

	    //一次读多个字节  

	    byte[] tempbytes = new byte[100];  

	    int byteread = 0;  

	    in = new FileInputStream(fileName);  

	    ReadFromFile.showAvailableBytes(in);  

	    //读入多个字节到字节数组中,byteread为一次读入的字节数  

	    while ((byteread = in.read(tempbytes)) != -1){  

	     System.out.write(tempbytes, 0, byteread);  

	    }  

	   } catch (Exception e1) {  

	    e1.printStackTrace();  

	   } finally {  

	    if (in != null){  

	     try {  

	      in.close();  

	     } catch (IOException e1) {  

	     }  

	    }  

	   }  

	}  

	/**  

	   * 以字符为单位读取文件,常用于读文本,数字等类型的文件  

	   * @param fileName 文件名  

	   */ 

	public static void readFileByChars(String fileName){  

	   File file = new File(fileName);  

	   Reader reader = null;  

	   try {  

	    System.out.println("以字符为单位读取文件内容,一次读一个字节:");  

	    // 一次读一个字符  

	    reader = new InputStreamReader(new FileInputStream(file));  

	    int tempchar;  

	    while ((tempchar = reader.read()) != -1){  

	     //对于windows下,/r/n这两个字符在一起时,表示一个换行。  

	     //但如果这两个字符分开显示时,会换两次行。  

	     //因此,屏蔽掉/r,或者屏蔽/n。否则,将会多出很多空行。  

	     if (((char)tempchar) != '\r'){  

	      System.out.print((char)tempchar);  

	     }  

	    }  

	    reader.close();  

	   } catch (Exception e) {  

	    e.printStackTrace();  

	   }  

	   try {  

	    System.out.println("以字符为单位读取文件内容,一次读多个字节:");  

	    //一次读多个字符  

	    char[] tempchars = new char[30];  

	    int charread = 0;  

	    reader = new InputStreamReader(new FileInputStream(fileName));  

	    //读入多个字符到字符数组中,charread为一次读取字符数  

	    while ((charread = reader.read(tempchars))!=-1){  

	     //同样屏蔽掉/r不显示  

	     if ((charread == tempchars.length)&&(tempchars[tempchars.length-1] != '\r')){  

	      System.out.print(tempchars);  

	     }else{  

	      for (int i=0; i<charread; i++){  

	       if(tempchars[i] == '\r'){  

	        continue;  

	       }else{  

	        System.out.print(tempchars[i]);  

	       }  

	      }  

	     }  

	    }  

	      

	   } catch (Exception e1) {  

	    e1.printStackTrace();  

	   }finally {  

	    if (reader != null){  

	     try {  

	      reader.close();  

	     } catch (IOException e1) {  

	     }  

	    }  

	   }  

	}  

	/**  

	   * 以行为单位读取文件,常用于读面向行的格式化文件  

	   * @param fileName 文件名  

	   */ 

	public static void readFileByLines(String fileName){  

	   File file = new File(fileName);  

	   BufferedReader reader = null;  

	   try {  

	    System.out.println("以行为单位读取文件内容,一次读一整行:");  

	    reader = new BufferedReader(new FileReader(file));  

	    String tempString = null;  

	    int line = 1;  

	    //一次读入一行,直到读入null为文件结束  

	    while ((tempString = reader.readLine()) != null){  

	     //显示行号  

	     System.out.println("line " + line + ": " + tempString);  

	     line++;  

	    }  

	    reader.close();  

	   } catch (IOException e) {  

	    e.printStackTrace();  

	   } finally {  

	    if (reader != null){  

	     try {  

	      reader.close();  

	     } catch (IOException e1) {  

	     }  

	    }  

	   }  

	}  

	/**  

	   * 随机读取文件内容  

	   * @param fileName 文件名  

	   */ 

	public static void readFileByRandomAccess(String fileName){  

	   RandomAccessFile randomFile = null;  

	   try {  

	    System.out.println("随机读取一段文件内容:");  

	    // 打开一个随机访问文件流,按只读方式  

	    randomFile = new RandomAccessFile(fileName, "r");  

	    // 文件长度,字节数  

	    long fileLength = randomFile.length();  

	    // 读文件的起始位置  

	    int beginIndex = (fileLength > 4) ? 4 : 0;  

	    //将读文件的开始位置移到beginIndex位置。  

	    randomFile.seek(beginIndex);  

	    byte[] bytes = new byte[10];  

	    int byteread = 0;  

	    //一次读10个字节,如果文件内容不足10个字节,则读剩下的字节。  

	    //将一次读取的字节数赋给byteread  

	    while ((byteread = randomFile.read(bytes)) != -1){  

	     System.out.write(bytes, 0, byteread);  

	    }  

	   } catch (IOException e){  

	    e.printStackTrace();  

	   } finally {  

	    if (randomFile != null){  

	     try {  

	      randomFile.close();  

	     } catch (IOException e1) {  

	     }  

	    }  

	   }  

	}  

	/**  

	   * 显示输入流中还剩的字节数  

	   * @param in  

	   */ 

	private static void showAvailableBytes(InputStream in){  

	   try {  

	    System.out.println("当前字节输入流中的字节数为:" + in.available());  

	   } catch (IOException e) {  

	    e.printStackTrace();  

	   }  

	}  

	   

	public static void main(String[] args) {  

	   String fileName = "C:/temp/newTemp.txt";  

	   ReadFromFile.readFileByBytes(fileName);  

	   ReadFromFile.readFileByChars(fileName);  

	   ReadFromFile.readFileByLines(fileName);  

	   ReadFromFile.readFileByRandomAccess(fileName);  

	}  

}


二、将内容追加到文件尾部

  1. package test.file;
  2. import java.io.FileWriter;
  3. import java.io.IOException;
  4. import java.io.RandomAccessFile;
  5. public class AppendToFile {
  6. /**
  7. * A方法追加文件:使用RandomAccessFile
  8. * @param fileName 文件名
  9. * @param content 追加的内容
  10. */
  11. public static void appendMethodA(String fileName, String content){
  12. try {
  13. // 打开一个随机访问文件流,按读写方式
  14. RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
  15. // 文件长度,字节数
  16. long fileLength = randomFile.length();
  17. //将写文件指针移到文件尾。
  18. randomFile.seek(fileLength);
  19. randomFile.writeBytes(content);
  20. randomFile.close();
  21. } catch (IOException e){
  22. e.printStackTrace();
  23. }
  24. }
  25. /**
  26. * B方法追加文件:使用FileWriter
  27. * @param fileName
  28. * @param content
  29. */
  30. public static void appendMethodB(String fileName, String content){
  31. try {
  32. //打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
  33. FileWriter writer = new FileWriter(fileName, true);
  34. writer.write(content);
  35. writer.close();
  36. } catch (IOException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. public static void main(String[] args) {
  41. String fileName = "C:/temp/newTemp.txt";
  42. String content = "new append!";
  43. //按方法A追加文件
  44. AppendToFile.appendMethodA(fileName, content);
  45. AppendToFile.appendMethodA(fileName, "append end. /n");
  46. //显示文件内容
  47. ReadFromFile.readFileByLines(fileName);
  48. //按方法B追加文件
  49. AppendToFile.appendMethodB(fileName, content);
  50. AppendToFile.appendMethodB(fileName, "append end. /n");
  51. //显示文件内容
  52. ReadFromFile.readFileByLines(fileName);
  53. }
  54. }
package test.file;

import java.io.FileWriter;
import java.io.IOException;
import java.io.RandomAccessFile;

public class AppendToFile {

	/**  

	   * A方法追加文件:使用RandomAccessFile  

	   * @param fileName 文件名  

	   * @param content 追加的内容  

	   */ 

	public static void appendMethodA(String fileName, String content){  

	   try {  

	    // 打开一个随机访问文件流,按读写方式  

	    RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");  

	    // 文件长度,字节数  

	    long fileLength = randomFile.length();  

	    //将写文件指针移到文件尾。  

	    randomFile.seek(fileLength);  

	    randomFile.writeBytes(content);  

	    randomFile.close();  

	   } catch (IOException e){  

	    e.printStackTrace();  

	   }  

	}  

	/**  

	   * B方法追加文件:使用FileWriter  

	   * @param fileName  

	   * @param content  

	   */ 

	public static void appendMethodB(String fileName, String content){  

	   try {  

	    //打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件  

	    FileWriter writer = new FileWriter(fileName, true);  

	    writer.write(content);  

	    writer.close();  

	   } catch (IOException e) {  

	    e.printStackTrace();  

	   }  

	}  

	   

	public static void main(String[] args) {  

	   String fileName = "C:/temp/newTemp.txt";  

	   String content = "new append!";  

	   //按方法A追加文件  

	   AppendToFile.appendMethodA(fileName, content);  

	   AppendToFile.appendMethodA(fileName, "append end. /n");  

	   //显示文件内容  

	   ReadFromFile.readFileByLines(fileName);  

	   //按方法B追加文件  

	   AppendToFile.appendMethodB(fileName, content);  

	   AppendToFile.appendMethodB(fileName, "append end. /n");  

	   //显示文件内容  

	   ReadFromFile.readFileByLines(fileName);  

	}  
}


二、文件的各种操作类

  1. package test.file;
  2. import java.io.BufferedReader;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileOutputStream;
  6. import java.io.FileWriter;
  7. import java.io.InputStream;
  8. import java.io.InputStreamReader;
  9. import java.io.PrintWriter;
  10. public class FileOperate {
  11. public FileOperate(){
  12. }
  13. /**
  14. * 新建目录
  15. */
  16. public void newFolder(String folderPath)
  17. {
  18. try
  19. {
  20. String filePath = folderPath;
  21. filePath = filePath.toString();
  22. File myFilePath = new File(filePath);
  23. if(!myFilePath.exists())
  24. {
  25. myFilePath.mkdir();
  26. }
  27. System.out.println("新建目录操作 成功执行");
  28. }
  29. catch(Exception e)
  30. {
  31. System.out.println("新建目录操作出错");
  32. e.printStackTrace();
  33. }
  34. }
  35. /**
  36. * 新建文件
  37. */
  38. public void newFile(String filePathAndName, String fileContent)
  39. {
  40. try
  41. {
  42. String filePath = filePathAndName;
  43. filePath = filePath.toString();
  44. File myFilePath = new File(filePath);
  45. if (!myFilePath.exists())
  46. {
  47. myFilePath.createNewFile();
  48. }
  49. FileWriter resultFile = new FileWriter(myFilePath);
  50. PrintWriter myFile = new PrintWriter(resultFile);
  51. String strContent = fileContent;
  52. myFile.println(strContent);
  53. resultFile.close();
  54. System.out.println("新建文件操作 成功执行");
  55. }
  56. catch (Exception e)
  57. {
  58. System.out.println("新建目录操作出错");
  59. e.printStackTrace();
  60. }
  61. }
  62. /**
  63. * 删除文件
  64. */
  65. public void delFile(String filePathAndName)
  66. {
  67. try
  68. {
  69. String filePath = filePathAndName;
  70. filePath = filePath.toString();
  71. File myDelFile = new File(filePath);
  72. myDelFile.delete();
  73. System.out.println("删除文件操作 成功执行");
  74. }
  75. catch (Exception e)
  76. {
  77. System.out.println("删除文件操作出错");
  78. e.printStackTrace();
  79. }
  80. }
  81. /**
  82. * 删除文件夹
  83. */
  84. public void delFolder(String folderPath)
  85. {
  86. try
  87. {
  88. delAllFile(folderPath); //删除完里面所有内容
  89. String filePath = folderPath;
  90. filePath = filePath.toString();
  91. File myFilePath = new File(filePath);
  92. if(myFilePath.delete()) { //删除空文件夹
  93. System.out.println("删除文件夹" + folderPath + "操作 成功执行");
  94. } else {
  95. System.out.println("删除文件夹" + folderPath + "操作 执行失败");
  96. }
  97. }
  98. catch (Exception e)
  99. {
  100. System.out.println("删除文件夹操作出错");
  101. e.printStackTrace();
  102. }
  103. }
  104. /**
  105. * 删除文件夹里面的所有文件
  106. * @param path String 文件夹路径 如 c:/fqf
  107. */
  108. public void delAllFile(String path)
  109. {
  110. File file = new File(path);
  111. if(!file.exists())
  112. {
  113. return;
  114. }
  115. if(!file.isDirectory())
  116. {
  117. return;
  118. }
  119. String[] tempList = file.list();
  120. File temp = null;
  121. for (int i = 0; i < tempList.length; i++)
  122. {
  123. if(path.endsWith(File.separator))
  124. {
  125. temp = new File(path + tempList[i]);
  126. }
  127. else
  128. {
  129. temp = new File(path + File.separator + tempList[i]);
  130. }
  131. if (temp.isFile())
  132. {
  133. temp.delete();
  134. }
  135. if (temp.isDirectory())
  136. {
  137. //delAllFile(path+"/"+ tempList[i]);//先删除文件夹里面的文件
  138. delFolder(path+ File.separatorChar + tempList[i]);//再删除空文件夹
  139. }
  140. }
  141. System.out.println("删除文件操作 成功执行");
  142. }
  143. /**
  144. * 复制单个文件
  145. * @param oldPath String 原文件路径 如:c:/fqf.txt
  146. * @param newPath String 复制后路径 如:f:/fqf.txt
  147. */
  148. public void copyFile(String oldPath, String newPath)
  149. {
  150. try
  151. {
  152. int bytesum = 0;
  153. int byteread = 0;
  154. File oldfile = new File(oldPath);
  155. if (oldfile.exists())
  156. {
  157. //文件存在时
  158. InputStream inStream = new FileInputStream(oldPath); //读入原文件
  159. FileOutputStream fs = new FileOutputStream(newPath);
  160. byte[] buffer = new byte[1444];
  161. while ( (byteread = inStream.read(buffer)) != -1)
  162. {
  163. bytesum += byteread; //字节数 文件大小
  164. System.out.println(bytesum);
  165. fs.write(buffer, 0, byteread);
  166. }
  167. inStream.close();
  168. }
  169. System.out.println("删除文件夹操作 成功执行");
  170. }
  171. catch (Exception e)
  172. {
  173. System.out.println("复制单个文件操作出错");
  174. e.printStackTrace();
  175. }
  176. }
  177. /**
  178. * 复制整个文件夹内容
  179. * @param oldPath String 原文件路径 如:c:/fqf
  180. * @param newPath String 复制后路径 如:f:/fqf/ff
  181. */
  182. public void copyFolder(String oldPath, String newPath)
  183. {
  184. try
  185. {
  186. (new File(newPath)).mkdirs(); //如果文件夹不存在 则建立新文件夹
  187. File a=new File(oldPath);
  188. String[] file=a.list();
  189. File temp=null;
  190. for (int i = 0; i < file.length; i++)
  191. {
  192. if(oldPath.endsWith(File.separator))
  193. {
  194. temp=new File(oldPath+file[i]);
  195. }
  196. else
  197. {
  198. temp=new File(oldPath+File.separator+file[i]);
  199. }
  200. if(temp.isFile())
  201. {
  202. FileInputStream input = new FileInputStream(temp);
  203. FileOutputStream output = new FileOutputStream(newPath + "/" +
  204. (temp.getName()).toString());
  205. byte[] b = new byte[1024 * 5];
  206. int len;
  207. while ( (len = input.read(b)) != -1)
  208. {
  209. output.write(b, 0, len);
  210. }
  211. output.flush();
  212. output.close();
  213. input.close();
  214. }
  215. if(temp.isDirectory())
  216. {
  217. //如果是子文件夹
  218. copyFolder(oldPath+"/"+file[i],newPath+"/"+file[i]);
  219. }
  220. }
  221. System.out.println("复制文件夹操作 成功执行");
  222. }
  223. catch (Exception e)
  224. {
  225. System.out.println("复制整个文件夹内容操作出错");
  226. e.printStackTrace();
  227. }
  228. }
  229. /**
  230. * 移动文件到指定目录
  231. * @param oldPath String 如:c:/fqf.txt
  232. * @param newPath String 如:d:/fqf.txt
  233. */
  234. public void moveFile(String oldPath, String newPath)
  235. {
  236. copyFile(oldPath, newPath);
  237. delFile(oldPath);
  238. }
  239. /**
  240. * 移动文件到指定目录
  241. * @param oldPath String 如:c:/fqf.txt
  242. * @param newPath String 如:d:/fqf.txt
  243. */
  244. public void moveFolder(String oldPath, String newPath)
  245. {
  246. copyFolder(oldPath, newPath);
  247. delFolder(oldPath);
  248. }
  249. public static void main(String args[])
  250. {
  251. String aa,bb;
  252. boolean exitnow=false;
  253. System.out.println("使用此功能请按[1] 功能一:新建目录");
  254. System.out.println("使用此功能请按[2] 功能二:新建文件");
  255. System.out.println("使用此功能请按[3] 功能三:删除文件");
  256. System.out.println("使用此功能请按[4] 功能四:删除文件夹");
  257. System.out.println("使用此功能请按[5] 功能五:删除文件夹里面的所有文件");
  258. System.out.println("使用此功能请按[6] 功能六:复制文件");
  259. System.out.println("使用此功能请按[7] 功能七:复制文件夹的所有内容");
  260. System.out.println("使用此功能请按[8] 功能八:移动文件到指定目录");
  261. System.out.println("使用此功能请按[9] 功能九:移动文件夹到指定目录");
  262. System.out.println("使用此功能请按[10] 退出程序");
  263. while(!exitnow)
  264. {
  265. FileOperate fo=new FileOperate();
  266. try
  267. {
  268. BufferedReader Bin=new BufferedReader(new InputStreamReader(System.in));
  269. String a=Bin.readLine();
  270. int b=Integer.parseInt(a);
  271. switch(b)
  272. {
  273. case 1:System.out.println("你选择了功能一 请输入目录名");
  274. aa=Bin.readLine();
  275. fo.newFolder(aa);
  276. break;
  277. case 2:System.out.println("你选择了功能二 请输入文件名");
  278. aa=Bin.readLine();
  279. System.out.println("请输入在"+aa+"中的内容");
  280. bb=Bin.readLine();
  281. fo.newFile(aa,bb);
  282. break;
  283. case 3:System.out.println("你选择了功能三 请输入文件名");
  284. aa=Bin.readLine();
  285. fo.delFile(aa);
  286. break;
  287. case 4:System.out.println("你选择了功能四 请输入文件名");
  288. aa=Bin.readLine();
  289. fo.delFolder(aa);
  290. break;
  291. case 5:System.out.println("你选择了功能五 请输入文件名");
  292. aa=Bin.readLine();
  293. fo.delAllFile(aa);
  294. break;
  295. case 6:System.out.println("你选择了功能六 请输入文件名");
  296. aa=Bin.readLine();
  297. System.out.println("请输入目标文件名");
  298. bb=Bin.readLine();
  299. fo.copyFile(aa,bb);
  300. break;
  301. case 7:System.out.println("你选择了功能七 请输入源文件名");
  302. aa=Bin.readLine();
  303. System.out.println("请输入目标文件名");
  304. bb=Bin.readLine();
  305. fo.copyFolder(aa,bb);
  306. break;
  307. case 8:System.out.println("你选择了功能八 请输入源文件名");
  308. aa=Bin.readLine();
  309. System.out.println("请输入目标文件名");
  310. bb=Bin.readLine();
  311. fo.moveFile(aa,bb);
  312. break;
  313. case 9:System.out.println("你选择了功能九 请输入源文件名");
  314. aa=Bin.readLine();
  315. System.out.println("请输入目标文件名");
  316. bb=Bin.readLine();
  317. fo.moveFolder(aa,bb);
  318. break;
  319. case 10:exitnow=true;
  320. System.out.println("程序结束,请退出");
  321. break;
  322. default:System.out.println("输入错误.请输入1-10之间的数");
  323. }
  324. System.out.println("请重新选择功能");
  325. }
  326. catch(Exception e)
  327. {
  328. System.out.println("输入错误字符或程序出错");
  329. }
  330. }
  331. }
  332. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值