文件:文本文件是一种计算机文件,它是一种典型的顺序文件,其文件的逻辑结构又属于流式文件,特别的是指以ASCLL码方式(也称为文本方式)存储的文件,而更确切地说,英文、数字等字符存储的是ASCLL码,而汉字存储的是本机码。文本文件中除了存储文件有效字信息(包括能用ASALL码字符表示的回车、换行等信息)外,不能存储其它任何信息,

计算机的存储在物理上是二进制的所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上。这两者只是在编码层次上有差异。

字节数组与字符串相互转换需要考虑编码

数据流:数据传输抽象表示为“流”,程序允许通过流的方式与输入输出设备进行数据传输。Java中的“流”都位于java.io包,称为IO(输入输出)流。

按照操作数据的不同,可以分为字节流和字符流,按照数据传输方向的不同又可分为输入流和输出流,程序从输入流中读取数据,向输出流中写入数据。在IO包中,字节流的输入输出流分别用java.io,InputStream和java.io.OutputStream表示,字符流的输入输出流分别用java.io.Reader和java.io.Writer表示

任何数据在底层保存为字节(不可再分)

ISO8859-1(ASCLL码)<=32属于不可见字符

GBK—国家标准

UTF-8 国际标准

1、字节流

  在计算机中所有的文件都是以二进制字节形式存在,在JDk中,提供了两个抽象类InputStream和OutputStream,他们是字节流的顶级父类。

IO流中的输入输出都是相对程序而言的。

InputStream常用方法:

  int read() 从输入流读取一个8位的字节,把它转换为0~255之间的整数,并返回这一整数

  int read(byte[] b)从输入流读取若干字节,把它们保存到参数b指定的字节数组中,返回的整数表示读取字节数

  int read(byte[] b,int off,int len)从输入流读取若干字节,把它们保存到参数b指定的字节数组中,off指定字节数组开始保存数据的起始下标,len表示读取的字节数目

  void close() 关闭此输入流并释放与该流关联的所有系统资源

OutputStream常用方法:

  void write(int b)向输出流写入一个字节

  void write(byte[] b)把参数b指定的字节数组的所有字节写到输出流

  void write(byte[] b,int off.int len)将指定byte数组中从偏移量off开始的len个字节写入输出流

  void flush()刷新此输出流并强制写出所有缓冲的输出字节

  void close()关闭此输出流并释放与此流相关的所有系统资源

注意:flush()方法用来将当前输出流缓冲区(通常是字节数组)中的数据强制写入目标设备,此过程称为刷新。

InputStream和OutputStream是抽象类,不能被实例化。

需要注意的是,在读取文件时,必须保证文件是存在并且可读的,否则会抛出文件找不到的异常FileNotFoundException。

在向一个已经存在的文件中写入数据,那么该文件中的数据首部首相会被清空,再写出新的数据。若希望在已存在的文件内容之后追加新内容,则可使用FileOutputStream的构造函数FileOutputStream(String fileName,boolean append)来创建文件输出流对象,并把append参数的值设置为true。

  

 package stream;

 import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
/**
* 文件输入流
* @author Administrator
*
*/
public class CopyStreamDemo { public static void main(String[] args) {
String srcFile = "F:\\MKing\\workspace\\IOPrj\\src\\stream\\FileInputStreamDemo.java";//目标文件,目录也可以用正斜线“/”表示两个左斜线“\\”
String destFile = "target.txt";//拷贝地址
try {
InputStream is = new FileInputStream(srcFile);
OutputStream os = new FileOutputStream(destFile);
byte[] buffer = new byte[100];
int len = -1; while ((len = is.read(buffer)) != -1) {//直到len的值为-1表示读取到了文件的末尾。结束循环
//System.out.println("Bytes: " + Arrays.toString(buffer)); //String text = new String(buffer, 0, len, "ISO-8859-1");
//System.out.print(text);
os.write(buffer, 0, len);
} is.close();
os.close();
System.out.println("文件复制完成!");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } }

1.1字节流的缓冲区:当通过流的方式拷贝文件时,为了提高效率也可以定义一个字节数组作为缓冲区

 

 package stream;

 import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
/**
* 文件输入流
* @author Administrator
*
*/
public class FileCopy { public static void main(String[] args) {
String srcFile = "F:\\MKing\\eclipse-java-oxygen-3a-win32.zip";
String destFile = "target.zip";
try {
BufferedInputStream is = new BufferedInputStream(new FileInputStream(srcFile));
BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(destFile));
byte[] buffer = new byte[100];
int len = -1;
System.out.println("正在复制文件,请稍候...");
long begin = System.currentTimeMillis();
while ((len = is.read(buffer)) != -1) {没循环一次,就从文件读取若干字节填充字节数组,并通过变量len记住读入数组的字节数,然后从数组的第一个字节开始,
                                将len个字节依次写入文件。循环往复,当len值为-1时,说明已经读到了文件的末尾,循环会结束,整个拷贝过程也就会结束。
//System.out.println("Bytes: " + Arrays.toString(buffer)); //String text = new String(buffer, 0, len, "ISO-8859-1");
//System.out.print(text);
os.write(buffer, 0, len);
} long end = System.currentTimeMillis();
is.close();
os.close();
System.out.println("文件复制完成!耗时:" + (end - begin) + " ms.");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } }

2字符流

字符流也有;两个抽象的顶级父类,分别是Reader和Writer

FileReader和FileWriter用于读写文件,BufferedReader和BufferedWriter是具有缓冲功能的流,它们可以提高读写xiaolv。

