【我的Java笔记】I/O流

I / O流(输入/输出 流)

1.概述:I/O(Input/Output,输入/输出)流提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地。

2.输入/输出模式图解



3. I/O流的作用:设备和设备之间的数据传输(硬盘和内存之间)


4.IO流的分类:

(1)按流的流向分为:

①输入流:读数据

②输出流:写数据

(2)按数据类型分为:

①字节流(字节输入流:InputStream,字节输出流:OutputStream)

②字符流(字符输入流:Reader,字符输出流:Writer)


5.IO流上传和下载图解:




7.OutputStream类和IntputStream类都为抽象类







*注:输入流使用什么方式读取,输出流也应使用此种方式写入,保持一致!!!

(如使用基本字节输入流一次读取一个字节数组,则输出流在写入的时候也应用基本字节输出流写入!)



一、输入流

1.结构图



1.字节输入流(图片、音频、视频文件使用)

(1)基本字节输入流:FileInputStream


1.字节输入流读取数据的两种方式:

(1)一次读取一个字节(模版代码):

int by = 0 ;

while((by=字节输入流对象.read())!=-1){//返回-1表示文件读取完毕

    System.out.print((char)by)

}


(2)一次读取一个字节数组(模版代码):

byte[] bys =new byte[1024] ;//定义缓冲区大小,1024或者1024的倍数

int len = 0 ;//读取字节数的实际长度

while((len=字节输入流对象.read(bys))!=-1){

  System.out.println(new String(bys,0,len));   //从指定的索引开始 (0索引),读取的为实际长度


2.开发步骤:

(1)创建字节/字符输入流对象

(2)读取数据

(3)释放资源


3.FileInputStream构造方法:

public FileInputStream (String name)


4.读取数据的两种方式:

(1)public int read()一次读取一个字节

(2)public int read(byte[] b)一次读取一个字节数组(返回的是实际读取的字节数


例1:(一次读取一个字节)

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputDemo1 {
	public static void main(String[] args) throws IOException {
		
		FileInputStream fis = new FileInputStream("fos.txt"); 
		
		int len = 0;
		while((len = fis.read())!=-1) {
			System.out.print((char)len);
		}
	}
}


例2:(一次读取一个字符数组)

import java.io.FileInputStream;
import java.io.IOException;

public class FileInputDemo {
	public static void main(String[] args) throws IOException {

		FileInputStream fis = new FileInputStream("fos.txt");

		byte[] bys = new byte[1024];
		int len = 0;

		while ((len = fis.read(bys)) != -1) {
			System.out.println(new String(bys, 0, len));
		}
	}
}


5.IO流中文件复制粘贴的操作步骤(详见博客:《IO流_使用IO流进行文件的复制和粘贴):

1.数据源文件-------->输入流-------->读数据

2.目的地文件-------->输出流-------->写数据



(2)高效字节缓冲输入流:BufferedInputStream


注:字节缓冲流不能针对文件进行直接操作
缓冲流只是提供一个缓冲区,针对IO进行实现数据的传输实际是通过底层基本流进行实现的,所以缓冲流不能直接对文件进行操作

1.构造方法:
BufferedInputStream(InputStream in) :指定默认缓冲区大小创建字节缓冲输入流对象





2.字符输入流(文本文件使用)



(1)基本字符输入流:InputStreamReader-------->便捷类:FileReader

1.构造方法:

public InputStreamReader(InputStream in,charset sc)

注:字节输入流+编码格式(例:GBK,UTF-8)


2.方法:

(1)public int read()读取单个字符

(2)public int read(char[] ch)读取一个字符数组



(2)高效字符缓冲输入流:BufferedReader

1.构造方法:
BufferedReader(Reader in) 创建默认缓冲大小

2.特有方法:
(1)public String readLine()一次读取一行 返回为String类型

3.public String readLine():一次读取一行数据
模版代码:

String line = null ;

while((line=字符缓冲输入流对象.readLine())!=null){

  System.out.println(line) ;

}



例:使用BufferedReader中的readLine()方法
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Test1 {
	public static void main(String[] args) throws IOException {
		// 创建输入流对象
		BufferedReader br = new BufferedReader(new FileReader("s.txt"));
		// 使用特有方法每次读取一行
		String str = null;
		while ((str = br.readLine()) != null) {
			System.out.println(str);
		}

		// 释放资源
		br.close();
	}
}







二、输出流

结构图


1.字节输出流

(1)基本字节输出流:FileOutputStream类(OutputStream的子类)

1.构造方法:

public FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流

文件中追加写入数据:public FileOutputStream(File file,boolean append):第二个参数设置为true,表示写入文件的末尾处

该方法本身会抛出异常:IOException


2.输出流中写数据的方法:
  (1)public abstract void write(int b)将指定的字节写入到输出流中
  (2)public void write(byte[] b)将指定的字节数组写入到输出流中
  (3)public void write(byte[] b, int off,int len)将字节数组的一部分写入到输出流中


3.换行符号:

Windows:\r\n

Linux:\n

Mac:\r


4.文本文件输出的开发步骤:

   1) 创建文件输出流对象
   2) 写数据
   3) 关闭资源


