黑马程序员----【javaSE基础】IO--字节流-程序员宅基地

技术标签: 【JavaSE基础】  javaSE基础  

 ------- android培训java培训、期待与您交流! ----------

一、

流有输入和输出,字节流是说输入和输出的都是字节形式,它们是用来处理非文本文件的,如图片,音频,视频等。
最基础的两个字节流是:InputStream和OutputStream。
InputStream构造方法:
InputStream()  ;
InputStream的常用方法:
abstract int read(); int read(byte[] b); void close();
OutputStream的构造方法:
OutputStream ();
OutputStream的常用方法:
abstract void write(int n); 这里的参数是int型,但是处理的都是字节,记住这里写的是数据n的低八位,也就是一个字节的数据。
void write(byte[] b); void flush(); void close();

二、
InputStream的常用子类:FileInputStream,ObjectInputStream,BufferedInputStream。
1.FileInputStream是文件输入流。流是用来处理输入输出的数据,最基本的方式就是处理硬盘上的文件,FileInputStream就是文件输入流,把数据从文件输入到程序中。
其常用的构造方法有: FileInputStream(File file)  ; FileInputStream(String name)  ;
其常用的方法有: abstract int read(); int  read(byte[] b); void  close();
构造方法有可用之处,但是其他方法和父类一样。
2.BufferedInputStream是缓冲输入流,顾名思义,提供缓冲,增加效率。虽然在父类中,我们用read(byte[] b)方法也可实现缓冲,提高效率,但是BufferedInputStream的使用更方便。另外需要注意的是, BufferedInputStream并不是InputStream的直接子类,它们之间有一个叫FilterInputStream的类,它本身并没有特殊的地方,只是重写父类的方法,但它的子类有许多可取之处。
其常用构造方法: BufferedInputStream(InputStream in)  ;
其常用方法: abstract int read(); int  read(byte[] b); void  close();
它的特殊的地方在于,它的构造方法,需要传入一个字节输入流,而且他本身实现了缓冲技术,所以尽管一些方法和父类一样,但效率会高。
3.ObjectInputStream是对象处理流,它可以直接读一个对象,包括基本对象和引用对象。
其常用构造方法: ObjectInputStream(InputStream in)  ;
其常用方法:
readByte();readChar();等读取基本类型的方法。
String readUTF();这是这个类最精彩的地方,他有一个读取一个字符串的方法,这个方法是输入字节流中唯一的一个能够读取一个字符串的方法。

三、
OutputStream的常用子类:FileOutputStream,ObjectOutputStream,BufferedInputStream,PrintStream。
1. FileOutputStream是文件输出流。把数据从程序输出到文件中。
其常用构造方法:
FileOutputStream ( File  file); FileOutputStream(String name)  ; FileOutputStream(String name, boolean append)  
前两个方法和输入流相似,第三个方法有另一个参数boolean append,其值如果为true,则在文件尾部续写,为false则覆盖文件。
其常用方法: abstract void write(int n);  void write(byte[] b); void flush(); void close();
常用方法和父类相似。
2.BufferedInputStream是输出缓冲流,可以提高效率。他的直接父类也不是OutputStream,中间有一个 FilterOutputStream
其常用构造方法: BufferedOutputStream(OutputStream out)  
其常用方法:void flush()等。
其构造方法需要传入一个字节输出流,其他方法和父类虽和父类相同,但提高了效率。
3.ObjectOutputStream,对象输出流,可以直接处理对象。
其构造方法: ObjectOutputStream(OutputStream out)  
其常用方法:
wirte(byte b);write(int n);等
writeUTF(String s)可以直接输出一个字符串,这也是他最精彩的地方。
4.PrintStream,是输出打印流,他的直接父类也不是 OutputStream,中间有一个 FilterOutputStream
其构造方法: PrintStream ( File  file); PrintStream(OutputStream out)  ; PrintStream(String fileName)  ;
PrintStream(OutputStream out, boolean autoFlush)  这个方法表示,如果第二个参数为true,则自动刷新,不需要flush()。
其常用方法:print(int i);print(char c);print(String s)
println();println(int i);println(char c);println(String s);
这个方法最精彩的地方就是可以方便的输出各种数据。

