黑马程序员-04-I/O技术

黑马程序员-04-I/O技术
                                                         -------  android培训 java培训 、期待与您交流! ----------
/*
                                                                             I/O输入输出主要结构
|
                                                             ------------------------ ----------------------------------- 
图片

文件时数据最常见的体现形式。
查找IO类的技巧:类的前缀是该类的功能,类名后缀是该类的基类名。

复制文件的原理:将一个盘中文件的数据存到另一个盘的文件中。
一般操作步骤:
1、在A盘中创建一个文件,用于存储B盘文件的数据。
2、定义通过读取流和B盘关联。
3、通过不断的读写完成数据存储。
4、关闭资源。


字符流中比较常用的类:
FileWriter
FileReader

BufferedWriter
BufferedReade r
-----------------------------------------------------------------------------------------------------------------------------------------------------------
File类:
用来将文件或者文件夹封装成对象。
方便对文件与文件夹的操作。
File对象可以作为参数传递给流的构造函数。

File常见方法:
创建:
boolean createNewFile() //如果文件存在则不创建返回false,否则创建文件返回ture;
和输出流不一样,输出流一建立就创建文件。
createTempFile(String prefix, String suffix)
createTempFile(String prefix, String suffix, File directory)
boolean mkdir()   //创建一级文件夹
boolean mkdirs()  //创建多级文件夹
删除:
delete()  //删除文件或文件夹,删除文件夹时必须保证文件夹内没有文件,否则会失败
deleteOnExit()  //退出时删除文件,用于程序发生异常退出时删除。

判断:
boolean canExecute()   //判断文件是否能执行。
    int compareTo(File pathname)  //判断文件名大小(可重写比较器比较文件体积大小)
    boolean isFile() //判断是否文件
    boolean isDirectory() //判断是否文件夹
    boolean isHidden()  //判断是否隐藏文件
    boolean isAbsolute()   //判读是否为绝对路径
  boolean exists()   //判断文件是否存在
 
获取信息:
String getName() //获取文件名
String getPath() //获取目录
String getParent() //获取父目录,如果没有指定的文件对象的上级目录,则此方法返回null;
File getAbsoluteFile() //获取绝对路径,并将绝对路径封装为file对象返回.
String getAbsolutePath() //获取绝对路径.
long lastModified()   //文件最后修改的时间
long length()   //文件长度
static File[] listRoots()   //获取文件盘符
String[] list()   //获取某个目录下的所有文件夹与文件(包含隐藏文件);
注意:
1、遍历文件的时候不要遍历隐藏文件。if(!file.isHidden()&&file.isDirectory())
2、删除的时候隐不隐藏都得删除。
3、删除的文件不会送到windows的垃圾桶。

删除指定目录
思路:
1、由于删除文件夹时文件夹里面的内容必须为空,所以必须先删除指定文件夹里面的文件。
2、如果指定的文件夹里面还有子文件夹,必须再进入子文件夹里删除子文件夹里面的文件。
-----------------------------------------------------------------------------------------------------------------------------------------------------------
复制文件的原理:将一个盘中文件的数据存到另一个盘的文件中。
一般操作步骤:
1、在A盘中创建一个文件,用于存储B盘文件的数据。
2、定义通过读取流和B盘关联。
3、通过不断的读写完成数据存储。
4、关闭资源。

方法2比方法1快10倍以上。

在开发中常使用BufferReader和BufferWriter更高效。  
-----------------------------------------------------------------------------------------------------------------------------------------------------------
打印流
该流提供了各种数据的原样打印方法。

字节打印流:
PrintStream
构造函数:
PrintStream(File file)//File类型
PrintStream(File file, String csn)
PrintStream(OutputStream out)//OutputStream类型
PrintStream(OutputStream out, boolean autoFlush) 
PrintStream(OutputStream out, boolean autoFlush, String encoding)
PrintStream(String fileName) //String类型
PrintStream(String fileName, String csn)

字符打印流:
构造函数:
PrintWriter(File file) //File类型
PrintWriter(File file, String csn) 
PrintWriter(OutputStream out) //OutputStream类型
PrintWriter(OutputStream out, boolean autoFlush) 
PrintWriter(String fileName) //String类型
PrintWriter(String fileName, String csn)
PrintWriter(Writer out)//Writer类型
PrintWriter(Writer out, boolean autoFlush) 
 
SequenceInputStream类是将多个流合并成一个流。可以将多个文件的数据合并成一个文件。
构造函数:
SequenceInputStream(Enumeration<? extends InputStream> e) //将集合中的多个合并成一个
SequenceInputStream(InputStream s1, InputStream s2) //将两个合并成一个  

-----------------------------------------------------------------------------------------------------------------------------------------------------------
         
Properties是hashtable的子类。
也就是说它具备map集合的特点,而且它里面存储的键值对都是字符串。
是集合和IO技术相结合的集合容器。
该对象的特点:可以用于键值对形式的配置文件。  
-----------------------------------------------------------------------------------------------------------------------------------------------------------
由于byte是2个字节,int是4个字节,所以当byte为-1(11111111-11111111)时int也为-1(11111111-11111111-11111111-11111111),
所以下面的myRead中在执行第一次时返回了-1。
解决的办法是将byte型的值与上int型的255就可以解决这个问题了。
例如:
byte -1 = 11111111-11111111
int -1 = 11111111-11111111-11111111-11111111
只要byte与上255才会得到正确的int值。
 00000000-00000000-00000000-11111111
&11111111-11111111-11111111-11111111
------------------------------------------
 00000000-00000000-00000000-11111111

-----------------------------------------------------------------------------------------------------------------------------------------------------------
键盘录入与字符流和字节流的转换

流操作的基本规律:
最痛苦的就是流对象太多,不知道用哪个操作。
通过三点来明确:
1、明确源和目的。
源:输入流InputStream Reader
目的:输出流OutputSteam Writer
2、操作的数据是否纯文本。
是:字符流
不是:字节流
3、当体系明确后,在明确要使用哪个具体的对象。
通过设备来进行区分:
源设备:内存、硬盘、键盘
目的设备:内存、硬盘、控制台
注意:转换流通常涉及到编码表转换时使用。    
*/ 
import java.io.*;
class WriterDemo //字符流写演示
{
/*
public  void WriterDemo() //文件的创建与写入
{
//FileWriter类没有空构造函数,因为创建对象时需要有文件才能写入数据。
//在创建文件的时候必须指定文件存储的位置和文件名。
FileWriter fw = new FileWriter("Demo.txt");
//将字符串写入到流的缓冲区中,并没有直接写入到文件。
fw.write("我要成为黑马的一员!");
//将流的缓冲区里面的数据写入到文件并清空流的缓冲区
//fw.flush();
//wrtite和flush两个功能可以重复使用,用于不断存储更多的数据
//关闭文件流并将流缓冲区的数据写入文件。注意:文件关闭后不能再将数据写入文件。
fw.close();
}
*/
public  void ioException() //专业的IO异常处理
{
FileWriter fw = null; //由于下面需要关闭文件流,所以需要把fw声明在语句块外面
try
{
fw = new FileWriter("Demo.txt");
fw.write("我要成为黑马的一员!");
}
catch(IOException e)
{
System.out.print(e.toString());
}
finally
{
try
{
if(fw!=null)
fw.close();
}
catch(IOException e)
{
System.out.print(e.toString());
}
}
}
public  void continueWrite()
{
FileWriter fw = null;
try
{
//如果没有"Demo.txt"文件将会自动创建一个文件
fw =  new FileWriter("Demo.txt",true);
//在windows操作系统下换行的命令是\r\n
fw.write("\r\n黑马程序员!");
}
catch(IOException e)
{
System.out.println(e.toString());
}
finally
{
try
{
if(fw!=null)
fw.close();
}
catch(IOException e)
{
System.out.println(e.toString());
}
}
}
}

