JAVA高级视频_IO输入与输出
流一般分为输入流(Input Stream)和输出流(OutputStream)两类,但这种划分并不是绝对的。比如一个文件,当向其中写数据时,它就是一个输出流;当从其中读取数据时,它就是一个输入流。当然,键盘只是一个数人流,而屏幕则只是一个输出流。
字节流:从InputStream和OutputStream派生出来的一系列类。这类流以字节(byte)为基本处理单位。
字符流:从Reader和Writer派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位。
import java.io.* ;
public class OutputStreamWriterDemo01{
public static void main(String args[]) throws Exception { // 所有异常抛出
File f = new File("d:" + File.separator + "test.txt") ;
Writer out = null ; // 字符输出流
out = new OutputStreamWriter(new FileOutputStream(f)) ; //字节流变为字符流
out.write("hello world!!") ; // 使用字符流输出
out.close() ;
}
};
import java.io.* ;
public class InputStreamReaderDemo01{
public static void main(String args[]) throws Exception{
File f = new File("d:" + File.separator + "test.txt") ;
Reader reader = null ;
reader = new InputStreamReader(new FileInputStream(f)) ; // 将字节流变为字符流
char c[] = new char[1024] ;
int len = reader.read(c) ; // 读取
reader.close() ; // 关闭
System.out.println(new String(c,0,len)) ;
}
};
以上两个操作都是将字节流的操作类以字符流的形式进行输出和输入。
InputStream和OutputStream
int read() 返回下一个输入字节的整型表示
long skip():跳过流中若干字节数
available():返回流中可用字节数
mark():在流中标记一个位置
reset():返回标记过得位置
markSupport():是否支持标记和复位操作
close():关闭流
管道流
管道用来把一个程序、线程和代码块的输出连接到另一个程序、线程和代码块的输入。java.io中提供了类 PipedInputStream和PipedOutputStream作为管道的输入/输出流
管道输入流作为一个通信管道的接收端,管道输出流则作为发送端。管道流必须是输入输出并用,即在使用 管道前,两者必须进行连接
管道输入/输出流可以用两种方式进行连接:
在构造方法中进行连接
PipedInputStream(PipedOutputStream pos);
PipedOutputStream(PipedInputStream pis);
通过各自的connect()方法连接
在类PipedInputStream中,connect(PipedOutputStreampos);
在类PipedOutputStream中,connect(PipedInputStreampis);
字节流与字符流的转换:
InputStreamReader和OutputStreamWrite这两个类是字节流和字符流之间转换的类,InputStreamReader可 以将以个字节流中字节解码成字符,OutputStreamWrite将写入的字符编码成字节后写入一个字节流。
缓冲流的总府流的缓冲区
缓冲区的出现提高了对数据的读写效率
对应类BufferWriter,BufferReader
字符流要结和流才可以使用
在流的基础上对流的功能进行了增强
缓冲流的特点是速度快。如果只是节点流进行数据的传输的话,需要一个字节一个字节的传输。而缓冲流和节点流同时进行的话速度就快的很多,那是因为节点流每传输n个字节就会打上标记,再去传输后面的n个字节,在节点流传输后面的n个字节时,缓冲流传输第一次传输的n个字节,所以速度明显要快。过滤流的特点是程序运行的安全系数高。通过流这种技术,应用程序和外部设备交互。但是外部设备的安全性不是都很高,如果遇到例如病毒或磁盘扇区损坏等等的问题就会影响到应用程序的安全性。而利用过滤流和外部设备进行交互,然后节点流与过滤流之间进行交互,最后节点流再和应用程序交互,这样安全性就大大地提高了。包装流的特点是该流类的对象必须建立在节点流类对象的基础之上。这个特点没有什么可解释的。
缓冲区的出现是为了提高流的操作效率而出现的.在创建缓冲区之前,必须先有流对象..
在缓冲区提供了一个跨平台的换行符readLine*/
import java.io.*;
class BufferedWriterDemo
{
public static void main(String[]args)throws IOException
{//创建一个字符写入流对象.
FileWriter fw = new FileWriter("buf.text");
//为了提高字符写入流速度,加入了缓冲技术.只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可.
BufferedWriter bufw = new BufferedWriter(fw);
for( int i=1;i<5;i++)
{ bufw.write("abcde"+i);
bufw.newLine();
//记住只要用到缓冲区,就得刷新
bufw.flush();
}
bufw.close();
}
}
--------------字符流读取缓冲区---------
import java.io.*;
class BufferedReaderDemo
{
public static void main(String[]args)throws IOException
{
FileReader fr = new FileReader("buf.text");
//为了提高字符写入流速度,加入了缓冲技术.只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可.
BufferedReader bufr = new BufferedReader(fr);
String Line=null;
while ( (Line=bufr.readLine())!=null )
{
System.out.println(Line);
}
bufr.close();
}
}
-------------通过缓冲区复制一个java文件-------------
import java.io.*;
class CopyTextByBuf
{
public static void main(String[]args)
{
BufferedReader bufr = null;
BufferedWriter bufw = null;
try
{
bufr = new BufferedReader(new FileReader("BufferedWriterDemo.java"));
bufw = new BufferedWriter(new FileWriter("bufWriter_Copy.text"));
String line = null;
while((line=bufr.readLine())!=null)
{
bufw.write(line);
bufw.newLine();
bufw.flush();
}
}catch (IOException e)
{
throw new RuntimeException("读写失败");
}
finally
{ try
{if(bufr!=null)
bufr.close();
}
catch (IOException e)
{throw new RuntimeException("读写失败");
}
}
}
}
流是一个有序的字节序列,可作为一个输入源,也可作为一个输出的目的地。
字节流以字节为单位输入输出,字节流类名含有stream,字符流以字符为单位输入输出,字节流
类名含有reader或writer.为了通用性,java中字符是16位的unicode字符,所以8位的字节流必
须和16位的字符流进行转换。字节流到字符流的转换使用InputStreamReader类:
public InputStreamReader(InputStream in);
public InputStreamReader(InputStream in,String encoding);
public OuputStreamWriter(OnputStream in);
public OnputStreamWriter(OnputStream in,String encoding);
Reader和Writer类允许用户在程序中无缝的支持国际字符集,如果要读区的文件是别国语言,
要使用字符流。
JavaI/O字节流与字符流就是java实现输入/输出数据 字节流是一个字节一个字节的输入/输出 数据 (两个字节组成一个汉字)所以在用字节流读一串汉字时会出现乱码问题,
同样字符流是一个字符一个字符流(一个字符=两个字节)的输入/输出 数据 用字符流读一串汉字可以解决乱码问题.字符流操作时使用了缓冲区,而在关闭字符流时会强制性地将缓冲区中的内容进行输出,但是如果程序没有关闭,则缓冲区中的内容是无法输出的,所以得出结论:字符流使用了缓冲区,而字节流没有使用缓冲区。
import java.io.*;
class CopyPic
{
public static void main (String[]args)
{
FileOutputStream fos=null;
FileInputStream fis=null;
try
{
fos=new FileOutputStream("D:\\119.jpg");
fis=new FileInputStream("E:\\图片\\a.jpg ");
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("写入关闭失败");
}
}
}
}