IO操作课程总结及思考

       在本文中,我将对在课堂上所讲的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对象对应目录的父目录名
                      如例1的file.getParent()结果为L:\
               (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平台上则以盘符开头
                      如例1的file.getPath()结果为true
               (12)long lastModified() 返回文件的最后修改时间,返回距离00:00:00 GMT, January 1, 1970的毫秒数
               (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数组

Java的I/O流

          1、Java中把输入/输出抽象表述为“流”
           2、流(Stream)是从起源(Source)到接收(Sink)的有序数据
           3、输入流:只能从中读取数据:InputStream(字节流) 和 Reader(字符流) ,我的理解是:以“我”为中心,“我”来读,向“我”输入
           4、输出流:只能向其写入数据:OutputStream(字节流) 和 Writer(字符流),我的理解是:以“别人”为中心,向“别人”写入

         

             字节流和字符流区别

               (1)字节流:读取8位的字节
               (2)字符流:读取16位的字符(2个字节)

             输入流:InputStream(字节流)

              (1)实现类:FileInputStream
                (2)常用方法:
                    int read() 从输入流中读取单个字节,返回所读取的字节数据
                    int  read(byte[] b) 从输入流中最多读取b.length个字节的数据,并将其存储在字节数组b中,返回实际读取的字节数据



               输入流:Reader(字符流)

                 (1)实现类:FileReader
                 (2)常用方法:
                     int read() 从输入流中读取单个字符,返回所读取的字符数据
                     int  read(char[] cbuf) 从输入流中最多读取cbuf个字符的数据,并将其存储在字符数组cbuf中,返回实际读取的字符数据

           

              输出流:OutputStream(字节流)

               (1)void write(int c) 将指定的字节输出到输出流中
               (2)void write(byte[] buf) 将字节数组的数据输出到输出流中

              输出流:Writer(字符流)

               (1)void write(char[] buf) 将指定字符数组的数据输出到输出流中
               (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;
		}
	}
	

}

本文所讲到的I/O操作知识在我的授课老师的博客有更加具体的介绍


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值