class ReaderDemo //字符流读演示
{
public void readDemo()
{
FileReader fr = null;
try
{
//创建一个读取流的对象,和指定名称的文件相关联
fr = new FileReader("Demo.txt");
//read()方法一次读一个字符,而且每次会自动往下读
//读取的字符数,如果已到达流的末尾,则返回 -1 
/*int i = fr.read();
int i2 = fr.read();
System.out.println("i = "+(char)i);
System.out.println("i1 = "+(char)i2);*/
int i = 0;
/*while((i=fr.read())!=-1) //单个字符读取
{
System.out.print((char)i);
}*/
char buf[] = new char[1024]; //一般定义为1024个字节
int num = 0;
//read(char[])将读取的字符存入字符数组
//当读到-1时结束,每次返回读取的到字符的长度
while((num = fr.read(buf))!=-1) //一次读取1024个字符
{
System.out.print(new String(buf,0,num));
}
}
catch(IOException e)
{
System.out.println(e.toString());
}
finally
{
try
{
if(fr!=null)
fr.close(); //每次使用完流之后必须关闭流
}
catch(IOException e){}
}
}
}

class IntOutDemo //字节流演示
{
public void outPut() //按一个数据字节读取
{
FileOutputStream fos = null; //创建一个空的写字节流对象
try
{
fos = new FileOutputStream("Demo.txt");
fos.write("黑马程序员!".getBytes()); //使用平台的默认字符集将此 String 编码为 byte 序列
}
catch(IOException e)
{
throw new RuntimeException("读取文件异常");
}
finally
{
try
{
if(fos!=null)
fos.close(); //凡是使用了流之后都必须关闭
}
catch(IOException e)
{
throw new RuntimeException("关闭文件异常");
}
}
}

public void IntPut1()
{
FileInputStream fis = null; //创建一个空的读字节流对象
try
{
fis = new FileInputStream("Demo.txt");
int num = 0;
while((num=fis.read()) != -1) //利用循环条件按一个数据字节读取
{
System.out.print((char)num); //注意此处:利用单个字节传输中文会出现乱码
}
}
catch(IOException e)
{
throw new RuntimeException("读取文件异常");
}
finally
{
try
{
if(fis!=null)
fis.close(); //凡是使用了流之后都必须关闭
}
catch(IOException e)
{
throw new RuntimeException("关闭文件异常");
}
}
  }
public void IntPut2()
{
FileInputStream fis = null; //创建一个空的读字节流对象
try
{
fis = new FileInputStream("Demo.txt");
byte by[] = new byte[1024];
int num = 0;
while((num=fis.read(by)) != -1) //利用循环条件按一个数据字节读取
{
System.out.print(new String(by,0,num));
}
}
catch(IOException e)
{
throw new RuntimeException("读取文件异常");
}
finally
{
try
{
if(fis!=null)
fis.close(); //凡是使用了流之后都必须关闭
}
catch(IOException e)
{
throw new RuntimeException("关闭文件异常");
}
}
}
public void IntPut3()
{}
public void CopyPicture()
{}
}


class IODemo
{
public static void main(String args[])
{
//WriterDemo writer = new WriterDemo();
//writer.WriterDemo();
//writer.ioException();
//writer.continueWrite();
//ReaderDemo read = new ReaderDemo();
//read.readDemo();
IntOutDemo iod = new IntOutDemo();
//iod.outPut();
iod.IntPut1();
iod.IntPut2();
}

}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值