java: IO总结篇

一:概念

1.字符,字节,字符集(编码)

字节是内存存储数据的单位,字符则是一种数据。字节是存储容量的基本单位,1字节=8个二进制位,即一个8位的二进制数,是一个很具体的存储空间,如0x01,0xFA。

字符是指字母、数字、汉字和各种符号,如‘1‘,‘中‘,‘#’。一个字符在计算机中用若干个字节的二进制数表示,西文字符1个字节,中文字符2个字节。

字符集(编码):一种标准,规定使用哪些字符,每个字符分别用一个还是多个字节存储,用哪些字节存储;

2.流,字符流与字节流

流:一组有序的数据序列,可以理解为传输通道。Java中的IO流是输入输出流。

如何判断是输入流还是输出流?
以内存为参照物,如果数据是向内存流动是输入流,反之则是输出流。

将输入和输出两个端点看作是两个工厂,工厂之间需要互相运输货物,而流则是两工厂之间的公路,没有公路就不能互相运输,至于字符,字节和二进制则可以看作是运输的方式和单位大小,比如说把二进制理解成三轮车,那么字节就是小卡车,而字符则是更高级的集卡之类的。

字节流可处理所有类型的数据,如MP3,图片,文字,读取时,读到一个字节就返回一个字节;JAVA中字节流对应的类都以“Stream”结尾;

字符流仅可处理纯文本数据,读取时,读到一或多个字节,先查找指定的编码表,然后将查到的字符返回。在AVA中字符流对应的类都以“Reader”或"Writer"结尾;

字符流的底层就是字节流。而字符流主要是读取文本文件内容的,可以一个字符一个字符的读取,也可以一行一行的读取文本文件内容。而字节流读取单位为byte.byte作为计算机存储最基本单位,可以用字节流来读取很多其他格式的文件,比如图片视频等等。基于B/S和C/S的文件传输都可以采用字节流的形式。

二:函数

1.包括在输入输出功能的包Java.io中,所有方法遇到错误时均会抛出IOException异常。

2.java流分为两种流
字节流:可以用于读写二进制文件及任何类型文件byte
字符流:可以用于读写文件文本

字节流:输入(InputStream) 输出(OutputStream)
字符流:输入(Reader)         输出(writer)

Reader类的read()方法返回类型为int :作为整数读取的字符(占两个字节共16位),范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1(表明已成功读取完毕)
inputStream的read()虽然也返回int,但由于此类是面向字节流的,一个字节占8个位,所以返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。因此对于不能用0-255来表示的值就得用字符流来读取!比如说汉字.

3.FileInputStream 是文件输入流,它继承于InputStream。

通常,我们使用FileInputStream从某个文件中获得输入字节。

FileOutputStream 是文件输出流,它继承于OutputStream。

通常,我们使用FileOutputStream 将数据写入 File 或 FileDescriptor 的输出流。

4.带缓存的流

若不指定缓存区大小,默认为分配32个字节。

java.io.BufferedReader和java.io.BufferedWriter类各拥有8192字符的缓冲区。

BufferedReader:一个包装类,它可以包装字符流,将字符流放入缓存里,先把字符读到缓存里,到缓存满了或者你flush的时候,再读入内存,就是为了提供读的效率而设计的。如果缓冲区数据不足,才会再从文件中读取。

BufferedWriter:写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。

5.从标准输入流System.in中直接读取使用者输入时,使用者每输入一个字符,System.in就读取一个字符。为了能一次读取一行使用者的输入,使用了BufferedReader来对使用者输入的字符进行缓冲。readLine()方法会在读取到使用者的换行字符时,再一次将整行字符串传入。

System.in是一个位流,为了转换为字符流,可使用InputStreamReader为其进行字符转换,然后再使用BufferedReader为其增加缓冲功能

三:过程

操作流程

在Java中IO操作也是有相应步骤的,以文件操作为例,主要的操作流程如下:

1 使用File类打开一个文件

2 通过字节流或字符流的子类,指定输出的位置

3 进行读/写操作

4 关闭输入/输出

IO操作属于资源操作,一定要记得关闭

四:常用方法

字节流:

Inputstream:

read(int);

read(byte);

reset();

mark();

skip(long n);//以上三个只对某些子类有用

