您的位置:首页 > 编程语言 > Java开发

java学习之路---IO类----字节流

2013-11-24 20:53 267 查看
 在java io中包含流的操作主要有两种               字节流和字符流,两类都有输入输出操作。。字节流输出主要是OutputStream,输入InputStream,在字符流中输出主要是:Writer,输入主要是:Reader

java io 操作也有步骤,以文件为例

     (1)使用File类来打开一个文件
       (2)通过字节流或字符流的子类指定输出的位置
         (3)进行读写操作
           (4)关闭输入输出

1.字节流

     字节流只要是以操作byte数据,以byte数组为主,组要操作类是OutputStream,InputStream

2.字节输出流
看下源码:

     public abstract class OutputStream implements Closeable,
Flushable {
[align=left]                    public abstract void write(int b) throws IOException;[/align]
                     public void write(byte b[]) throws IOException
{
[align=left]                       write(b, 0, b. length);[/align]
[align=left]                             }[/align]
[align=left]
[/align]
                     public void write(byte b[], int off, int len) throws IOException
{

              if (b
== null ) {
[align=left]              throw new NullPointerException();[/align]
          } else if ((off
< 0) || (off > b.length) || (len < 0) ||
                   ((off + len) > b. length)
|| ((off + len) < 0)) {
[align=left]            throw new IndexOutOfBoundsException();[/align]
          } else if (len
== 0) {
[align=left]              return;[/align]
[align=left]        }[/align]
          for (int i
= 0 ; i < len ; i++) {
[align=left]            write(b[off + i]);[/align]
[align=left]        }[/align]
[align=left]     }[/align]

                          public void flush() throws IOException
{
[align=left]                 }[/align]
                     public void close() throws IOException
{
[align=left]    }[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]关于它的实现,它实现了一个Closeable(关闭)和flushable(刷新)[/align]
[align=left]
[/align]
[align=left]它一共就这么多方法[/align]
[align=left]
[/align]



[align=left][/align]
[align=left]
[/align]
[align=left]
[/align]
3.一般字节输出流的文件操作用FileOutputStream

[align=left]public class OutputStreamDemo {[/align]
[align=left]     [/align]
     public static void main(String[]
args) throws Exception{
[align=left]           //第一步,找到一个文件:[/align]
[align=left]          [/align]
          File f= new 
File("f:" +File.separator+"a.txt");
[align=left]          [/align]
[align=left]           //第二步,通过字节流的子类来实例化[/align]
[align=left]          [/align]
[align=left]          OutputStream out= null;[/align]
[align=left]          out= new FileOutputStream(f);[/align]
[align=left]          [/align]
[align=left]           //第三步,进行读写操作[/align]
[align=left]          String str= "hello world";[/align]
[align=left]           byte b[]=str.getBytes();[/align]
[align=left]          out.write(b);[/align]
[align=left]          [/align]
[align=left]           //第四步,关闭流[/align]
[align=left]          [/align]
[align=left]          out.close();[/align]
[align=left]     }[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]补充:如果上面文件不存在,会自动创建[/align]
[align=left]
[/align]
[align=left]4.你反复的执行上面的程序,你会发现每一运行都会覆盖原来的内容,现在我想在后面继续写,那就要用它的另外的构造方法[/align]
[align=left]
[/align]
[align=left]     public class OutputStreamDemo1 {[/align]
     public static void main(String[]
args) throws Exception{
[align=left]          File f= new File("f:" +File.separator+"a.txt");[/align]
[align=left]          [/align]
[align=left]          OutputStream out= new FileOutputStream(f, true);[/align]
[align=left]          [/align]
[align=left]          String str= "hello like";[/align]
[align=left]          [/align]
[align=left]           byte b[]=str.getBytes();[/align]
[align=left]          [/align]
[align=left]           for(int i=0;i<b.length;i++){[/align]
[align=left]              out.write(b[i]); //这里用一个一个的写入,和上面的效果一样,看自己喜欢那个就用那个[/align]
[align=left]          }[/align]
[align=left]          [/align]
[align=left]          out.close();[/align]
[align=left]          [/align]
[align=left]          [/align]
[align=left]     }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]补充:如果需要换行:String str="\r\n hello like";[/align]
[align=left]
[/align]
[align=left]5.字节输入流[/align]
[align=left]
[/align]
[align=left]     看源码:[/align]
               public abstract class InputStream implements Closeable
{
[align=left]
[/align]
[align=left]由于方法比较多,就不全部列举了,自己可以去看下[/align]
[align=left]
[/align]
[align=left][/align]



[align=left]6.字节出入流文件操作[/align]
[align=left]
[/align]
     public class InputStreamDemo
{
           public static void main(String[]
args) throws Exception {
[align=left]              File f= new File("f:"+File.separator +"a.txt" );[/align]
[align=left]              [/align]
[align=left]              InputStream in= new FileInputStream(f);[/align]
[align=left]              [/align]
[align=left]               byte b[]=new byte[1024];[/align]
[align=left]              [/align]
[align=left]              in.read(b);[/align]
[align=left]              [/align]
[align=left]              [/align]
[align=left]              in.close();[/align]
[align=left]              [/align]
[align=left]              System. out.println(new String(b));[/align]
[align=left]          }[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]结果:[/align]

[align=left]hello worldhello[/align]
[align=left]从结果中发现后面还有很多空格,这是因为,我们的byte[]数组大小1024,所以我们要做处理[/align]
[align=left]
[/align]
public class InputStreamDemo1
{
           public static void main(String[]
args) throws Exception{
[align=left]              File f= new File("f:"+File.separator +"a.txt" );[/align]
[align=left]              [/align]
[align=left]              FileInputStream in= new FileInputStream(f);[/align]
[align=left]              [/align]
[align=left]               byte b[]=new byte[1024];[/align]
[align=left]              [/align]
[align=left]           int len=in.read(b);[/align]
[align=left]              [/align]
[align=left]              in.close();[/align]
[align=left]              [/align]
[align=left]              System. out.println("读入数据的长度:" +len);[/align]
[align=left]              [/align]
[align=left]              System. out.println("内容为" +new String(b,0,len));[/align]
[align=left]              [/align]
[align=left]          }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]结果:[/align]
[align=left]读入数据的长度:21[/align]
[align=left]内容为hello worldhello like [/align]

以上虽然解决了,但是治标不治本,它还是开辟那么的空间,我们要做到需要好多就开辟好多

          public class InputStreamDemo2
{
     public static void main(String[]
args) throws Exception{
          File f= new 
File("f:" +File.separator+"a.txt");
[align=left]          [/align]
[align=left]          InputStream in= new FileInputStream(f);[/align]
[align=left]          [/align]
[align=left]           byte b[]=new byte[(int)f.length()];[/align]
[align=left]          [/align]
[align=left]          in.read(b);[/align]
[align=left]          [/align]
[align=left]               in.close();[/align]
[align=left]          System. out.println(new String(b));[/align]
[align=left]     }[/align]
[align=left]
[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]结果:[/align]
[align=left]
[/align]

[align=left]hello worldhello like[/align]
[align=left]
[/align]
[align=left]还可以用另外一种读取方法:[/align]
[align=left]
[/align]
[align=left]                    public class InputStreamDemo3 {[/align]
           public static void main(String[]
args)throws Exception {
[align=left]              File f= new File("f:"+File.separator +"a.txt" );[/align]
[align=left]              [/align]
[align=left]              InputStream in= new FileInputStream(f);[/align]
[align=left]              [/align]
[align=left]               byte b[]=new byte[1024];[/align]
[align=left]               int temp=0;[/align]
[align=left]               int len=0;[/align]
[align=left]               while((temp=in.read())!=-1){//读到文件最后才会出现-1[/align]
[align=left]                   b[len]=( byte)temp;[/align]
[align=left]                   len++;[/align]
[align=left]              }[/align]
[align=left]              in.close();[/align]
[align=left]              [/align]
              System. out.println(new String(b,
0,len));
[align=left]          }[/align]
[align=left]}[/align]
[align=left]
[/align]
[align=left]结果:[/align]
[align=left]
[/align]

hello worldhello like
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: