深入解析Java编程中面向字节流的一些应用

文件输入输出流

文件输入输出流 FileInputStream 和 FileOutputStream 负责完成对本地磁盘文件的顺序输入输出操作。

【例】通过程序创建一个文件,从键盘输入字符,当遇到字符“#”时结束,在屏幕上显示该文件的所有内容

import java.io.*;
class ep10_5{
  public static void main(String args[]){
    char ch;
    int data;
    try{
      FileInputStream a=new FileInputStream(FileDescriptor.in); //创建文件输入流对象
      FileOutputStream b=new FileOutputStream("ep10_5"); //创建文件输出流对象
      System.out.println("请输入字符,以#号结束:");
      while((ch=(char)a.read())!='#'){
        b.write(ch);
      }
      a.close();
      b.close();
      System.out.println();
      FileInputStream c=new FileInputStream("ep10_5");
      FileOutputStream d=new FileOutputStream(FileDescriptor.out);
      while(c.available()>0){
        data=c.read();
        d.write(data);
      }
      c.close();d.close();
    }
    catch(FileNotFoundException e){
     System.out.println("找不到该文件!");
    }
    catch(IOException e){}
  }
}


FileDescriptor 是 java.io 中的一个类,该类不能实例化,其中包含三个静态成员:in、out 和err,分别对应于标准输入流、标准输出流和标准错误流,利用它们可以在标准输入输出流上建立文件输入输出流,实现键盘输入或屏幕输出操作。

【例】实现对二进制图形文件(.gif)的备份

import java.io.*;
class ep10_6{
  public static void main(String args[]) throws IOException{
    FileInputStream a=new FileInputStream("ep10_6.gif");
    FileOutputStream b=new FileOutputStream("ep10_6_a.gif");
    System.out.println("文件的大小为:"+a.available());
    byte c[]=new byte[a.available()];
    a.read(c); //将图形文件读入数组
    b.write(c); //将数组中的数据写入到新文件中
    System.out.println("文件已经被更名复制!");
    a.close();
    b.close();
  }
}

过滤流

FilterInputStream 和 FileOutputStream 是 InputStream 和 OutputStream 的直接子类,分别实现了在数据的读、写操作的同时能对所传输的数据做指定类型或格式的转换,即可实现对二进制字节数据的理解和编码转换。

常用的两个过滤流是数据输入流 DataInputStream 和数据输出流 DataOutputStream。其构造方法为:

  DataInputStream(InputStream in); //创建新输入流,从指定的输入流 in 读数据
  DataOutputStream(OutputStream out); //创建新输出流,向指定的输出流 out 写数据

由于 DataInputStream 和 DataOutputStream 分别实现了 DataInput 和 DataOutput 两个接口(这两个接口规定了基本类型数据的输入输出方法)中定义的独立于具体机器的带格式的读写操作,从而实现了对不同类型数据的读写。由构造方法可以看出,输入输出流分别作为数据输入输出流的构造方法参数,即作为过滤流必须与相应的数据流相连。

DataInputStream 和 DataOutputStream 类提供了很多个针对不同类型数据的读写方法,具体内容读者可参看 Java 的帮助文档。

【例】将三个 int 型数字 100,0,-100 写入数据文件 ep10_6.dat 中。

import java.io.*;
class ep10_7{
  public static void main(String args[]){
    String fileName="ep10_7.dat";
    int value1=100,value2=0,value3=-100;
    try{
      //将 DataOutputStream 与 FileOutputStream 连接输出不同类型的数据
      DataOutputStream a=new DataOutputStream(new FileOutputStream(fileName));
      a.writeInt(value1);
      a.writeInt(value2);
      a.writeInt(value3);
      a.close();
    }
    catch(IOException i){
      System.out.println("出现错误!"+fileName);
    }
  }
}

运行后在程序目录中生成数据文件 ep10_7.dat,用文本编辑器打开后发现内容为二进制的:
00 00 00 64 00 00 00 00 FF FF FF 9C。

【例】读取数据文件 ep10_6.dat 中的三个 int 型数字,求和并显示。

import java.io.*;
class ep10_8{
  public static void main(String args[]){
    String fileName="D:\\myjava/ep10_7.dat";
    int sum=0;
    try{
      DataInputStream a=new DataInputStream(new BufferedInputStream(new FileInputStream(fileName)));
      sum+=a.readInt();
      sum+=a.readInt();
      sum+=a.readInt();
      System.out.println("三个数的和为:"+sum);
      a.close();
    }
    catch(IOException e){
      System.out.println("出现错误!"+fileName);
    }
  }
}

运行结果:

三个数的和为:0

readInt 方法可以从输入输出流中读入 4 个字节并将其作为 int 型数据直接参与运算。由于已经知道文件中有 3 个数据,所以可以使用 3 个读入语句,但若只知道文件中是 int 型数据而不知道数据的个数时该怎么办呢?因为 DataInputStream 的读入操作如遇到文件结尾就会抛出 EOFException 异常,所以可将读操作放入 try 中。

try{
  while(true)
  sum+=a.readInt();
}
catch(EOFException e){
  System.out.pritnln("三个数的和为:"+sum);
  a.close();
}

EOFException 是 IOException 的子类,只有文件结束异常时才会被捕捉到,但如果没有读到文件结尾,在读取过程中出现异常就属于 IOException。

【例】从键盘输入一个整数,求该数的各位数字之和。

import java.io.*;
class ep10_9{
  public static void main(String args[]) throws IOException{
    DataInputStream a=new DataInputStream(System.in);
    System.out.print("请输入一个整数:");
    int b=a.readInt();
    int sum=0;
    int c=b;
    while(c>0){
      int d=c%10; //取最低位
      c=c/10; //去掉最低位
      sum=sum+d; //累加各位之和
    }
    System.out.println(b+"的各位数字之和="+sum);
  }
}

运行结果:

请输入一个整数:26
842403082 的各位数字之和=31

需要注意的是,输入的数据 26 为变成了 842403082,原因在于输入数据不符合基本类型数据的格式,从键盘提供的数据是字符的字节码表示方式,若输入 26,只代表 2 和 6 两个字符的字节数据,而不是代表整数 26 的字节码。

若要从键盘得到整数需要先读取字符串,再利用其他方法将字符串转化为整数。
标准输入输出

System.in、System.out、System.err 这 3 个标准输入输流对象定义在 java.lang.System 包中,这 3 个对象在 Java 源程序编译时会被自动加载。
标准输入:标准输入 System.in 是 BufferedInputStream 类的对象,当程序需要从键盘上读入数据时,只需要调用 System.in 的 read()方法即可,该方法从键盘缓冲区读入一个字节的二进制数据,返回以此字节为低位字节,高位字节为 0 的整型数据。
标准输出:标准输出 System.out 是打印输出流 PrintStream 类的对象。PrintStream 类是过滤输出流类 FilterOutputStream 的一个子类,其中定义了向屏幕输出不同类型数据的方法print()和 println()。
标准错误输出:System.err 用于为用户显示错误信息,也是由 PrintStream 类派生出来的错误流。Err 流的作用是使 print()和 println()将信息输出到 err 流并显示在屏幕上,以方便用户使用和调试程序。

【例】输入一串字符显示出来,并显示 System.in 和 System.out 所属的类。

import java.io.*;
class ep10_10{
  public static void main(String args[]){
    try{
      byte a[]=new byte[128]; //设置输入缓冲区
      System.out.print("请输入字符串:");
      int count =System.in.read(a); //读取标准输入输出流
      System.out.println("输入的是:");
      for(int i=0;i<count;i++)
        System.out.print(a[i]+""); //输出数组元素的 ASCII 值
      System.out.println();
      for(int i=0;i<count-2;i++) //不显示回车和换行符
        System.out.print((char)a[i]+""); //按字符方式输出元素
      System.out.println();
      System.out.println("输入的字符个数为:"+count);
      Class InClass=System.in.getClass();
      Class OutClass=System.out.getClass();
      System.out.println("in 所在的类为:"+InClass.toString());
      System.out.println("out 所在的类为:"+OutClass.toString());
    }
    catch(IOException e){}
  }
}

运行结果如所示:

需要注意的是,输入了 3 个字符按回车后,输出的结果显示为 5 个字符。这是由于 Java 中回车被当作两个字符,一个是 ASCⅡ为 13 的回车符,一个是值为 10 的换行符。程序中 getClass()和 ToString()是 Object 类的方法,作用分别是返回当前对象所对应的类和返回当前对象的字符串表示。

(0)

相关推荐

  • Java编程中字节流与字符流IO操作示例

     IO流基本概念 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的对象都是在IO包上 流按操作数据分为两种:字节流和字符流 流按流向分为:输入流,输出流. 字节流的抽象基类:InputStream,OutputStream 字符流的抽象基类:Reader,Writer 注:由这4个类派生出来的子类名称都是以其父类名作为子类名的后缀. 如:InputStream的子类:FileInputStream 如:Reader的子类FileReader 如创建一个F

  • 详解Java中字符流与字节流的区别

    本文为大家分析了Java中字符流与字节流的区别,供大家参考,具体内容如下 1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个"流动的方向",通常可以从中读入一个字节序列的对象被称为输入流:能够向其写入一个字节序列的对象被称为输出流. 2. 字节流 Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据.Java中最基本的两个字节流类是InputStream和Out

  • java使用Socket实现SMTP协议发送邮件

    本文实例为大家分享了java 利用Socket实现SMTP协议发送邮件的具体代码,供大家参考,具体内容如下 package mail; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; impo

  • Java基于Socket实现HTTP下载客户端

    没有借助任何第三方库,完全基于JAVA Socket实现一个最小化的HTTP文件下载客户端.完整的演示如何通过Socket实现下载文件的HTTP请求(request header)发送如何从Socket中接受HTTP响应(Response header, Response body)报文并解析与保存文件内容.如何通过SwingWork实现UI刷新,实时显示下载进度. 首先看一下UI部分: [添加下载]按钮: 点击弹出URL输入框,用户Copy要下载文件URL到输入框以后,点击[OK]按钮即开始

  • Java socket字节流传输示例解析

    本文为大家分享了Java socket字节流传输示例,供大家参考,具体内容如下 服务端server端: package com.yuan.socket; import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * Created by YUAN on 2016-09-17. */ public class TalkServer4Byte { private ServerSocket server; p

  • Java字符流与字节流区别与用法分析

    本文实例讲述了Java字符流与字节流区别与用法.分享给大家供大家参考,具体如下: 字节流与字符流主要的区别是他们的的处理方式 流分类: 1.Java的字节流 InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先. 2.Java的字符流 Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先. InputStream,OutputStream,Reader,writer都是抽象类.所以不能直接new 字节流是最基本的,所有的Inpu

  • java实现一个简单TCPSocket聊天室功能分享

    本文实例为大家分享了java实现TCPSocket聊天室功能的相关代码,供大家参考,具体内容如下 1.TCPserver.java import java.net.*; import java.io.*; import java.util.*; import java.util.concurrent.*; public class TCPserver{ private static final int SERVERPORT = 8888; private ServerSocket MyServe

  • java基于Socket做一个简单下载器

    本文实例为大家分享了java基于Socket制作下载器的过程,及相关代码,供大家参考,具体内容如下 1.首先要建立一个服务器用来处理信息并给客户端传输文件(电脑)  我是用电脑开了一个WIFI,手机连上后使用scoket传输的  SERVERIP要根据自己实际情况更改.端口也可以随便更改0~65535,尽量选大一点 import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.Buf

  • Java Socket编程实现简单的问候服务

    本文实例讲解了Java Socket编程实现简单的问候服务的详细代码,供大家参考,具体内容如下 服务器端: 实现一个最简单的Hello服务,打印输出客户端IP地址到控制台,对任何连接的客户端都会发送一串字符(Hello, Java Socket)然后关闭与客户端连接.等待下一个客户端的连接请求到来. 客户端: 实现一个最简单的Socket连接到Hello服务器端,接受服务器端发送过来的字节数据打印并输出内容到控制台. 关键技巧: 由于JAVA中提供非常多的输入与输出流API,导致很多初学者接触J

  • 网页版在线聊天java Socket实现

    本文为大家分享了一个满足在线网页交流需求的实例,由于java Socket实现的网页版在线聊天功能,供大家参考,具体内容如下 实现步骤: 1.使用awt组件和socket实现简单的单客户端向服务端持续发送消息: 2.结合线程,实现多客户端连接服务端发送消息: 3.实现服务端转发客户端消息至所有客户端,同时在客户端显示: 4.把awt组件生成的窗口界面改成前端jsp或者html展示的界面,java socket实现的客户端改为前端技术实现. 这里首先实现第一步的简单功能,难点在于: 1.没有用过a

随机推荐