markSupported();

OutputStream(所有方法均返回void):

write(int);

write(byte);

flush(); //BufferedOutputStream中的方法,用来刷新内存,将内存中的数据立刻写出。

close();

字符流:

BufferedReader:

读取单个字符

read();//读取单个字符

readLine();//读取一个文本行,返回为字符串,无数据则返回null

BufferedWriter:

write();

flush();

newLine(); //写入一个行分隔符

五:代码

一:字节流

1.字节流的读入,写出,拷贝

其中用到字符串与字节数组的互相转化:

getBytes():将一个字符串转化为一个字节数组byte[]:getBytes(“utf-8”);

//FileInputStream
import java.io.FileInputstream;
import java.io.IOException;
import java.io.FileNotFoundException;

public class ReadByteStream{
   public static void main(String args[]){
     //File类打开要读入的数据
     FileInputStream fis = new FileInputStream("text.txt");//使用一个相对路径

     //调用read方法来读入字节流到字节数组中,首先创建字节数组:
     Byte input = new Byte[20];
     fis.read(input);

     //由于所读取内容为文本,转化为字符串
     String inputString = new String(input); //后面可以指定编码方式

     System.out.println("inputString");
  }
}
//FileOutputStream 

import java.io.FileOutputstream;
import java.io.IOException;
import java.io.FileNotFoundException;

public class WriteByteStream{
   public static void main(String args[]){

      //指定写出的文件夹
      FileOutputStream fos = new FileOutputStream("text.txt");

      //调用write方法,首先要有待写入的数据      String outputString = "lalala啦啦啦123";

      //可以直接从当前的字符串中获得字节数组      byte output[] = outputString.getBytes("UTF-8");//调用getbytes()方法
      fos.write(output);
  }
}
//字节流的拷贝

//打开要拷贝的文件
 FileInputStream fis = new  FileInputStream (“1.txt”);
 FileOutputStream fos = new  FileOutputStream ("copy1.txt");

//调用方法

//定义字节数组:为避免数组过小,造成拷贝不完全,需要循环读取
//read方法返回值为已从文件读取到的数据值;若返回-1,则说明已读到文件末尾

byte input[] = new Byte(50);

while(fis.read(input) != -1)
{
    fos.write(input);

}

//记得关闭
fis.close();
fos.close();

system.out.println("OK!");

2.带有缓冲的字节流的读入,写出(文件容量大时高效)

//1.使用带缓冲区的字节流来进行读入,拷贝

