在本文中,我将对在课堂上所讲的IO操作这部分知识进行回顾、总结。在java的基础知识中,I/O操作也是比较重要的,而在本文中主要有以下内容:File类、Java的IO流、字节流和字符流、把数据写入到指定文件的工具类的设计和实现、把当前类的源码写入到指定文件的工具类的设计和实现。
File类
1、文件不能访问文件内容本身,如果需要访问则需要使用I/O流
2、相对路径:指的是当前的工作路径
3、绝对路径:在磁盘上存储的物理路径,如C:/source.txt
4、常用方法:
(1)String getName():返回file对象所表示的文件名或路径名,如果是路径,则返回最后一级子路径名
例1:File file = new File("L:\\test.txt");
System.out.println("file.getName() = " + file.getName());
输出结果为:test.txt
注意:File file = new File(String)的路径参数的格式可以是Disk:\\FileName.*,或者Disk:/FileName.*,或者Disk://FileName.*,不能为Disk:\FileName.*。
(2)String getPath():返回File对象对应的路径名
如例1的file.getPath()结果为L:\test.txt
(3)String getAbsolutePath():返回File对象的绝对路径名(File对象如果是送入一个相对路径,通过这个可以获取绝对路径
(4)String getParent(): 返回File对象对应目录的父目录名
(4)String getParent(): 返回File对象对应目录的父目录名
如例1的file.getParent()结果为L:\
(5)boolean renameTo(File newName):重命名File对象
(5)boolean renameTo(File newName):重命名File对象
(6)boolean exists(): 判断File对象所对应的文件或者目录是否存在
(7)boolean canWrite(): 判断File对象对应的文件或者目录是否可写
(8)boolean canRead(): 判断File对象对应的文件或者目录是否可读
(9)boolean isFile(): 判断File对象所对应的是否是文件
(10)boolean isDirectory(): 判断File对象所对应的是否是目录
(11)boolean isAbsolute(): 判断File对象所对应的文件或者目录是否是绝对路径。该方法消除了不同平台的差异。在UNIX/LINUX等系统上,绝对路径是以“/”开头。windows平台上则以盘符开头
(7)boolean canWrite(): 判断File对象对应的文件或者目录是否可写
(8)boolean canRead(): 判断File对象对应的文件或者目录是否可读
(9)boolean isFile(): 判断File对象所对应的是否是文件
(10)boolean isDirectory(): 判断File对象所对应的是否是目录
(11)boolean isAbsolute(): 判断File对象所对应的文件或者目录是否是绝对路径。该方法消除了不同平台的差异。在UNIX/LINUX等系统上,绝对路径是以“/”开头。windows平台上则以盘符开头
如例1的file.getPath()结果为true
(12)long lastModified() 返回文件的最后修改时间,返回距离00:00:00 GMT, January 1, 1970的毫秒数
(13)long length() 返回文件内容的长度
(13)long length() 返回文件内容的长度
(14)boolean createNewFile() 创建新的文件
(15)boolean delete() 删除File对象所对应的文件
(16)void deleteOnExit() jvm退出的时候删除File对象所对应的文件和目录
(17)boolean mkdir() 创建目录
(18)String[] list() 列出File对象的所有子文件名和路径名,返回String数组
(19)File[] listFile() 列出File对象的所有子文件和路径,返回File数组
(15)boolean delete() 删除File对象所对应的文件
(16)void deleteOnExit() jvm退出的时候删除File对象所对应的文件和目录
(17)boolean mkdir() 创建目录
(18)String[] list() 列出File对象的所有子文件名和路径名,返回String数组
(19)File[] listFile() 列出File对象的所有子文件和路径,返回File数组
Java的I/O流
1、Java中把输入/输出抽象表述为“流”
2、流(Stream)是从起源(Source)到接收(Sink)的有序数据
3、输入流:只能从中读取数据:InputStream(字节流) 和 Reader(字符流) ,我的理解是:以“我”为中心,“我”来读,向“我”输入
4、输出流:只能向其写入数据:OutputStream(字节流) 和 Writer(字符流),我的理解是:以“别人”为中心,向“别人”写入
2、流(Stream)是从起源(Source)到接收(Sink)的有序数据
3、输入流:只能从中读取数据:InputStream(字节流) 和 Reader(字符流) ,我的理解是:以“我”为中心,“我”来读,向“我”输入
4、输出流:只能向其写入数据:OutputStream(字节流) 和 Writer(字符流),我的理解是:以“别人”为中心,向“别人”写入
字节流和字符流区别
(1)字节流:读取8位的字节
(2)字符流:读取16位的字符(2个字节)
(2)字符流:读取16位的字符(2个字节)
输入流:InputStream(字节流)
(1)实现类:FileInputStream
(2)常用方法:
int read() 从输入流中读取单个字节,返回所读取的字节数据
int read(byte[] b) 从输入流中最多读取b.length个字节的数据,并将其存储在字节数组b中,返回实际读取的字节数据
(2)常用方法:
int read() 从输入流中读取单个字节,返回所读取的字节数据
int read(byte[] b) 从输入流中最多读取b.length个字节的数据,并将其存储在字节数组b中,返回实际读取的字节数据
输入流:Reader(字符流)
(1)实现类:FileReader
(2)常用方法:
int read() 从输入流中读取单个字符,返回所读取的字符数据
int read(char[] cbuf) 从输入流中最多读取cbuf个字符的数据,并将其存储在字符数组cbuf中,返回实际读取的字符数据
(2)常用方法:
int read() 从输入流中读取单个字符,返回所读取的字符数据
int read(char[] cbuf) 从输入流中最多读取cbuf个字符的数据,并将其存储在字符数组cbuf中,返回实际读取的字符数据
输出流:OutputStream(字节流)
(1)void write(int c) 将指定的字节输出到输出流中
(2)void write(byte[] buf) 将字节数组的数据输出到输出流中
(2)void write(byte[] buf) 将字节数组的数据输出到输出流中
输出流:Writer(字符流)
(1)void write(char[] buf) 将指定字符数组的数据输出到输出流中
(2)void write(String str) 将str字符串里包含的字符输出到输出流中
(2)void write(String str) 将str字符串里包含的字符输出到输出流中
把数据写入到指定文件的工具类的设计和实现
package com.mashen.utils;
import com.mashen.utils.CopyCode;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
*
* @author Administrator
* @dateTime 2016/07/25
* @version 1.0
*/
public class WriteIntoFile {
private WriteIntoFile(){
}
public static void main(String[] args) {
//调用writePoem(Scanner)把数据写入指定文件
System.out.print("请输入:");
// "《静夜思》 床前明月光 疑是地上霜 举头望明月 低头思故乡 # l:w.txt"
Scanner scanner = new Scanner(System.in);
if (writePoem(scanner)) {
System.out.println("写入成功!");
}
//调用writePoem(String)把数据写入指定文件
// if(WriteIntoFile.writePoem("《静夜思》\r\n床前明月光\r\n疑是地上霜\r\n举头望明月\r\n低头思故乡 # l:w2.txt")){
// System.out.println("写入成功!");
// }
// 测试CopyCode工具类
// System.out.print("请输入目标文件(.txt):");
// Scanner scanner = new Scanner(System.in);
// String fileStr = scanner.next();
//
// try {
// if (new CopyCode().copyCodeIntoFile(new WriteIntoFile(), fileStr)) {
// System.out.println("操作成功!");
// }
// } catch (IOException e) {
// e.printStackTrace();
// }
}
/**
* 从List<String>类型的数据中,按照一定的规则获取要写入的数据和目标文件路径,规定格式为: xxx xxx # path
* @param strList
* @return boolean
*/
public static boolean writePoem(Scanner scanner){
List<String> strList = new ArrayList<String>();
int count = 0;
//要写入的数据
String inputStr = null;
//目标文件路径
String path = null;
while (true) {
inputStr = scanner.next();
//以"#"分隔数据和目标文件路径
if (inputStr.equals(new String("#"))) {
path = scanner.next();
break;
}
strList.add(inputStr);
count++;
}
String poemString = "";
//在写入的数据中,加入换行符
for (String string : strList) {
poemString += string+"\r\n";
}
File file = new File(path);
try {
if (!file.exists()) {
System.out.println("文件不存在!创建新文件"+path);
file.createNewFile();
}
FileWriter fw = new FileWriter(file);
fw.write(poemString);
fw.close();
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
/**
* 从String类型的数据中,按照一定的规则获取要写入的数据和目标文件路径,规定格式为: xxx\r\nxxx # path
* @param str
* @return boolean
*/
public static boolean writePoem(String str) {
//获得目标文件路径
String path = null;
path = str.substring(str.indexOf("#") + 1).trim();
//获得要写入的数据
str = str.substring(0,str.indexOf("#"));
File file = new File(path);
try {
if (!file.exists()) {
System.out.println("文件不存在!创建新文件" + path);
file.createNewFile();
}
FileWriter fw = new FileWriter(file);
fw.write(str);
fw.close();
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
}
当前类的源码写入到指定文件的工具类的设计和实现
package com.mashen.utils;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.util.Scanner;
/**
* 把当前类的源码写入到指定文件(.txt)
* @author Administrator
* @dateTime 2016/07/25
* @version 1.0
*/
public class CopyCode {
public CopyCode(){
}
public static void main(String[] args) throws IOException {
System.out.print("请输入目标文件(.txt):");
Scanner scanner = new Scanner(System.in);
String fileStr = scanner.next();
if (new CopyCode().copyCodeIntoFile(new CopyCode(),fileStr)) {
System.out.println("操作成功!");
}
}
/**
* 传入当前类的对象和目标文件路径,将当前类的源码写入到目标文件中
* @param clas
* @param targetFilePath
* @return boolean
* @throws IOException
*/
public boolean copyCodeIntoFile(Object clas,String targetFilePath) throws IOException{
//获取当前运行时类的对象的实体名称
String currentPackageNameAndClassName = clas.getClass().getName();
//获取类名
String className = currentPackageNameAndClassName.substring
(currentPackageNameAndClassName.lastIndexOf(".")+1);
currentPackageNameAndClassName = currentPackageNameAndClassName.replace(".", "/")+".class";
//获取当前类编译后的.class文件的绝对路径(可能含有中文)
String path = java.net.URLDecoder.decode
(clas.getClass().getClassLoader().getResource
(currentPackageNameAndClassName).toString(),"utf-8");
//获取到能被当前操作系统识别的路径
path = path.substring(path.indexOf("file:/") + new String("file:/").length());
//根据当前类的.class文件所在的路径反推出.java文件所在的路径
//如从E:/mashen/初始化/ms/bin/com/mashen/utils/WriteIntoFile.class
//得到E:/mashen/初始化/ms/src/com/mashen/utils/WriteIntoFile.java
File file = new File(path);
//获得"bin"所在的下标
int indexOfBin = path.indexOf("bin/");
//得到当前类的包名
String packageName = path.substring
(indexOfBin + new String("bin/").length() , path.lastIndexOf("/"));
//得到项目所在的路径
path = path.substring(0, indexOfBin);
//获得当前类的.java文件
file = new File(path + "\\src\\" + packageName+"\\" + className + ".java");
//目标文件
File targetFile = new File(targetFilePath);
if (!targetFile.exists()) {
System.out.println("文件不存在!创建新文件");
targetFile.createNewFile();
}
//如果当前的类的.java文件所在的路径存在,则把该.java文件的内容写入目标文件,否则返回false
if (file.exists()) {
FileReader fReader = new FileReader(file);
FileWriter fWriter = new FileWriter(targetFile);
int read = 0;
char [] buffer = new char[3048];
String result = null;
while((read = fReader.read(buffer)) > -1){
result = new String(buffer, 0, buffer.length);
fWriter.write(result);
}
fReader.close();
fWriter.close();
return true;
}
else {
return false;
}
}
}