 package chars;

 import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.util.Arrays;
/**
* 文件输入流
* @author Administrator
*
*/
public class CopyByCharsDemo { public static void main(String[] args) {
String srcFile = "F:\\MKing\\实验报告.rar";
String destFile = "target.rar";
try {
Reader reader = new FileReader(srcFile);
Writer writer = new FileWriter(destFile);
char[] buffer = new char[100];
int len = -1; while ((len = reader.read(buffer)) != -1) {
writer.write(buffer, 0, len);
} reader.close();
writer.close();
System.out.println("文件复制完成!");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } }
 package chars;

 import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
/**
* 文件Reader
* @author Administrator
*
*/
public class BufferedReaderDemo { public static void main(String[] args) {
String srcFile = "src\\chars\\FileReaderDemo.java";
try {
BufferedReader br = new BufferedReader(new FileReader(srcFile));
String line = null; while ((line = br.readLine()) != null) {//该方法用于一次读取一行文本
System.out.println(line);
} br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } }

转换流:InputStreamReader和OutputStreamWriter,字节和字符之间的转换

 package chars;

 import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
/**
* 输入流Reader
* @author Administrator
*
*/
public class InputStreamReaderDemo { public static void main(String[] args) {
String srcFile = "src\\chars\\FileReaderDemo.java";
try {
Reader is = new InputStreamReader(new FileInputStream(srcFile), "GBK");
char[] buffer = new char[100];
int len = -1; while ((len = is.read(buffer)) != -1) {
String text = new String(buffer, 0, len);
System.out.print(text);
} is.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } }

注意:在转换时,只能针对操作文本文件的字节流进行转换,如果字节流操作的是一张图片,此时转换为字符流就会造成数据丢失。

3ObjectInputStream和ObjectOutputStream

  程序在运行时,会在内存中创建多个对象,然而程序结束后,这些对象便当做垃圾回收了。如果希望永久保存这些对象,则可以将对象转为字节数据写入到硬盘上,这个过程称为对象序列化。为此JDk提供了ObjectOutputStream(对象输出流)来实现对象的序列化。当对象进行序列化时,必须保证该对象实现Serializable接口,否则程序会出现NotSerializableException异常。Serializable接口没有抽象方法,只是一个标志

4DataInputStream和DataOutputStream:存储对象的成员数据,只有读取数据的顺序与写数据的顺序保持一致,才能保证最终数据的正确性

重定向:就是通过各种方法将各种网络请求重新定个方法转到其它位置。

5标准输入输出流

  静态方法:

  void setIn(InputStream in)对标准输入流重定向

  void setOut(PrintStream out)对标准输出流重定向

  void' setErr(PrintStream out)对标准错误流重定向

6FIle类:对文件本身进行一些常规的操作,JDK中提供了一个File类,该类封装了一个路径,并提供了一系列的方法用于操作该路径所指向的文件。

  File内部封装的路径可以指向一个文件,也可以指向一个目录

  构造方法:

  File(String pathname)通过指定的一个字符串类型的文件路径来创建一个新的File对象

  File(String parent, String child)根据指定的一个字符串类型的父路径和一个字符串类型的子路径(包括文件名称)创建一个File对象

  File(File parent,String child)根据指定的File类的父路径和字符串类型的子路径(包括文件名称)创建一个File对象

  常用方法:

  

7RandomAccessFile

  前面介绍的IO流有一个共同的特点,就是只能按照数据的先后顺序读取源设备中数据,或者按照数据的先后顺序向目标设备写入数据。但如果希望从文件的任意位置开始执行读写操作,则字节流和字符流都无法实现。为此,在IO包中,提供了一个类RandomAccessFile,它不属于流类,但具有读写文件数据的功能,可以随机地从文件的任意位置开始执行读写数据的操作。

  构造方法:

  RandomAccessFile(File file,String mode)参数file指定被访问的文件

  RandomAccessFile(String name,String mode)参数name指定被访问文件的路径

  第一个参数指定关联的文件,第二个参数mode指定访问文件的模式。参数mode有四个值,最常用的有两个,分别是“r”和“rw”,其中“r”表示以只读的方式打开文件,如果视图对RandomAccessFile对象执行写入操作,会抛出IOException异常;“rw表示以只读”的方式打开文件,如果该文件不存在,则会自动创建该文件

