七、IO
来源:互联网 发布:开发一个软件多少钱 编辑:程序博客网 时间:2024/06/10 03:51
IO
IO的作用:用来操作数据的
操作数据的方式:与数据形成一道通路,IO中称之为“流”,那么我们可以通过流对象中的方法来操作数据,实现数据的增删改查等操作,JAVA中为我们提供了两个主流
字符流
字符流两个基类:
Reader Writer
字节流
字节流两个基类:
InputStream OutputStream
先学习一下字符流的特点
既然IO流是用于操作数据的,那么数据的最常见体现形式是:文件。
那么先以操作文件为主来演示。
需求:在硬盘上,创建一个文件并写入一些文字数据。
找到一个专门用于操作文件的Writer子类对象:FileWriter,后缀名是父类名。 前缀名是该流对象的功能。
import java.io.*;
class FileWriterDemo
{
public static void main(String[] args) throws IOException
{
//创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。
//而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。
//其实该步就是在明确数据要存放的目的地。
FileWriter fw = new FileWriter("demo.txt");
//调用write方法,将字符串写入到流中。
fw.write("abcde");
//刷新流对象中的缓冲中的数据。
//将数据刷到目的地中。
//fw.flush();
//关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。
//将数据刷到目的地中。
//和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭。
fw.close();
}
}
从上面的代码可以看出来,当我们需要写数据时,可以用write()方法实现,那么如果我们需要读数据呢?用一段简单的代码演示一下就明白了。
import java.io.*;
class FileReaderDemo
{
public static void main(String[] args) throws IOException
{
//创建一个文件读取流对象,和指定名称的文件相关联。
//要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException
FileReader fr = new FileReader("demo.txt");
//调用读取流对象的read方法。
//read():一次读一个字符。而且会自动往下读。
int ch = 0;
while((ch=fr.read())!=-1)
{
System.out.println(ch);
}
fr.close();
}
}
接下来我们来看对字节文件的操作
同样找一个专门用于操作字节文件的InputStream子类对象:FileInputStream (读)
OutputStream子类对象:FileOutputStream (写)
后缀名是父类名,前缀名是该流对象的功能。
下面用复制图片的例子来演示一下对字节数据的读写:
思路:
1,用字节读取流对象和图片关联。
2,用字节写入流对象创建一个图片文件。用于存储获取到的图片数据。
3,通过循环读写,完成数据的存储。
4,关闭资源。
import java.io.*;
class CopyPic
{
public static void main(String[] args)
{
FileOutputStream fos = null;
FileInputStream fis = null;
try
{
fos = new FileOutputStream("c:\\2.bmp");
fis = new FileInputStream("c:\\1.bmp");
byte[] buf = new byte[1024];//定义一个缓冲区
int len = 0;
while((len=fis.read(buf))!=-1)//读取数据并写入到缓冲区
{
fos.write(buf,0,len);//将缓冲区中的全部数据写出去
}
}
catch (IOException e)
{
throw new RuntimeException("复制文件失败");
}
finally
{
try
{
if(fis!=null)
fis.close();
}
catch (IOException e)
{
throw new RuntimeException("读取关闭失败");
}
try
{
if(fos!=null)
fos.close();
}
catch (IOException e)
{
throw new RuntimeException("写入关闭失败");
}
}
}
}
*不论是操作字符文件还是字节文件,从代码中我们可以看得出来,就是关流,因为流要消耗系统资源,所以流一定要关!
缓冲区
下面介绍IO中一个比较重要的知识点,就是缓冲区,缓冲区的出现是为了提高流的操作效率的。直接通过IO流的方式读取的话,读一句写一句比较效率低下,而缓冲区将读到的数据存起来,然后一下子全部写出去,大大提高了效率,同时字符读取流缓冲区还为我们提供得了readLine()方法,也就是一次读一行的,目的也是提高效率,接下来我们用代码演示一下缓冲区的原理。
字符读取流缓冲区:
BufferedReader BufferedWriter
通过BufferedReader的一次读一行的方法readLine,方便于对文本数据的获取。
当返回null时,表示读到文件末尾。
import java.io.*;
class BufferedReaderDemo
{
public static void main(String[] args) throws IOException
{
//创建一个读取流对象和文件相关联。
FileReader fr = new FileReader("buf.txt");
BufferedReader bufr = new BufferedReader(fr);//加入缓冲区
String line = null;
while((line=bufr.readLine())!=null)//readLine方法返回的时候只返回回车符之前的 数据内容。并不返回回车符。
{
System.out.print(line);
}
bufr.close();
}
}
字符写入流缓冲区也是一样,同时字符写入流缓冲区也为我们提供了一个特殊的方法:newLine()(另起一行)这个方法的主要特点就是它的跨平台性
import java.io.*;
class BufferedWriterDemo
{
public static void main(String[] args) throws IOException
{
FileWriter fw = new FileWriter("buf.txt");//创建一个字符写入流对象
BufferedWriter bufw = new BufferedWriter(fw);
for(int x=1; x<5; x++)
{
bufw.write("abcd"+x);
bufw.newLine();
bufw.flush();
}
bufw.close();
}
}
既然字符流有缓冲区,那么字节流也有自己的缓冲区:
BufferedInputStream BufferedOutputStream
原理和字符流缓冲区一样,代码略*。
缓冲区的出现既然提高了效率,但是在使用缓冲区技术的时候也有几个一定要注意的地方:
1、缓冲区必然与流关联,也就是绑定,缓冲区的出现是为了提高流读取效率,没有流就会报异常。
2、缓冲区读写文件必须要刷新flush();
3、关闭缓冲区,其实关闭缓冲区也就是关闭了流对象
4、readLine()方法是字符流缓冲区的方法
转换流
InputStreamReader: 是字节流通向字符流的桥梁
为了达到最高效率,在 BufferedReader 内包装 InputStreamReader。
例如:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
这样字节流就可以使用字符流的readLine方法,但是主要目的还是改变解码器
OutPutStreamWriter:是字符流通向字节流的桥梁
BufferedWriter out = new BufferedWriter(new OutPutStreamWriter(System.out));
File类
IO中不仅为我们提供了上面介绍的对文件内容的操作,还提供了对文件本身属性的操作,那就是File类,它也是IO中很重要也是很常用的一个类。
常见方法:
1,创建。
boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回 false。和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。
boolean mkdir():创建文件夹。
boolean mkdirs():创建多级文件夹。
2,删除。
boolean delete():删除失败返回false。如果文件正在被使用,则删除不了返回false。
void deleteOnExit();在程序退出时删除指定文件。
3,判断。
boolean exists() :文件是否存在.
isFile():
isDirectory();
isHidden();
isAbsolute();
4,获取信息。
getName():
getPath():
getParent():
getAbsolutePath()
long lastModified()
long length()
File练习:将一个指定目录下的java文件的绝对路径,存储到一个文本文件中。
package IODemo;
import java.io.*;
import java.util.*;
class javaFileList
{
public static void main(String[] args) throws IOException
{
File dir = new File("F:\\java+3G 学习资料\\JAVA视频\\其他资料\\lianxi1");
List<File> list = new ArrayList<File>();
fileToList(dir,list);
File file =new File("F:\\java+3G 学习资料\\JAVA视频\\其他资料\\lianxi1\\javaFIleList.txt");
writeToFile(list,file.toString());
}
public static void fileToList(File dir,List<File> list)
{
File[] files = dir.listFiles();
for(File file : files)
{
if(file.isDirectory())
fileToList(file,list);//递归
else
{
if(file.getName().endsWith(".java"))
list.add(file);
}
}
}
public static void writeToFile(List<File> list,String javaListFile)throws IOException
{
BufferedWriter bufw = null;
try
{
bufw = new BufferedWriter(new FileWriter(javaListFile));
for(File f : list)
{
String path = f.getPath();
bufw.write(path);
bufw.newLine();
bufw.flush();
}
}
catch (IOException e)
{
throw e;
}
finally
{
try
{
if(bufw!=null)
bufw.close();
}
catch (IOException e)
{
throw e;
}
}
}
}
此练习中涉及到一个比较重要的算法:递归
递归的特点:调用自身方法。
基本数据流
DataInputStream与DataOutputStream
可以用于操作基本数据类型的数据的流对象。原理是一样的,只不过操作的是基本数据类型,
用简单的代码体现以下:
import java.io.*;
class DataStreamDemo
{
public static void main(String[] args) throws IOException
{
readData();
writeData();
}
public static void readData()throws IOException
{
DataInputStream dis = new DataInputStream(new FileInputStream("data.txt"));
int num = dis.readInt();
boolean b = dis.readBoolean();
double d = dis.readDouble();
System.out.println("num="+num);
System.out.println("b="+b);
System.out.println("d="+d);
dis.close();
}
public static void writeData()throws IOException
{
DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt"));
dos.writeInt(234);
dos.writeBoolean(true);
dos.writeDouble(9887.543);
dos.close();
}
}
- 七、IO
- java IO 输入输出(七)
- IO总结(七)
- 文件IO编程七
- Java io 输入输出流(七)
- 说说IO(七)- RAID
- 黑马程序员七、IO流
- 什么是IO(七)- RAID
- Java IO(七):File
- 说说IO(七)- RAID
- Java IO学习笔记七
- Linux IO 七层模型
- 说说IO(七)- RAID
- Java练手题之七IO编程
- java IO (七) 扩展应用
- linux编程学习笔记(七) 文件IO
- 黑马程序员------IO操作总结(七)
- Python学习笔记(七)IO编程
- “ADT requires android SDK tools revision” 21解决方法
- hibernate中的悲观锁和乐观锁的实现
- 开源中国iOS客户端学习——(四)GCDiscreetNotificationView提示
- python 获取linux本机信息【十全十美】
- ubuntu下完全删除mysql
- 七、IO
- ORACLE函数TO_CHAR以及数字转换格式
- log4j配置祥解
- 小议数据库的悲观锁和乐观锁
- Oracle控制文件多路复用
- myeclipse10优化及SVN安装配置
- Android 基础
- [置顶] 图像处理与计算机视觉:基础,经典以及最近发展
- 12、static与final关键字详解