黑马程序员-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倍以上。
打印流
该流提供了各种数据的原样打印方法。
字节打印流:
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();
}
}
|
黑马程序员-04-I/O技术
最新推荐文章于 2023-04-17 13:15:24 发布