如果要进行文件内容的操作,必须依靠数据流完成,而数据流分为两种:

字节流:InpuStream(字节输入流)、OutputStream(字节输出流)

字符流:Reader(字符输入流)、Writer(字符输出流)

字符比字节处理的多,但使用哪个,基本流程都一样

范例:

创建File类对象,主要是指明要操作的文件路径

通过字节流或字符流的子类为父类实例化

进行文件的读写操作

关闭数据流(close())

字节输出流:OutputStream

字节输出流主要以byte数据为主

输出单个字节:public abstract void write(int b) throws IOException

输出全部字节数组:public void write(byte[] b) throws IOException

输出部分字节数组:public void write(byte[] b, int off, int len) throws IOException  //重点

OutputStream是抽象类,文件的输出操作需要子类FileOutputStream,此类有两个常用构造

构造方法:public FileOutputStream(File file) throws FileNotFoundException  新内容覆盖文件

构造方法:public FileOutputStream(File file, boolean append) throws FileNotFoundException  追加文件内容

范例:实现文件的输出(往文件里写内容)

import java.io.File;

import java.io.FileOutputStream;

import java.io.OutputStream;public classHello{public static voidmain(String[] args) throws Exception {//第一步:定义要输出文件的File类对象

File file = new File("F:" + File.separator + "hello" + File.separator + "Test.txt");//输出信息的时候文件可以不存在,目录必须存在

if(!file.getParentFile().exists()) { //父路径不存在

file.getParentFile().mkdirs(); //创建父路径

}//第二部:利用OutputStream的子类为父类实例化

OutputStream output = newFileOutputStream(file);//第三步:输出文字信息

String msg = "******"; //字符串//为了方便输出,需要将字符串变为字节数组

byte data[] = msg.getBytes(); //变为了字节数组

output.write(data); //输出数据 , 创建了test.TXT,并写入了*****数据

output.close();

}

}

实现只输出部分内容:

import java.io.File;

import java.io.FileOutputStream;