例:

/*
 * 输出一个文本文件,并在其中写一句话
 * */

import java.io.FileOutputStream;
import java.io.IOException;

public class OutputStreamDemo {
	public static void main(String[] args) throws IOException {
		// 1)创建输出流对象
		FileOutputStream fos = new FileOutputStream("fos.txt");

		// 2)使用String中的getBytes()方法转为字节 ;
		fos.write("im zilatan".getBytes());

		// 3)释放流资源 public void close()
		fos.close();
		/**
		 * 关闭流资源,关闭了就不能在写数据了 并且该流对象输出完毕之后,不指向这个文件了,所以需要将它关闭掉
		 */

	}
}



例2:write()方法的使用

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamDemo {
	public static void main(String[] args) {
		//创建一个文件输出流对象
		FileOutputStream fos1 = null;
		try {
			fos1 = new FileOutputStream("fos1.txt");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}

		//public void write(byte[] b):将指定的字节数组写入到输出流中
		byte[] bys = {97,98,99,100,101} ;
		try {
			fos1.write(bys) ;
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		//public void write(byte[] b, int off,int len):实际开发中:该方法和读数据一块使用
		try {
			fos1.write(bys, 1, 3) ;
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		//关闭资源
		try {
			fos1.close() ;
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}



例3:换行符和文件末尾追加数据方法的使用

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamDemo2 {
	
	public static void main(String[] args) throws IOException {
		
		//创建一个输出流对象
		FileOutputStream fos = new FileOutputStream("fos3.txt",true) ;
		
		//写数据
		for(int i = 0 ; i <10 ; i ++){
			fos.write(("hello"+i).getBytes()) ;
			//换行符号
			fos.write("\r\n".getBytes());
		}
		
		//关闭资源
		fos.close() ;
	}
}


例4:IO流中加入异常操作(try...catch()...finally...)

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputStreamDemo3 {
	public static void main(String[] args) {
		// 声明一个变量
		FileOutputStream fos = null;

		try {
			fos = new FileOutputStream("fos4.txt");
			// 写数据
			fos.write("im zilatan!".getBytes());
			fos.write("im javier!".getBytes());
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			// 释放资源:由于是流对象,要对流对象做非空判断
			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

	}
}


(2)高效字节缓冲输出流:BufferedOutputStream

注:字节缓冲流不能针对文件进行直接操作
缓冲流只是提供一个缓冲区,针对IO进行实现数据的传输实际是通过底层基本流进行实现的,所以缓冲流不能直接对文件进行操作


1.构造方式:

public BufferedOutputStream(OutputStream out): 默认缓冲区大小(默认缓冲大小已经足够大了)




2.字符输出流


(1)基本字符输出流:OutputStreamWriter------------>便捷类:FileWriter

1.构造方法:

public InputStreamReader(InputStream in,charset sc)

注:字节输入流+编码格式(例:GBK,UTF-8)


2.方法:

(1)public void flush()刷新该流的缓冲

(2)public void write()写入单个字符

(3)public void write(char[] ch)写入一个字符数组

(4)public abstract void write(char[] cbuf,int off,int len):写入字符数组的一部分

(5)public void write(String str)写入字符串

(6)public void write(String str, int off,int len)写字符串的一部分


注: flush()和close()方法的区别
  flush():刷新缓冲区的流,强迫将缓冲字节都写到该流中,刷新之后是可以写数据的.
    close():关闭流对象所指向指向的这个资源文件,一旦关闭,写数据,写不进去的!


(2)高效字符缓冲输出流:BufferedWriter

1.构造方法:
public BufferedWriter(Writer out):创建默认缓冲区大小的一个字符缓冲输出流

2.特有方法:
public void newLine()写入一个换行符号


例:使用BufferedWriter中的特有方法newLine()
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class Test1 {
	public static void main(String[] args) throws IOException {
		// 创建输出流对象
		BufferedWriter bw = new BufferedWriter(new FileWriter("s.txt"));

		bw.write("i am zilatan!");
		// 使用特有方法写入时进行分行
		bw.newLine();
		bw.write("i love inter!");

		// 刷新流
		bw.flush();

		// 释放资源
		bw.close();
	}
}
















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

智能推荐

HTML 表单元素的基本样式

HTML 表单元素的基本样式 原创 ixygj197875 发布于2018-02-22 17:48:53 阅读数 2296 收藏 更新于2018-05-20 15:35:58 分类专栏: 揭秘 CSS 揭秘 CSS 收起 表单元素主要包括 label、input、textarea、select、datalist、******、progress、meter、output等,以及对表单元素进行分组的 ...

php输出语句

php输出语句 常见的输出语句 echo(): 可以一次输出多个值,多个值之间用逗号分隔。echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用。 print(): 函数print()打印一个值(它的参数),如果字符串成功显示则返回true,否则返回false。 print_r(): 可以把字符串和数字简单地打印出来,而数组则以括起来的键和值...

工厂模式

简介 常见的实例化对象模式。 用工厂方法替代new操作的一种模式。 当我们使用new操作实例化对象时,调用构造函数完成初始化。若初始化仅是进行赋值等简单的操作,写入构造函数即可。但如果初始化时需要执行一长串复杂的代码,将多个工作装入一个方法,是不妥的。 创建实例与使用实例分离。将创建实例所需的大量初始化工作从基类的构造函数中分离出去。 简单工厂模式、工厂方法模式针对的是一个产品等级结构;而抽象工厂...

B1105 Spiral Matrix (画图)

B1105 Spiral Matrix (25分) //第一次只拿了21分 矩阵的长和宽,求最大因子,从sqrt(num)开始枚举. 每次循环一次,s++,t--,d--,r++ 测试点四运行超时,是因为输入一个数字的时候,需要直接输出这个数字。//1分 测试点二运行超时,最后一个数字不必再while循环一次,直接输出即可。//3分 最后一个测试点卡了好久/(ㄒoㄒ)/~~ 螺旋矩阵...

Java基础=>String,StringBuffer与StringBuilder的区别

字符串常量池 什么是字符串常量池? JVM为了减少字符串对象的重复创建,其维护了一块特殊的内存,这段内存被称为字符串常量池(存储在方法区中)。 具体实现 当代码中出现字符串时,JVM首先会对其进行检查。 如果字符串常量池中存在相同内容的字符串对象,如果有,则不再创建,直接返回这个对象的地址返回。 如果字符串常量池中不存在相同内容的字符串对象,则创建一个新的字符串对象并放入常量池,并返回新创建的字符...

猜你喜欢

java调用其他java项目的Https接口

项目中是这样的: 用户拿出二维码展示,让机器识别二维码, 机器调用开门的后台系统接口, 然后开门的后台系统接口需要调用管理系统的接口, 管理系统需要判断能不能开门.这两个系统是互相独立的.当时使用http调用是没有问题的.当时后来要求必须用https.废话不说,直接代码: 我的项目中调用的是 HttpsUtils.Get(utlStr) 这个接口 开门系统接口如下图:   管理系统的接口...

Hadoop1.2.1全分布式模式配置

一 集群规划 主机名            IP                               安装的软件 &nbs...

Go语言gin框架的安装

尝试安装了一下gin,把遇到的一些小问题来记录一下 安装步骤 首先来看看官方文档,链接点这里 可以看到安装步骤很简单,就一句话 在命令行中输入这句话运行等待就好。 问题来了,因为墙的问题,go get会很慢,所以命令行里面半天什么反应也没有,不要急,慢慢等着就会看到gin-gonic/gin这个目录出现 这个时候命令行还是没有结束,表示还在下一些东西。有的时候可能心急的人就停了(比如我),然后写个...

uni-app表单组件二

input(输入框) 属性名 类型 说明 平台差异 value String 输入框的初始内容 type String input 的类型 password Boolean(默认false) 是否是密码类型 placeholder String 输入框为空时占位符 placeholder-style String 指定 placeholder 的样式 placeholder-class Strin...

深入理解 JavaScript 代码执行机制

深入理解 JavaScript 代码执行机制 前言 本文仅为个人见解,如有错误的地方欢迎留言区探讨和指正。 1、餐前甜品 如下是一段 JavaScript 代码,如果你毫不犹豫的说出代码执行顺序。那么请直接滚动到底部,留下你的足迹,接受膜拜。如果还不是很确定,那么请往下继续查看。 2、磨刀不误砍柴工(了解浏览器原理) (1) 进程和线程 进程是cpu资源分配的最小单位(是能拥有资源和独立运行的最小...