四、实现数据输入输出的代码,功能实现把一张图片读入程序,再输出到另一个地方,实现复制。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class StreamDemo {
 public static void main(String[] args) {
  FileInputStream fis = null;
  FileOutputStream fos = null;
  try {
   fis = new FileInputStream("D:\\1.jpg");
   fos = new FileOutputStream("D:\\2.jpg");
   copy4(fis,fos);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }finally{
   try {
    fis.close();
    fos.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
 
 public static void copy4(FileInputStream fis,FileOutputStream fos)
   throws IOException{
  BufferedInputStream bis = new BufferedInputStream(fis);
  BufferedOutputStream bos = new BufferedOutputStream(fos);
  int ch = 0;
  while((ch=bis.read()) != -1){
   bos.write(ch);
  }
 }
}

System.in,接受键盘的输入,其类型是InputStream。
System.out,输出到控制台,其类型是PrintStream。
也就是说可以用上面讲过的方法处理System.in和System.out。

 ------- android培训java培训、期待与您交流! ----------

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xin302542363/article/details/9501503

智能推荐

linux gcc-c++等依赖安装以及防火墙基础命令_gcc-c++安装包-程序员宅基地

文章浏览阅读3.5k次,点赞2次,收藏7次。linux gcc-c++等依赖安装以及防火墙基础命令_gcc-c++安装包

sybase安装字符集_sybase12.5添加字符集-程序员宅基地

文章浏览阅读1.6k次。我是在windows环境下安装了一个sybase数据库。1、找到要安装的字符集目录D:\ProgramFiles\sybase12.5\charsets\cp850 ,这个目录是在sybaes的安装目录;sybae默认不会安装所有的字符集,如果你需要的字符集数据库没有安装的话;可以自行进行安装。在cp850同级目录还有许多的其他字符集。2_sybase12.5添加字符集

一文了解路由平台的 Cisco IOS 和 IOS XE 命名约定,看这篇就够了_ios xe system 在哪些设备-程序员宅基地

文章浏览阅读4.9k次。文章目录概述命名约定一致性IOSCisco IOS XE 软件版本 16 和 17IOS XE 软件版本 3SIOS XE Train 标识符物理平台虚拟平台IOS经典Cisco IOS 软件版本 15IOS 经典列车标识符物理平台概述命名约定一致性对某事物进行任何命名约定的全部意义在于使事物保持一致和统一。遵守约定可为专业人员提供基本规则,让他们坚持已知的内容,为现在和未来的员工以及使用思科产品的人员提供清晰简洁的信息。本文概述了Cisco 路由平台的 Cisco IOS 命名约定,包括 IOS _ios xe system 在哪些设备

Nginx反向代理L4后进行keepalived检测_l4的代理-程序员宅基地

文章浏览阅读442次。1、10和11上安装nginx代理12和13和keepalived并配置yum install nginx keepalived -yvim /etc/nginx/nginx.conf末尾添加stream { upstream kube-apiserver { server 10.4.7.12:6443 max_fails=3 fail_timeout=30..._l4的代理

Java后台获取小程序用户信息和登录_java 小程序 后端获得userinfo 2024-程序员宅基地

文章浏览阅读2.1k次。登录请求体public class MiniProgramLoginCommand { private String jsCode; private String encryptedData; private String iv;}核心代码private static final Logger logger = LoggerFactory.getLogger(XX..._java 小程序 后端获得userinfo 2024

HDFS(12)--HDFS的javaAPI操作_java hdfs api filesystem exists-程序员宅基地

文章浏览阅读1.9k次。创建maven工程并导入jar包<repositories><repository><id>cloudera</id><url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>&..._java hdfs api filesystem exists

随便推点

【转载】WPF自定义控件与样式(1)-矢量字体图标(iconfont)_/k.framework.controls;component/resources/#sf2015-程序员宅基地

文章浏览阅读1.4k次。原文地址:http://www.cnblogs.com/anding/p/4961215.html一.图标字体  图标字体在网页开发上运用非常广泛,具体可以网络搜索了解,网页上的运用有很多例子,如Bootstrap。但在C/S程序中使用还不多,字体图标其实就是把矢量图形打包到字体文件里,就像使用一般外置字体一样的使用,因此Winform、WPF中都是可以用的。  在我们多个_/k.framework.controls;component/resources/#sf2015

k8s gcr.io/google-samples/hello-frontend:1.0 镜像无法下载_docker pull gcr.io/google-samples/node-hello:1.0-程序员宅基地

文章浏览阅读2.5k次。Failed to pull image "gcr.io/google-samples/hello-frontend:1.0": rpc error: code = Unknown desc = Error response from daemon: Get https://gcr.io/v2/: net/http: request canceled while waiting for conne..._docker pull gcr.io/google-samples/node-hello:1.0

vector数组的初始化_vector数组初始化-程序员宅基地

文章浏览阅读2.2k次。1.已知元素的初始化vector a={1,2,3,4,5};2.需要输入元素的初始化(1)先将vector中所有元素初始化为0vector a(n)或vector a(n,0)#include<iostream>#include<vector>using namespace std;int main(){ int n; cin >&..._vector数组初始化

二级c语言105道上机题库,微机原理及应用习题105道-程序员宅基地

文章浏览阅读5.3k次。《微机原理与应用》习题1. 求ADDRI开始单元中连续存放的两个双字数据之和,将结果存放在ADDR2开始的单元,并将结果在显示器上显示出来。(假定和不超过双字) 2. 在一个首地址为STR、长度为N的字符串中查找“空格”,找到则向DL中送1,否则向DL中送-1。 3. 将两位十六进制数转换成ASCII码,并送屏幕显示,要求使用顺序结构实现。 4. 使用分支结构实现将1位十六进制数转换成ASCII码..._自1000h单元开始有1000个单字节带符号数

python fabric2.X版本-程序员宅基地

文章浏览阅读998次。2019独角兽企业重金招聘Python工程师标准>>> ..._python通过fabric2可以用rsync吗

DAO设计模式_dao设计模式最广泛-程序员宅基地

文章浏览阅读278次。DAO (Data Access Object,数据访问对象)的主要功能是数据操作,提供多个原子性的DAO操作,如增加、修改、删除等,都于原子性的操作。DAO主要由以下几个部分组成:1.DatabaseConnection:专门负责数据库的打开与关闭操作的类。2.VO:主要由属性、setter、getter方法组成3.DAO:主要定义操作的接口,定义一系列数据库的原子性操_dao设计模式最广泛