FileInputStream fis = new  FileInputStream("Movio.mp4);//2.从这个文件中获得输入字节

//3.创建一个带缓冲的输入字节流,传入的参数为输入流,即当前的FileInputStream
BufferedInputStream bis = new BufferedInputStream(fis);//12.还可以传入参数:缓冲区大小

//8.进行文件的拷贝:
FileOutputStream fos = new FileOutputStream ("newMovio.mp4);
BufferedoutputStream bos = new BufferedOutputStream(fos);//9.带上缓冲区

//4.调用read方法,首先创建字符数组,文件里的数据就读入到这个数组
byte input[] = new byte(100);

int count = 0;//7.定义整型来统计读入了多少字节

while(bis.read(input) != -1){  5.//依旧使用循环,避免读取不完整
   bos.write(input);//10.写出字节流
     count++;
}

//6.关闭文件时:先打开的后关闭
bis.close();
fis.close();
bos.close();//11.关闭也一样
fos.close();

sysytem.out.println("共读取了:"+count +"次!");

2.1缓冲区做优化:///////////////////////////////////

二:字符流

1.使用字符流读写数据

六:争议

字节流在操作的时候本身是不会用到缓冲区(内存)的,是与文件本身直接操作的,而字符流在操作的时候是使用到缓冲区的

字节流在操作文件时,即使不关闭资源(close方法),文件也能输出,但是如果字符流不使用close方法的话,则不会输出任何内容,说明字符流用的是缓冲区,并且可以使用flush方法强制进行刷新缓冲区,这时才能在不close的情况下输出内容

时间: 2024-11-06 23:38:19

java: IO总结篇的相关文章

第11篇-JAVA IO

第11篇-JAVA IO 每篇一句 :不要在失败时才想起别人的忠告,不要在失去之后才想起珍惜 初学心得: 环境越艰难,越会出聪明人 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-04-17| JAVA IO流 ] 1.流概念 流是指一连串流动的字符,是以先进先出方式发送信息的通道 即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作 2.JAVA IO流 Java的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输

【基本功】之Java IO (基本功系列第一篇)

Java IO 是最常用的基本功,必须扎实,初学者切记,莫要停留在能看懂程序,一定要闭着眼睛都能写出来,做到游刃有余. 我就是属于那种,认为这有什么难的,不就这样,然后再那样,然后记得close就行了嘛,还要try catch什么的…… 等到离开书本自己写就犯难了,咦?那个怎么写来着?是哪个Stream来着? 凡此种种,不一而足. 下面进入正题 ============================我是分割线================================= 基本的就不说了,随

Java IO流 探险

Java的IO流使用了一种装饰器设计模式,它将IO流分为底层节点流和上层处理流.本篇重点在如何访问文件与目录.如何以二进制格式和文本格式来读写数据.对象序列化机制.还有Java7的"NIO.2". 装饰设计模式:当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能.那么自定义的该类称为装饰类. 装饰类通常会通过构造方法接收被装饰的对象.并基于被装饰的对象的功能,提供更强的功能. IO的方式通常分为:BIO(同步阻塞).NIO(同步非阻塞).AIO

Play生产模式下java.io.FileNotFoundException那点事

之前”用Scala+Play构建地理数据查询接口”那篇文章里,用到的数据是json格式的文本文件area.json,存放在conf/jsons文件夹下.最开始是放在public/文件夹下,在线上准生产模式下运行: activator dist 得到mosquito-1.0.zip压缩包,解压后: 去/bin目录下运行mosquito脚本报错: java.io.FileNotFoundException 然后就去解压的mosquito-1.0/看发现并没有public文件夹,由此可见public文

JAVA IO 总结

关于 java io 主要是 对 文件 的输入和 输出 方面的东西,因此,我进行系统的学习 主要有这几个 关键的类 File   FileInputStream   FileOutputStream   InputStreamReader   OutputStreamWriter  BufferedReader BufferedWriter  BufferedInputStream  BufferedOutputStream 以下我坐下详细的介绍: File 类是最基本的 文件类 可以获取文件的

Java IO详解(三)------字节输入输出流

File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocean/p/6854098.html 那么这篇博客我们讲的是字节输入输出流:InputStream.OutputSteam(下图红色长方形框内),红色椭圆框内是其典型实现(FileInputSteam.FileOutStream)  1.字节输出流:OutputStream public abstrac

java io --- Reader类

在前几篇文章中一直讲的都是InputStream,这是操作字节流的类,然而我们在程序中往往要从文件等stream中读取字符信息,如果只用InputStream能否读取字符信息呢?当然可以.但是这涉及到了一个编码和解码的问题,传输双方必须才用同一种编码方式才能正确接收,这就导致每次在传输时,传输方需要做这么几件事: 1)将需要传输的字符编码成指定字节 2)传输字节 接收方需要做这么几件事: 1)接收字节 2)将字节解码成对应的字符 我们看一下下面的例子: 我在对应目录有一个文件,这个文件是按照ut

hadoop错误Could not obtain block blk_XXX_YYY from any node:java.io.IOException:No live nodes contain current block

错误: 10/12/08 20:10:31 INFO hdfs.DFSClient: Could not obtain block blk_XXXXXXXXXXXXXXXXXXXXXX_YYYYYYYY from any node: java.io.IOException: No live nodes contain current block. Will get new block locations from namenode and retry 原因: Datanode 有一个同时处理文件

Java IO: 文件

原文链接  作者: Jakob Jenkov  译者: 李璟([email protected]) 在Java应用程序中,文件是一种常用的数据源或者存储数据的媒介.所以这一小节将会对Java中文件的使用做一个简短的概述.这篇文章不会对每一个技术细节都做出解释,而是会针对文件存取的方法提供给你一些必要的知识点.在之后的文章中,将会更加详细地描述这些方法或者类,包括方法示例等等. 通过Java IO读文件 如果你需要在不同端之间读取文件,你可以根据该文件是二进制文件还是文本文件来选择使用FileIn