Java编程中字节流与字符流IO操作示例

 IO流基本概念
IO流用来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的对象都是在IO包上
流按操作数据分为两种:字节流和字符流
流按流向分为:输入流,输出流。

字节流的抽象基类:InputStream,OutputStream
字符流的抽象基类:Reader,Writer
注:由这4个类派生出来的子类名称都是以其父类名作为子类名的后缀。
如:InputStream的子类:FileInputStream
如:Reader的子类FileReader
如创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件,而且该文件就会被创建到指定目录下,如果该目录下已有同名文件,将被覆盖。
Demo :

package javase.day18; 

import java.io.FileWriter;
import java.io.IOException; 

public class FileWriterDemo { 

  public static void main(String[] args) {
    FileWriter fw=null;
    try {
      fw = new FileWriter("C:\\java_test\\FileWriterTest.txt");
      //调用write 方法,将字符串写入到流中
      fw.write("alex test23");
      //刷新流对象中的缓冲中的数据
      fw.flush();
    } catch (IOException e) {
      e.printStackTrace();
    } finally{
      try {
        if(fw!=null){
            //关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据
            fw.close();
        }
      }catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
} 

package javase.day18; 

import java.io.FileWriter;
import java.io.IOException; 

public class FileWriterDemo { 

  public static void main(String[] args) {
    FileWriter fw=null;
    try {
      fw = new FileWriter("C:\\java_test\\FileWriterTest.txt");
      //调用write 方法,将字符串写入到流中
      fw.write("alex test23");
      //刷新流对象中的缓冲中的数据
      fw.flush();
    } catch (IOException e) {
      e.printStackTrace();
    } finally{
      try {
        if(fw!=null){
            //关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据
            fw.close();
        }
      }catch (IOException e) {
        e.printStackTrace();
      }
    }
  }
}

打印Java文件的源代码Demo code:

package javase.day18; 

import java.io.FileReader;
import java.io.IOException; 

public class FileReaderTest { 

  public static void main(String[] args) {
    try {
      FileReader fr=new FileReader("C:\\java_test\\SystemDemo.java");
      char[] buf=new char[1024];
      int num=0;
      while((num=fr.read(buf))!=-1){
        System.out.println(new String(buf,0,num));
      }
    } catch (IOException e) {
      e.printStackTrace();
    } 

  } 

} 

package javase.day18; 

import java.io.FileReader;
import java.io.IOException; 

public class FileReaderTest { 

  public static void main(String[] args) {
    try {
      FileReader fr=new FileReader("C:\\java_test\\SystemDemo.java");
      char[] buf=new char[1024];
      int num=0;
      while((num=fr.read(buf))!=-1){
        System.out.println(new String(buf,0,num));
      }
    } catch (IOException e) {
      e.printStackTrace();
    } 

  } 

}

复制文件Demo code:
copy_1() 使用的方法是读取一个字符则写入一个字符。
copy_2()使用的方法是把字符一次性读取到一个字符数组中,最后再一次写入到目标文件。

package javase.day18; 

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; 

public class CopyText { 

  public static void main(String[] args) {
    try {
      copy_1();
    } catch (IOException e) {
      e.printStackTrace();
    }
  } 

  public static void copy_1() throws IOException{
    FileWriter fw = new FileWriter("C:\\java_test\\Copy_SystemDemo.java");
    FileReader fr = new FileReader("C:\\java_test\\SystemDemo.java");
    int num=0;
    while((num=fr.read())!=-1){
      fw.write(num);
    }
    fw.close();
    fr.close();
  } 

  public static void copy_2() throws IOException{
    FileWriter fw = new FileWriter("C:\\java_test\\Copy_SystemDemo.java");
    FileReader fr = new FileReader("C:\\java_test\\SystemDemo.java");
    int num=0;
    char[] buf=new char[1024];
    while((num=fr.read(buf))!=-1){
      fw.write(buf,0,num);
    }
    fw.close();
    fr.close();
  } 

} 

package javase.day18; 

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; 

public class CopyText { 

  public static void main(String[] args) {
    try {
      copy_1();
    } catch (IOException e) {
      e.printStackTrace();
    }
  } 

  public static void copy_1() throws IOException{
    FileWriter fw = new FileWriter("C:\\java_test\\Copy_SystemDemo.java");
    FileReader fr = new FileReader("C:\\java_test\\SystemDemo.java");
    int num=0;
    while((num=fr.read())!=-1){
      fw.write(num);
    }
    fw.close();
    fr.close();
  } 

  public static void copy_2() throws IOException{
    FileWriter fw = new FileWriter("C:\\java_test\\Copy_SystemDemo.java");
    FileReader fr = new FileReader("C:\\java_test\\SystemDemo.java");
    int num=0;
    char[] buf=new char[1024];
    while((num=fr.read(buf))!=-1){
      fw.write(buf,0,num);
    }
    fw.close();
    fr.close();
  } 

}

字符流的缓冲区:
缓冲区的出现提高了对数据的读写效率。
对应类:BufferedWriter , BufferedReader .
缓冲区要结合流才可以使用。
在流的基础上对流的功能进行了增强。

IO流操作的基本规律:
1,明确源和目的:
源: 输入流 InputStream , Reader
目的: 输出流 OutputStream ,Writer
2,操作的数据是否是纯文本:
是:字符流
否:字节流
即:(1) 当为输入字符流用Reader
(2) 当为输入字节流用InputStream
(3)当为输出字符流用Writer
(4)当为输出字节流用OutputStream
3,当体系明确后,再明确要使用哪个具体的对象:
源设备:内存,硬盘,键盘
目的设备:内存,硬盘,控制台

IO操作工具类
[1] String fileReaderStringHandle(String fileName)
将文件(由fileName指定)读入到一个字符串;
[2] byte[] fileReaderByteHandle(String fileName)
将文件(由fileName指定)读入到一个字节数组;
[3] void fileWriterHandle(String fileName, String text)
将字符串(由text指定)写出到一个文件(由fileName指定)。
IOUtil.java

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;

public class IOUtil {
  /**
   * 将文件读入到一个String,利用FileReader+BufferedReader(提供readLine方法)
   *
   * @param fileName
   * @return String
   */
  public static String fileReaderStringHandle(String fileName) {
    StringBuilder sb = new StringBuilder();
    try {
      BufferedReader in = new BufferedReader(new FileReader(new File(
         fileName).getAbsoluteFile()));
      try {
       String s;
       while ((s = in.readLine()) != null) {
         sb.append(s);
         sb.append("\n");
       }
      } finally {
       in.close();
      }
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
    return sb.toString();
  }

  /**
   * 使用FileInputStream+BufferedInputStream以byte的方式处理文件
   *
   * @param fileName
   * @return byte[]
   */
  public static byte[] fileReaderByteHandle(String fileName) {
    byte[] data = null;
    try {
      BufferedInputStream bf = new BufferedInputStream(
         new FileInputStream(fileName));
      try {
       data = new byte[bf.available()];
       bf.read(data);

      } finally {
       bf.close();
      }
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
    return data == null ? new byte[] {} : data;
  }

  /**
   * 将指定的text写入到文件名为fileName的文件中
   *
   * @param fileName
   * @param text
   */
  public static void fileWriterHandle(String fileName, String text) {
    try {
      PrintWriter out = new PrintWriter(new File(fileName)
         .getAbsoluteFile());
      try {
       out.print(text);
      } finally {
       out.close();
      }
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }

  public static void main(String[] args) throws IOException {
    System.out.print(fileReaderStringHandle("src/IOUtil.java"));

    for (byte b : fileReaderByteHandle("src/IOUtil.java"))
      System.out.print(b);

    fileWriterHandle("zj.txt",
       fileReaderStringHandle("src/IOUtil.java"));
  }
}
(0)

相关推荐

  • Java字符流与字节流区别与用法分析

    本文实例讲述了Java字符流与字节流区别与用法.分享给大家供大家参考,具体如下: 字节流与字符流主要的区别是他们的的处理方式 流分类: 1.Java的字节流 InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先. 2.Java的字符流 Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先. InputStream,OutputStream,Reader,writer都是抽象类.所以不能直接new 字节流是最基本的,所有的Inpu

  • Java文件(io)编程之文件字符流使用方法详解

    本文实例为大家分享了文件字符流的使用方法,供大家参考,具体内容如下 案例1: 读取一个文件并写入到另一个文件中,char[] 来中转. 首先要在E盘下创建一个文本文档,命名为test.txt,输入一些字符串. public class Demo_5 { public static void main(String[] args) { FileReader fr=null; //文件取出字符流对象(输入流) FileWriter fw=null; //写入到文件(输出流) try { fr=new

  • java字符流缓冲区详解

    本文实例为大家分享了java字符流缓冲区的具体方法,供大家参考,具体内容如下 1. 为什么要缓冲区? 程序频繁地操作一个资源(如文件),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域中,以后直接从此区域中读取数据即可,因为读内存速度比较快,这样提高性能.在IO中引入缓冲区,主要是提高流的读写效率. 2. 缓冲技术的原理? 总的来说,缓冲区就是内存里的一块区域,把数据先存内存里,然后一次性写入,类似数据库的批量操作,这样效率比较高 3. BufferedWriter类

  • 详解Java中字符流与字节流的区别

    本文为大家分析了Java中字符流与字节流的区别,供大家参考,具体内容如下 1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个"流动的方向",通常可以从中读入一个字节序列的对象被称为输入流:能够向其写入一个字节序列的对象被称为输出流. 2. 字节流 Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据.Java中最基本的两个字节流类是InputStream和Out

  • Java 中IO流字符流详解及实例

    Java-IO流 字符流 java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码). 文件是byte byte byte ... 的数据序列. 文本文件是文本(char)序列按照某种编码方案(uft-8.utf-16be.gbk)序列化为byte的存储结果. 字符流(Reader.Writer)-->操作的是文本.文本文件 1.字符的处理,一次处理一个字符 2.字符的底层仍然是基本的字节序列 3.字符流的基本实现: InputStreamReader是字节流通向字符

  • java编程中字节流转换成字符流的实现方法

    java编程中字节流转换成字符流的实现方法 import java.io.*; /*readLine方法是字符流BufferReader类中的方法 * 而键盘录入的方法是字节流InputStream的方法 * 那么能不能将字节流转成字符流再使用字符流缓冲区中的readLine方法呢? * * InputStreamReader类是字节流转向字符流的桥梁.(它本身是一个字符流所以在构造时接受一个字节流) * * */ public class TransStreamDemo { public st

  • Java字符流和字节流对文件操作的区别

    记得当初自己刚开始学习Java的时候,对Java的IO流这一块特别不明白,所以写了这篇随笔希望能对刚开始学习Java的人有所帮助,也方便以后自己查询.Java的IO流分为字符流(Reader,Writer)和字节流(InputStream,OutputStream),字节流顾名思义字节流就是将文件的内容读取到字节数组,然后再输出到另一个文件中.而字符流操作的最小单位则是字符.可以先看一下IO流的概述: 下面首先是通过字符流对文件进行读取和写入: package lib; import java.

  • Java编程中字节流与字符流IO操作示例

     IO流基本概念 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的对象都是在IO包上 流按操作数据分为两种:字节流和字符流 流按流向分为:输入流,输出流. 字节流的抽象基类:InputStream,OutputStream 字符流的抽象基类:Reader,Writer 注:由这4个类派生出来的子类名称都是以其父类名作为子类名的后缀. 如:InputStream的子类:FileInputStream 如:Reader的子类FileReader 如创建一个F

  • Java中字节流和字符流的理解(超精简!)

    目录 引言 字节流和字符流 字节流 字节输入流 字节输出流 字符流 字符输入流 字符输出流 附:字节流和字符流的区别 总结 引言 在完完全全的完成本学期的学习任务之后,终于可以有时间继续更新Java相关的文章了.那么今天我们要学习的是的Java中的IO流(I即为Input,O即为Output),也称为输入流,输出流,其主要的作用是为了能够对文件中的数据进行输入和输出(读和写),更加方便了今后我们在Java道路上的学习,好了,废话不多说,我们开始今天的学习吧! 字节流和字符流 在上图中,橙色部分是

  • Java编程中静态内部类与同步类的写法示例

    java静态内部类 将某个内部类定义为静态类,跟将其他类定义为静态类的方法基本相同,引用规则也基本一致.不过其细节方面仍然有很大的不同.具体来说,主要有如下几个地方要引起各位程序开发人员的注意.     (一)一般情况下,如果一个内部类不是被定义成静态内部类,那么在定义成员变量或者成员方法的时候,是不能够被定义成静态成员变量与静态成员方法的.也就是说,在非静态内部类中不可以声明静态成员.     (二)一般非静态外部类可以随意访问其外部类的成员变量以及方法(包括声明为private的方法),但是

  • java 字节流和字符流的区别详解

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,如图所示. 下面以两个写文件的操作为主进行比较,但是在操作时字节流和字符流的操作完成之后都不关闭输出流. 范例:使用字节流不关闭执行 package org.lxh.demo12.byteiodemo; import java.io.File; import java.io.FileOutp

  • 【Java IO流】字节流和字符流的实例讲解

    字节流和字符流 对于文件必然有读和写的操作,读和写就对应了输入和输出流,流又分成字节和字符流. 1.从对文件的操作来讲,有读和写的操作--也就是输入和输出. 2.从流的流向来讲,有输入和输出之分. 3.从流的内容来讲,有字节和字符之分. 这篇文章先后讲解IO流中的字节流和字符流的输入和输出操作. 一.字节流 1)输入和输出流 首先,字节流要进行读和写,也就是输入和输出,所以它有两个抽象的父类InputStream.OutputStream. InputStream抽象了应用程序读取数据的方式,即

  • Java字节流和字符流及IO流的总结

    从接收输入值说起 在日常的开发应用中,有时候需要直接接收外部设备如键盘等的输入值,而对于这种数据的接收方式,我们一般有三种方法:字节流读取,字符流读取,Scanner 工具类读取. 字节流读取 直接看一个例子: public class Demo01SystemIn { public static void main(String[] args) throws IOException { int a = System.in.read(); System.out.println(a); char

  • Java字节流和字符流总结IO流!

    目录 从接收输入值说起 字节流读取 字符流读取 Scanner 读取 什么是 IO 流 字节流和字符流 字节流 字节输入流 字节输出流 缓冲流的原理 字符流 字符输入流 字符输出流 RandomAccessFile 总结 从接收输入值说起 在日常的开发应用中,有时候需要直接接收外部设备如键盘等的输入值,而对于这种数据的接收方式,我们一般有三种方法:字节流读取,字符流读取,Scanner 工具类读取. 字节流读取 直接看一个例子: public class Demo01SystemIn { pub

  • Java 超详细讲解IO操作字节流与字符流

    目录 IO操作 字节流 FileInputStream FileOutputStream 字节流读写案例 字符流 FileReader FileWriter 字节流与字符流的区别 IO操作 字节流 java.io.InputStream 输入流,主要是用来读取文件内容的. java.io.OutputStream 输出流,主要是用来将内容字节写入文件的. FileInputStream 该流用于从文件读取数据,它的对象可以用关键字 new 来创建. 有多种构造方法可用来创建对象. 可以使用字符串

  • 详解JAVA 字节流和字符流

    1.InputStream 和 Reader InputStream 和 Reader 是所有输入流的抽象基类,本身并不能创建实例来执行输入,但它们将成为所有输入流的模板,所以它们的方法是所有输入流都可使用的方法. 在 InputStream 里包含如下三个方法. int read():从输入流中读取单个字节,返回所读取的字节数据(字节数据可直接转换为int类型). int read(byte[] b):从输入流中最多读取 b.length 个字节的数据,并将其存储在字节数组 b 中,返回实际读

随机推荐