import java.io.OutputStream;public classHello{public static voidmain(String[] args) throws Exception {//第一步:定义要输出文件的File类对象

File file = new File("F:" + File.separator + "hello" + File.separator + "Test.txt");//输出信息的时候文件可以不存在,目录必须存在

if(!file.getParentFile().exists()) { //父路径不存在

file.getParentFile().mkdirs(); //创建父路径

}//第二部:利用OutputStream的子类为父类实例化

OutputStream output = newFileOutputStream(file);//第三步:输出文字信息

String msg = "adfasdfadsfasdfasdfsadfasdf"; //字符串//为了方便输出,需要将字符串变为字节数组

byte data[] = msg.getBytes(); //变为了字节数组

output.write(data, 0, 10); //输出数据 , 从0开始输出10个

output.close();

}

使用循环的方式单个字节的输出

import java.io.File;

import java.io.FileOutputStream;

import java.io.OutputStream;public classHello{public static voidmain(String[] args) throws Exception {//第一步:定义要输出文件的File类对象

File file = new File("F:" + File.separator + "hello" + File.separator + "Test.txt");//输出信息的时候文件可以不存在,目录必须存在

if(!file.getParentFile().exists()) { //父路径不存在

file.getParentFile().mkdirs(); //创建父路径

}//第二部:利用OutputStream的子类为父类实例化

OutputStream output = newFileOutputStream(file);//第三步:输出文字信息

String msg = "adfasdfadsfasdfasdfsadfasdf"; //字符串//为了方便输出,需要将字符串变为字节数组

byte data[] = msg.getBytes(); //变为了字节数组

for(int x = 0; x < data.length; x++) {

output.write(data[x]);//输出数据

}

output.close();

}

}

现在发现每当执行完成后之前的内容都被覆盖了,所以也可以进行数据的追加操作:

范例:追加数据(加入新数据 之前的数据不变 ),第二部加个true

import java.io.File;

import java.io.FileOutputStream;

import java.io.OutputStream;public classHello{public static voidmain(String[] args) throws Exception {//第一步:定义要输出文件的File类对象

File file = new File("F:" + File.separator + "hello" + File.separator + "Test.txt");//输出信息的时候文件可以不存在,目录必须存在

if(!file.getParentFile().exists()) { //父路径不存在

file.getParentFile().mkdirs(); //创建父路径

}//第二部:利用OutputStream的子类为父类实例化

OutputStream output = new FileOutputStream(file, true); //此处为true,表示追加操作//第三步:输出文字信息

String msg = "111adfasdfadsfasdfasdfsadfasdf"; //字符串//为了方便输出,需要将字符串变为字节数组

byte data[] = msg.getBytes(); //变为了字节数组

output.write(data); //输出数据

output.close();

}

}

进行换行操作使用“\r\n”

字节输入流InputStream

可以实现数据读取

三个数据读取方法:

1. 读取单个字节:public abstract int read() throws IOException  //每次执行此方法将读取单个字节的数据,如果已经去取完成了,没数据了,那么最后返回的是-1

2. 读取数据到字节数组中:public int read(byte[]b) throws IOException  //每次讲数据读取到数组中,那么会返回一个读取长度的数据,如果没有数据,返回长度为-1,要考虑两种情况:1.要读取的内容大于开辟数组的内容,长度就是整个数组的长度  2.要读取的内容小于开辟的数组内容,长度就是全部最后的内容长度,数组装不满

3. 读取 部分内容到字节数组:public int read(byte[]b,int off, int len) throws IOException //每次读取内容到部分字节数组,只允许读取满限制的数组的字节个数,此方法依然返回读取的长度。

InputStream是抽象类,所以要进行文件的读取使用FileInputStream子类,子类定义的构造方法:public FileInputStream(File file) throws FileNotFoundException

范例:实现从txt的数据读取

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;public classHello{public static voidmain(String[] args) throws Exception {//第一步:定义要输出文件的File类对象

File file = new File("F:" + File.separator + "hello" + File.separator + "Test.txt");//第二步:实例化InputStream类对象

InputStream input = newFileInputStream(file);//第三步:实现数据读取操作

byte data[] = new byte[1024];int len = input.read(data); //将数据读取到数组中

System.out.println("读取的内容:【" + new String(data,0,len) +"】");//第四步:关闭输入流

input.close();

}

}

read()方法可以实现单个字节数据读取操作,用此方法实现单个字节数据的读取

范例 :读取单个字节”

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;public classHello{public static voidmain(String[] args) throws Exception {

File file= new File("F:" + File.separator + "hello" + File.separator + "Test.txt");

InputStream input= newFileInputStream(file);byte data[] = new byte[1024];int foot = 0; //控制保存的角标索引

int temp = 0; //接收每次保存的数据

do{

temp= (byte)input.read(); //读取出来的数据保存到字节数组中

if(temp != -1) { //现在有数据

data[foot ++] = (byte) temp;

}

}while(temp != -1); //表示后面可能还有数据

System.out.println("读取的内容:【" + new String(data,0,foot) +"】");

input.close();

}

}

以上使用了do...while,实际开发中都用while:

import java.io.File;

import java.io.FileInputStream;

import java.io.InputStream;public classHello{public static voidmain(String[] args) throws Exception {

File file= new File("F:" + File.separator + "hello" + File.separator + "Test.txt");

InputStream input= newFileInputStream(file);byte data[] = new byte[1024];int foot = 0; //控制保存的角标索引

int temp = 0; //接收每次保存的数据

while((temp = input.read())!= -1) {

data[foot++] = (byte)temp;

}

System.out.println("读取的内容:【" + new String(data,0,foot) +"】");

input.close();

}

}

字符输出流:Writer

Writer是进行字符输出操作的抽象类

之所以提供一个Writer类,是因为这个类的输出方法有一个特别好用的:

输出字符串:public void write(String str) throws IOException   //重点

范例:使用Writer输出数据

import java.io.File;

import java.io.FileWriter;

import java.io.Writer;public classHello{public static voidmain(String[] args) throws Exception {

File file= new File("F:" + File.separator + "hello" + File.separator + "Test.txt");if(file.getParentFile().exists()) {

file.getParentFile().mkdirs();

}

Writerout = newFileWriter(file);

String data= "测试数据测试数据测试数据测试数据测试数据";out.write(data); //直接输出字符串

out.close();

}

}

若要追加增加数据,之前的不变:

Writer out = new FileWriter(file, true);

虽然Wirter类提供字符数组的输出操作能力,但本质上讲使用Writer类就意味着要执行字符串的直接输出。

字符输入流:Reader

数据读取:public int read(char[] cbuf) throws IOException

范例:读取数据

import java.io.File;

import java.io.FileReader;

import java.io.Reader;public classHello{public static voidmain(String[] args) throws Exception {

File file= new File("F:" + File.separator + "hello" + File.separator + "Test.txt");if(file.exists()) {

Readerin = newFileReader(file);char data[] = new char[1024];int len = in.read(data); //向字符数组中保存数据,返回长度

System.out.println(new String(data, 0, len));in.close();

}

}

}

Reader与InputStream类相比除了数据类型的差别之外,操作上没有优势

字节流与字符流的区别

这两种流的区别就好比数据库中的BLOB与CLOB区别

CLOB保存大文本数据,都是字符数据

BLOB保存二进制数据,例如:电影、图片、文字,都是字节数据

通过任何终端(网络、文件)读取或者输出的数据都一定是字节,但字符是通过内存处理后的数据。

字符输入:字符输入的时候字节(磁盘)自动转换为字符(内存)

字符输出:字符(内存)自动转换为字节(磁盘)

在利用字符流输出的时候,所有的内容实际上都只是输出到了缓冲区中(内存)。在使用close()关闭的时候会将缓冲区的数据输出,如果不关闭就不发进行输出,此时可以利用flush()进行强制刷新

字符使用到了缓冲区,而字节没有使用到缓冲区。如果处理中文使用字符流,其他任何数据都是用字节流。

综合案例:文件拷贝

是模拟dos系统中的copy命令完成

编写一个文件拷贝程序,可实现任意文件拷贝操作,通过初始化参数输入拷贝的源文件以及拷贝的目标文件路径,本程序暂不考虑类的设计。

dos拷贝命令:“copy 路径1 路径2”

两种实现思路:

思路一:开辟一个数组,将需拷贝的内容读取到数组之中,而后一次性输出到目标路径中

思路二:采用边读边写的方式进行拷贝,不是一次性读取

第一种方式如果文件小没问题,5M左右。如果文件大,基本内存就被沾满了,

范例:初期实现

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;public classCopyDemo {public static voidmain(String[] args) throws Exception {if(args.length != 2) { //参数内容必须是两个,一个源文件路径一个目标文件路径

System.out.println("错误的命令,格式为:CopyDemo 源文件路径 目标文件路径。");

System.exit(1); //退出程序

}//接下来验证源文件是否存在

File inFile = new File(args[0]);if(!inFile.exists()) {

System.out.println("路径错误,请确定源文件路径正确。");

System.exit(1);

}//如果拷贝的目标文件存在,则也不应该进行拷贝

File outFile = new File(args[1]);if(outFile.exists()) { //目标文件已经存在

System.out.println("拷贝的路径文件已经存在,请更换路径。");

System.exit(1);

}long start =System.currentTimeMillis();

InputStreamin = newFileInputStream(inFile);

OutputStreamout = newFileOutputStream(outFile);

copy(in,out); //开始文件拷贝

in.close();out.close();long end =System.currentTimeMillis();

System.out.println("花费的时间:" + (end -start) );

}public static voidcopy(InputStream input, OutputStream output) throws Exception {int temp = 0; //保存每次读取的字节量

while((temp = input.read()) != -1 ) { //每次读取一个字节

output.write(temp);

}

}

}

要先执行以下再输入路径。此种方法只能复制很小的文件。

用数组来提升拷贝性能,可以将数据读取到数组中,而后一次性将数组输出。

修改拷贝方法:

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.InputStream;

import java.io.OutputStream;public classCopyDemo {public static voidmain(String[] args) throws Exception {if(args.length != 2) { //参数内容必须是两个,一个源文件路径一个目标文件路径

System.out.println("错误的命令,格式为:CopyDemo 源文件路径 目标文件路径。");

System.exit(1); //退出程序

}//接下来验证源文件是否存在

File inFile = new File(args[0]);if(!inFile.exists()) {

System.out.println("路径错误,请确定源文件路径正确。");

System.exit(1);

}//如果拷贝的目标文件存在,则也不应该进行拷贝

File outFile = new File(args[1]);if(outFile.exists()) { //目标文件已经存在

System.out.println("拷贝的路径文件已经存在,请更换路径。");

System.exit(1);

}long start =System.currentTimeMillis();

InputStreamin = newFileInputStream(inFile);

OutputStreamout = newFileOutputStream(outFile);

copy(in,out); //开始文件拷贝

in.close();out.close();long end =System.currentTimeMillis();

System.out.println("花费的时间:" + (end -start) );

}public static voidcopy(InputStream input, OutputStream output) throws Exception {int temp = 0; //保存每次读取的字节量

byte data[] = new byte[2048];//数据向数组中读取

while((temp = input.read(data)) != -1 ) { //每次读取一个字节

output.write(data, 0 , temp); //输出数组

}

}

}

特别快。

对于File、InputStream、OutputStream最直接操作就体现在本程序中

java io编程_Java_IO编程相关推荐

  1. java io 网络编程_[笔面] Java IO和网络编程相关面试

    1.网络编程时的同步.异步.阻塞.非阻塞? 同步:函数调用在没得到结果之前,没有调用结果,不返回任何结果. 异步:函数调用在没得到结果之前,没有调用结果,返回状态信息. 阻塞:函数调用在没得到结果之前 ...

  2. 【Java】--面向对象的编程之千锤百炼大总结

     写在前面 包         概述         导入包中的类         静态导入         将类放入包中         包的访问权限控制         常见的系统包   继承   ...

  3. JAVA IO(BIA)总结

    java BIO NIO AIO总结 同步与异步阻塞与非阻塞 一JAVA BIO概述 二JAVA NIO概述 三JAVA AIO概述 四BIONIOAIO适用场景分析 测试代码 BIOServer N ...

  4. Java IO NIO NIO2

    概览 IO是Java中的最重要的一个部分. 其中, java.io是所有编程者都应该掌握的IO方式. 在Java 1.4中, NIO被引入, 它引进了一种新的相对于流模型的新的IO模型, 以为非阻塞I ...

  5. Java IO编程全解(五)——AIO编程

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7794151.html 前面讲到:Java IO编程全解(四)--NIO编程 NIO2.0引入了新的异步通道的 ...

  6. socket编程报异常java.io.EOFException

    socket编程报异常java.io.EOFException 参考文章: (1)socket编程报异常java.io.EOFException (2)https://www.cnblogs.com/ ...

  7. java io nio socket_通过socket编程掌握IO流 —— NIO

    一.本次目标 改造server,采用NIO读取client信息: 改造client,亦采用NIO发送消息,与之前不同的BIO形成对比: 二.编码 1.新建byte数组拼接公共类 主要用作在channe ...

  8. 33.JAVA编程思想——JAVA IO File类

    33.JAVA编程思想--JAVA IO File类 RandomAccessFile用于包括了已知长度记录的文件.以便我们能用 seek()从一条记录移至还有一条:然后读取或改动那些记录. 各记录的 ...

  9. Java IO编程全解(六)——4种I/O的对比与选型

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7804185.html 前面讲到:Java IO编程全解(五)--AIO编程 为了防止由于对一些技术概念和术语 ...

最新文章

  1. LeetCode Python题解(二)----排序
  2. fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  3. 请谈一下Spring MVC的工作原理是怎样的?
  4. 写在前面,白话 Yaf 探秘与深入
  5. 浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP面向切面编程的尝试
  6. ajax post 传参数加引号和不加引号的区别
  7. 【笔试/面试】—— 数组中第二大的数
  8. Linux kernel中网络设备的管理
  9. rust socket 客户端例子
  10. 微信小程序实现视频功能(二):视频列表与下载
  11. 理解“正反馈”和“负反馈”,学会系统性思考
  12. 智伴机器人传销_智伴机器人是传销吗?
  13. python将word文档转图片_如何将word文档转换为图片
  14. DELL EMC Isilon配额Quota
  15. 网渲显示服务器错误,【渲染服务】渲染失败的几种原因
  16. 操作系统---处理器调度
  17. 暴躁兔让Web3与Crypto之路不再迷茫
  18. [python复习8] 数据库mysql操作
  19. 平台经济中国案例研究——网易云平台
  20. linux修改字符集为amer,Linux数据库的创建 导入导出 以及一些基本指令

热门文章

  1. python property作用_python中@property的作用和getter setter的解释
  2. iphone文件怎么上传到服务器,iPhone编程中文件上传到HTTP服务器
  3. 连接linux工具Mtr,Linux常用网络工具:路由扫描之mtr
  4. java struct工作原理_Struts2的工作原理(图解)详解
  5. css如何插入动态图,css动态图(作业)
  6. linux 查看socket fd,linux socket中select()函数以及FD_ZERO FD_SET FD_CLR FD_ISSET
  7. java中广告维护轮播图怎么做_Banner广告轮播图
  8. Windows11电脑锁屏快捷键是什么
  9. mysql数据库赋予权限 版本语法差异
  10. jsplumb拖线_基于jsplumb插件制作可拖拽、保存流程图、重绘保存后的流程图总结...