  常用方法:

  long getFilePointer()返回当前读写指针所处的位置

  void seek(long pos)设定读写指针的位置,与文件开头相隔pos个字节数

  int skipBytes(int n)使读写指针从当前位置开始,跳过n个字节

  void setLength(long newLength)设置此文件的长度

在RandomAccessFile对象中包含了一个记录指针,用于表示文件当前读写处的位置,当新创建一个RandomAccessFile对象时,该对象的文件记录指针位于文件头(也就是0处),当读写了n个字节后,文件的记录指针就会向后移n个字节。RandomAccessFile的seek(long pos)方法,可以使记录指针向前、向后自由移动,通过RandomAccessFIle的getFilePointer()方法,便可获得文件当前记录指针的位置。

8字符编码

在计算机之间,同样无法直接传输一个一个的字符,而只能传输二进制数据

在计算机程序中,如果要把字节数组转换为字符串,可以通过String类的构造方法String(byte[] bytes,Strinf charsetName)把字节数组按照指定的码表解码成字符串(如果没有指定字符码表,则用操作系统默认的字符码表,如中文的Windows系统默认使用的字符码表是GBK);反之,可以通过使用String类中的getBytes(String charsetName)方法把字符串按照指定的码表编码成字节数组。

第五小节之JAVA IO流的更多相关文章

  1. Java IO流详解(五)——缓冲流

    缓冲流也叫高效流,是处理流的一种,即是作用在流上的流.其目的就是加快读取和写入数据的速度. 缓冲流本身并没有IO功能,只是在别的流上加上缓冲效果从而提高了效率.当对文件或其他目标频繁读写或操作效率低, ...

  2. Java IO流题库

    一.    填空题 Java IO流可以分为   节点流   和处理流两大类,其中前者处于IO操作的第一线,所有操作必须通过他们进行. 输入流的唯一目的是提供通往数据的通道,程序可以通过这个通道读取数 ...

  3. Java基础17:Java IO流总结

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  4. Java IO流01-总叙

     Java IO包体系结构图: 1.流式部分――IO的主体部分: 2.非流式部分——主要包含一些辅助流式部分的类,如:File类.RandomAccessFile类和FileDescriptor等类: ...

  5. Java IO流学习

    Java IO流学习 Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是 ...

  6. Java IO流详解(一)——简单介绍

    文件在程序中是以流的形式来传输的.所以用Java来传输文件就得使用到Java IO流. 1.流的概念和作用 流:代表任何有能力产出数据的数据源对象或者是有能力接受数据的接收端对象<Thinkin ...

  7. Java:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

  8. java IO流详解

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  9. Java IO流学习总结

    Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

随机推荐

  1. html_javascript 基础操作

    <!DOCTYPE html> <html> <body> <h1>My Web Page</h1> <p id="demo ...

  2. Edge Detection

      Edge Detection Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22604   Accepted: 5311 ...

  3. 浏览器端-W3School-HTML:HTML DOM Base 对象

    ylbtech-浏览器端-W3School-HTML:HTML DOM Base 对象 1.返回顶部 1. HTML DOM Base 对象 Base 对象 Base 对象代表 HTML 的 base ...

  4. kotlin之数组

    一.使用arrayOf函数定义可以存储任意值的数组 var arr1 = arrayOf(1,2,3,'a') println(arr1[3]) 二.使用arrayOfNulls函数定义数组 var ...

  5. 谈一谈 Android 的安全机制?

    1.Android 是基于 Linux 内核的,因此 Linux 对文件权限的控制同样适用于 Android,在 Android 中每个应用都有自己的/data/data/包名 文件夹,该文件夹只能该 ...

  6. ColorPicker 颜色选择器

    用于颜色选择,支持多种格式. 基础用法 使用 v-model 与 Vue 实例中的一个变量进行双向绑定,绑定的变量需要是字符串类型. <div class="block"&g ...

  7. windows 10 右键菜单 使用vscode打开 快捷键

    呼出菜单栏(鼠标右键或快捷键shift+f10)之后按i 资料: 1.如何为windows 10添加右键context menu item https://stackoverflow.com/ques ...

  8. 阶段3 2.Spring_07.银行转账案例_3 分析事务的问题并编写ConnectionUtils

    不是没有事务造成的 这样相当于有四个connection 每一个都有自己独立的事物 每一个自己成功就提交事务. 已经提交的就执行结束.没有提交的就报异常 让这些操作使用同一个connection 事物 ...

  9. HDP-2.6.0.3

    http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.6.0.3/HDP-2.6.0.3-centos6-rpm.tar.gz ...

  10. zabbix 4.0版本

    Zabbix 4.0 最高版本是4.2 1.什么是zabbix及优缺点(对比cacti和nagios) zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速 ...