JAVASE IO

------------------------------------------------------------------------------------------------------------>0
这是IO的学习
学习的内容是为了扩充基本IO的形式
以免在Web中继承基本IO模式下的误解。
IO流用来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的对象都在IO包中
流按照流向分为:输入流->外设(硬盘)的数据读给内存去运算
      和
      输出流->内存的数据写到到外设(硬盘)上
流按操作数据分为两种:字节流:能处理所有数据
    和
    字符流:统一码表(很多ascii),用一张码表用于全部语言对计算机上的实现(Unicode)
java内置Unicode码表,特点就是无论什么字符都用两个字节表示。比较浪费资源
为了防止不同码表的解析
所以在读取数据 (文字数据)时,希望能手动去指定能解析这个字节数据的码表。
所以就将用于读取字节数的字节流和编码表相结合,也就是说,我用字节流读取硬盘上的数据,
是字节数据,但是读完之后我不先进行操作,我先查表,查什么表呢?
不知道,需要给与指定,所以为了方便应用所以就出现了字符流
一句话:字节流读取文字字节数据后,不直接操作而是先查指定的编码表。获取对应的文字

然后再对这个文字进行操作。这就是说字节流+编码表。

字节流的抽象基类:

InputStream,OutputStream。

字符流的抽象基类:

Reader,Writer.

注:由这四个类派生出来的子类名称都是其父类名称作为子类的后缀

如:InputStream的子类FileInputStream

如:Reader的子类FileReader




===============================================================FileWriteDemo0.java

文件写

package cn.ITHong.IO.FileWriter;

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

public class FileWriterDemo0 {

	private static final String LINE_SEPARATOR = System
			.getProperty("line.separator");

	public static void main(String[] args) throws IOException {
		test1();
	}

	private static void test1() throws IOException {
		/**
		 * 支持续写*/
		FileWriter fw = new FileWriter("demo.txt", true);
		fw.write("续写的东西");
		fw.close();
	}

	private static void test0() throws IOException {
		// 创建一个可以往文件中写入字符数据的字符流输出流对象
		/**
		 * 既然是往一个文件中写入文字数据,那么在创建对象时, 就必须明确该文件,用于存储数据的目的地 如果文件不存在,则会自动创建,有文件则覆盖
		 */
		FileWriter fw = new FileWriter("demo.txt");

		/**
		 * 调用Write对象中的write(string)的方法,写入数据。 其实数据写入到了临时存储缓冲区中。
		 */
		fw.write("任命" + LINE_SEPARATOR + "第二行");
		/**
		 * 进行刷新可以多次,讲数据直接写入到目的地中。
		 * */
		fw.flush();
		/**
		 * 关闭流,只能用一次,关闭资源。内嵌有flush 了
		 */
		fw.close();
	}

}

=======================================================IOExceptionDemo0.java

IO

package cn.ITHong.IO.FileWriter;

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

public class IOExceptionDemo0 {

	private static final String LINE_SEPARATOR = System
			.getProperty("line.separator");

	public static void main(String[] args) throws IOException {
		test0();
	}

	private static void test0() {
		FileWriter fw = null;
		try {
			fw = new FileWriter("K://demo.txt");

			fw.write("任命" + LINE_SEPARATOR + "第二行");

		} catch (IOException e) {
			System.out.println(e.toString());
		}
		/**
		 * 加了finally就一定100%会执行finally里的语句 如果不加,在try外面加东西,如果不抛异常就是正常
		 * 可以执行,如果抛异常的话就可能直接让程序挂掉 ,不会再执行外面的代码而是直接抛出异常了事
		 * */
		finally {
			if (fw != null)
				try {
					fw.close();
				} catch (IOException e) {
					throw new RuntimeException("关闭失败");
				}
		}
	}

}

==================================================================FilereaderDemo0.java

文件写

package cn.ITHong.IO.Filereader;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class FilereaderDemo0 {

	public static void main(String[] args) throws IOException {
		test4();

	}
	/**
	 * 连续读加强*/
	private static void test4() throws IOException {
		FileReader fr = new FileReader("demo.txt");
		//增加缓冲区,加快读取速度,最好是1024为单位。
		char[] buf = new char[1024];
		int len = 0;
		while((len=fr.read(buf))!=-1)
		System.out.print(new String(buf, 0, len));
	}
	/**
	 *使用read(char())读取文本文件数据
	 **/
	private static void test3() throws IOException {
		FileReader fr = new FileReader("demo.txt");
		/**
		 * 先创建字符数组
		 * */
		char[] buf = new char[20];
		
		
		int num = fr.read(buf);//读到的字符存储在数组中
		System.out.println(new String(buf));
		fr.close();
	}
	/**
	 * 连续读*/
	private static void test2() throws IOException {
		FileReader fr = new FileReader("demo.txt");
		
		int ch;
		while((ch=fr.read())!=-1)
		{
			System.out.print((char)ch);
		}
	}
	/**
	 * 一次读一个*/
	private static void test1() throws FileNotFoundException, IOException {
		//1.创建读取字符数据的流对象
		/*
		 * 在创建读取流对象时,必须要明确被读取的文件。
		 * 一定要确定该文件是存在的。
		 * 用一个读取流关联一个已存在文件
		 * */
		FileReader fr = new FileReader("demo.txt");
		
		//用Reader中的read方法读取字符
		int ch =fr.read();
		//返回未被解析的嘛(加了char就强制解析了),没有内容读的时候。返回-1
		System.out.println((char)ch);
		
		
		fr.close();
	}

}

=================================================================================CopyTextTest.java

文件读写



package cn.ITHong.IO.charstream.test;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.lang.model.type.NullType;

