这是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);
}
}
}
}