------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
IO流用来处理设备之间的数据传输,Java对数据的操作是通过流的方式。操作流的对象在IO包中。
IO流分为字节流和字符流;
字节流两个基类;
InputStream OutputStream
字符流两个基类;
Reader Writer
既然IO流是用于操作数据的,name数据的最常见体现形式是;文件
需求;在硬盘上创建一个文件并写入一些数据。
操作文件的Writer子类对象;FileWriter 后缀名是父类名。 前缀名是该流对象的功能
所以在创建缓冲区之前,必须先有流对象。
System.out:对应的是标准输出设备,控制台。PrintStream
System.in:对应的标准输入设备:键盘。InputStream.此流已打开并准备提供输入数据。提供键盘输入的东西。
这里的in,out就是类System的属性。这俩属性的类型为InputStream,PrintStream即流。
读取键盘写入控制台。
以前流是读取某文件写入某目的地。
因为需求是读一行在控制台上打印一行,而字符流才有读一行的方法,字节流得自己写代码所以就有转换流。
IO流分为字节流和字符流;
字节流两个基类;
InputStream OutputStream
字符流两个基类;
Reader Writer
既然IO流是用于操作数据的,name数据的最常见体现形式是;文件
需求;在硬盘上创建一个文件并写入一些数据。
操作文件的Writer子类对象;FileWriter 后缀名是父类名。 前缀名是该流对象的功能
import java.io.*;
class FileWriterDemo
{
public static void main(String[] args) throws IOException//指定的目录不对如k盘
{
//创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。
//而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。
//其实该步就是在明确数据要存放的目的地。
FileWriter fw = new FileWriter("demo.txt");//没有空参数构造函数
//调用write方法,将字符串写入到流中
fw.write("abcde");//流就好比管道,现在是将字符串写到流中,并未写到文本中
//流中有缓冲区,调用刷新方法来把缓冲区的数据刷到目的地。
//不刷新是不会将数据存到目的地,还在流中。
fw.flush();
//close方法是关闭流资源,但是关闭之前会刷新一次缓冲区中的数据,一刷就把数据存到了目的地
//和flush区别;flush刷新后,流对象还可以继续使用,close刷新后,会将此流关闭
fw.close();
//fw.write("haha");已经被关闭了此流。所以会报异常
}
}
IO异常处理方式
import java.io.*;
class FileWriterDemo2
{
public static void main(String[] args)
{
FileWriter fw = null;//外边建立引用,作用于整个函数
try
{
fw = new FileWriter("k:\\demo.txt");//里边初始化
fw.write("adfdfs");
//fw.close();关闭资源
//这三句代码都会报异常,所以放在一个代码块中,当其中一句报异常,下面的代码就不会执行。
}
catch (IOException e)
{
System.out.println(e.toString());
}
finally
{
try
{
//if(fw!=null)避免NullPointerException异常, 没有这个判断就是俩异常
fw.close();//这句代码也得处理异常
}
catch (IOException e)
{
System.out.println("关闭资源异常");
}
}
}
}
缓冲区的出现是为了提高流的操作效率而出现的。就是把流对象中的文本放到缓冲区。
所以在创建缓冲区之前,必须先有流对象。
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("adc"+x);
bufw.newLine();//换行操作跨平台的
bufw.flush();
//zhi要用到缓冲区就刷新,写一次刷一次(停电了,没刷)
}
bufw.close();
//关闭缓冲区就是在关闭缓冲区的流对象。所以不用再关闭流资源。
}
}
读取键盘录入。
System.out:对应的是标准输出设备,控制台。PrintStream
System.in:对应的标准输入设备:键盘。InputStream.此流已打开并准备提供输入数据。提供键盘输入的东西。
这里的in,out就是类System的属性。这俩属性的类型为InputStream,PrintStream即流。
读取键盘写入控制台。
以前流是读取某文件写入某目的地。
因为需求是读一行在控制台上打印一行,而字符流才有读一行的方法,字节流得自己写代码所以就有转换流。
import java.io.*;
class ReadIn
{
public static void main(String[] args) throws IOException
{
/*
InputStream in = System.in;//System.in得到的就是一个字节读取流
int by =0; //设置一个字节为零
by = in.read();//键盘输入的数据会此流读取到,如果没有读取到键盘的输入数据,程序停下来就会等输入数据。
System.out.println(by);
*/
//需求;录入一行打印一行,如果录入over那么停止
//1,获取到字节读取流,此流读取的是键盘录入的数据
InputStream in = System.in;
//2,建立缓冲区用来存储读取到的数据
StringBuilder sb = new StringBuilder();
//3,循环
while (true)
{
int ch = in.read();
if(ch=='\r')
continue;
if(ch=='\n')
{
String s = sb.toString();
System.out.println(s);
if(s.equals("over"))
break;
sb.delete(0,sb.length());
}
else
sb.append((char)ch);
}
}
}
/*
合并流,多个流合并成一个流。
*/
import java.io.*;
import java.util.*;
class SequenceDemo
{
public static void main(String[] args) throws IOException
{
//创建一个集合存的是流对象
Vector<FileInputStream> v = new Vector<FileInputStream>();
v.add(new FileInputStream("c:\\1.txt"));
v.add(new FileInputStream("c:\\2.txt"));
v.add(new FileInputStream("c:\\3.txt"));
Enumeration<FileInputStream> en = v.elements();
SequenceInputStream sis = new SequenceInputStream(en);//合并流SequenceInputStream是InputStream的子类
//目的地
FileOutputStream fos = new FileOutputStream("c:\\3.txt");
//读写动作
byte[] buf = new byte[1024];
int len =0;
while ((len=sis.read(buf))!=-1)
{
fos.write(buf,0,len);
}
fos.close();
sis.close();
}
}