/**
 * 需求:作业:将C盘的一个文本文件复制到D盘 1.需要读取源 2.将读到的源数据写入到目的地 3.既然是操作文本数据,使用字符流
 * */
public class CopyTextTest {

	private static final int BUFFER_SIZE = 1024;

	public static void main(String[] args) throws IOException {
		test1();
	}

	/**
	 * 带有缓存的读写,效率高点(相对一)
	 * */
	private static void test1() {
		FileWriter fw = null;
		FileReader fr = null;
		try {
			fw = new FileWriter("目标文件.txt");
			fr = new FileReader("源文件.txt");
			int len = 0;
			char[] buf = new char[BUFFER_SIZE];
			while ((len = fr.read(buf)) != -1) {
				fw.write(buf, 0, len);
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			if (fw != null)
				try {
					fw.close();
				} catch (IOException e) {
					System.out.println(e.toString());
				}

			if (fr != null)
				try {
					fr.close();
				} catch (IOException e) {
					System.out.println(e.toString());
				}

		}

	}

	/**
	 * 复制文本方式一,效率低点(相对二)
	 */
	private static void test0() throws FileNotFoundException, IOException {
		// 1.读取一个已有的文本文件,便于字符读取刘和文件关联
		FileReader fr = new FileReader("源文件.txt");
		// 2.创建一个目的。用于存储读到的数据。
		FileWriter fw = new FileWriter("目标文件.txt");
		// 3.频繁的读写操作
		int ch = 0;
		while ((ch = fr.read()) != -1) {
			fw.write(ch);
		}
		// 4.关闭流资源
		fr.close();
		fw.close();
	}

}

======================================字符流的缓冲区

缓冲区的出现提高了对数据 的读写效率

对应类

*BuffferedWriter

*BufferedReader

缓冲区要结合流才可以使用

在流的基础上对流的功能进行增强


======================================BufferedWriteDemo

带缓冲区的写

package cn.ITHong.IO.charstream.buffer;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 缓冲区使用
 */
public class BufferedWriterDemo {

	// 在什么系统都能起到换行
	private static final String LINE_SEPARATOR = System
			.getProperty("line.separator");

	public static void main(String[] args) throws IOException {
		test3();

	}

	private static void test3() throws IOException {
			FileWriter fw = new FileWriter("目标文件.txt");
			BufferedWriter bw = new BufferedWriter(fw);
			for(int i =0 ;i <10 ; i++)
			{
				bw.write("写入"+i+"次");
				bw.newLine();
				bw.flush();
			}

			bw.close();
	}

	private static void test2() throws IOException {
		FileWriter fw = new FileWriter("目标文件.txt");
		BufferedWriter bw = new BufferedWriter(fw);
		bw.write("用缓冲区写入");
		bw.newLine();
		bw.close();
	}

	private static void test1() throws IOException {
		FileWriter fw = new FileWriter("目标文件.txt");
		BufferedWriter bw = new BufferedWriter(fw);
		// 使用缓冲区的写入方法将数据先写入到缓冲区中
		bw.write("李哲弘" + LINE_SEPARATOR + "第二行");
		// 不是替代方法,只能用于BufferedWrite
		bw.newLine();
		bw.write("第二种换行");

		// 使用缓冲区的刷新方法将数据的地中
		bw.flush();
		// 关闭缓冲区,其实关闭的就是被缓冲的流对象
		bw.close();

		// fw.close();
	}

}
===============================================BufferedReaderDemo.java

带缓冲区的读

package cn.ITHong.IO.charstream.buffer;


import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderDemo {

	public static void main(String[] args) throws IOException {
		FileReader fr = new FileReader("源文件.txt");
		BufferedReader br = new BufferedReader(fr);
		
		String line = null;
		while((line=br.readLine())!=null)
		{
			System.out.println(line);
		}
		br.close();
	}

}

==============================================================LineNumberDemo.java

有行号功能

package cn.ITHong.IO.charstream.linenumber;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;

public class LineNumberDemo {

	private static final int lineNumber = 3;
	public static void main(String[] args) throws IOException {
		test1();
	}
	/**
	 * 有行号的功能哦!!!,*/
	private static void test1() throws FileNotFoundException, IOException {
		FileReader fr = new FileReader("目标文件.txt");
		LineNumberReader lnr = new LineNumberReader(fr);
		String line = null;
		lnr.setLineNumber(lineNumber);
		while((line=lnr.readLine())!=null)
		{
			System.out.println(lnr.getLineNumber()+":"+line);
		}
		lnr.close();
	}

}

====================================================

文件大小获取2

public static void main(String[] args) {  
    File f= new File("D:\\CentOS-6.5-x86_64-bin-DVD1.iso");  
    if (f.exists() && f.isFile()){  
        logger.info(f.length());  
    }else{  
        logger.info("file doesn't exist or is not a file");  
    }  
} 

文件大小获取2

public static void main(String[] args) {  
    FileChannel fc= null;  
    try {  
        File f= new File("D:\\CentOS-6.5-x86_64-bin-DVD1.iso");  
        if (f.exists() && f.isFile()){  
            FileInputStream fis= new FileInputStream(f);  
            fc= fis.getChannel();  
            logger.info(fc.size());  
        }else{  
            logger.info("file doesn't exist or is not a file");  
        }  
    } catch (FileNotFoundException e) {  
        logger.error(e);  
    } catch (IOException e) {  
        logger.error(e);  
    } finally {  
        if (null!=fc)){  
            try{  
                fc.close();  
            }catch(IOException e){  
                logger.error(e);  
            }  
        }   
    }  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值