Java输入输出(二)——具体操作

文本输入输出

  进行文本输出的类是PrintWriter,这个类提供格式化输出字符的功能,它是Writer的子类。类似于System.out的使用,PrintWriter的实例提供了很多类似的输出功能。System.out是PrintStream的实例,PrintStream是OutputStream的子类,因此System.out与PrintWriter的实例处于同等位置,因此具有类似的操作。所不同的是System.out负责字节流输出,而PrintWriter负责字符流输出。

  PrintWriter输出的目的地可以是任何地方,主要取决于与PrintWriter绑定的输出流是什么。

  利用PrintWriter输出到文件:

  PrintWriter out=new PrintWriter(new FileWriter(“file.txt”));

  利用PrintWriter输出到标准输出(屏幕):

  PrintWriter out=new PrintWriter(System.out);

  //PrintWriter有一个以OutputStream对象为参数的构造器

  另外还可以可用流过滤器的组合功能来实现其他的功能,例如加入BufferdWriter来加入缓存机制等。

  文本的读入功能有许多实现方法,例如使用Scanner实例来绑定System.in来实现标准输入的读取。使用BufferedReader绑定一个文件进行读取:

  BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(“file.txt”)));

  同样,Scanner也可以读取文件,BufferedReader也可以读取标准输入,这些功能的实现主要利用了流过滤器的功能,不同的是Scanner可以读取数字,BufferedReader只能读取字符串。

二进制输入输出

  负责写入读取二进制的类主要是DataInputStream和DataoutputStream。这两个类分别实现了DataInput和DataOutput接口。直接读写二进制可以直接将java基本数据类型读入和写出。写入是直接将数据转换为二进制形式保存,读取则是反向操作。例如保存数字1234,文本写入是将其分为4个字符写入,而二进制直接将数字1234的二进制形式写入。这样相对于文本处理速度更快,效率更高。

对象流与序列化

  Java语言支持一种称为对象序列化(object serialization)的非常通用的机制,它可以将任何对象写出到流中,并在之后将其读回。这种机制特别适合应用到分布式环境下传递对象的操作。要实现对象可以被序列化的操作,对象所属的类需要实现序列化接口,即Serializable接口,这种接口中没有任何方法。这一点与Cloneable接口类似,但是为了实现克隆,需要在类中覆盖Object类中的clone方法。

  为了实现对象流的输入输出,需要使用到ObjectInputStream类和ObjectOutputStream类。使用方法如下:

  ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(“employee.data”));

  Employee harry=new Employee();

  Manager boss=new Manager();

  out.write(harry);

  out.write(boss);

  当需要恢复对象是,使用ObjectInputStream类,使用方法如下:

  ObjectInputStream in=new ObjectInputStream(new FileInputSream(“employee.data”));

  Employee e1=(Employee)in.readObject();

  Employee e2=(Employee)in.readObject();

  在序列化对象的情况下,有一种情况是多个对象引用了同一个对象,此时序列化技术在将对象保存时不是将同一个对象保存多次,而是使用了一个称为序列号的编号来指向同一个对象的,相同的对象只保存一次。

操作文件

  在java的文件I/O中,除了流处理之外,还有对文件和目录的处理,即对磁盘文件的操作。在JAVA 7之前的版本中,提供了File类来处理这些操作。在JAVA 7之后提供了Path和Files类来对文件进行操作。Path表示文件或者目录的目录结构。Files提供了很多操作文件的方法,比如文件的移动删除拷贝等方法。同时Files中也提供了可以直接处理文件内容的操作,类似于

  Files.newInputStream(path);

  Files.newOutputStream(path);

  Files.newBufferedReader(path,charset);

  Files.newBufferedWriter(path,charset);

  这些操作可以使用户避免陷入处理各种流处理的情况。另外,Files提供了迭代目录中的文件的方法,walkFileTree,在使用这个方法的时候需要向其中传递一个FileVisitor类型的对象。这个对象中的方法在遇到特定的情况下可以被调用。

内存映射文件

  大多数操作系统都可以利用虚拟内存技术将一个文件或者文件的一部分映射到内存中,这样就可以将文件当做内存中的数组一样访问,加快了文件访问的速度。

  Java中提供了一个抽象类Buffer来与文件进行内存映射。具体的有ByteBuffer,CharBuffer等类可以来实际使用。要使用内存映射机制,需要使用FileChannel类来打开一个通道(Channel),通道是磁盘文件的一个抽象,利用通道可以访问诸如内存映射,文件加锁机制以及文件间快速数据传递等操作系统特性(具体需要操作系统的支持)。

  内存映射的使用方法:

  FileChannel channel=FileChannel.open(path,options);

  MappedByteBuffer buffer =channel.map(FileChannel.MapMode.READ_ONlY,0,length);

正则表达式

  正则表达式是一种处理字符串的机制,可以通过描述一种模式来与字符串进行匹配。关于正则表达式这里不详细描述,这里主要描述java中正则表达式的使用:

  Pattern pattern=Pattern.compile(pattern);

  Matcher matcher=pattern.matcher(input);

  Matcher.matchs()返回true用来表示输入字符串匹配了要求的模式,Matcher.find()返回true用来表示输入字符串中有满足模式匹配的子字符串。其中input可以是任意实现了CharSequence接口的类的对象,例如String,StringBuilder,CharBuffer等。

  Matcher类提供start和end方法,用来返回匹配的子字符串在输入字符串中的位置。类似于迭代器的使用,使用这两个方法获取下一个匹配子字符串时需要使用一次find()方法。

时间: 2024-12-24 13:28:35

Java输入输出(二)——具体操作的相关文章

Java I/O流操作(二)---缓冲流[转]

转自:http://blog.csdn.net/johnny901114/article/details/8710403 一.BufferWriter类 IO的缓冲区的存在就是为了提高效率,把要操作的数据放进缓冲区,然后一次性把缓冲区的内容写到目的地,而不是写一次就往目的地写一次. 在这里要注意的是当我们关闭了缓冲区对象实际也关闭了与缓冲区关联的流对象. BufferWriter类 try { FileWriter fw =new FileWriter("test.txt"); //使

Java对数组的操作(二)——集合与数组的切换

在Java开发中经常遇见集合与数组的互相切换,怎样实现呢,呵呵呵,非常easy: import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; public class Test { /** * 将Set集合转换为数组 * * @author GaoHuanjie */ private static void s

java: Comparable比较器,定义二叉操作类

//定义二叉操作类 class BinaryTree{ class Node{ private Node left; //左指数 private Node right; //右指数 private Comparable data; public Node(Comparable<?> data) { this.data = data; } //二叉数据比较,大的放在右边,小的放在左边 public void addNode(Node newNode) { //放在左边 if( newNode.d

HBase的java客户端测试(二)---DML操作

测试准备 [首先同步时间:] for node in CloudDeskTop master01 master02 slave01 slave02 slave03;do ssh $node "date -s '2017-12-30 21:32:30'";done [slave各节点启动zookeeper集群:] cd /software/zookeeper-3.4.10/bin/ && ./zkServer.sh start && cd - &&

Java 输入输出(一)——流

Java输入输出大致可以分为两类,流式操作与非流式操作,流式操作主要关注与文件内容的读写,非流式操作主要用于文件在磁盘上的管理.下面首先学习流式数据操作. 流 与c++类似,java中也提供了流的概念来处理输入输出(I/O).Java中,可以从其中读入一个字节序列的对象称为输入流,可以向其中写入一个字节序列的对象称为输出流.输入输出流都是对象,这一类对象需要绑定特定的字节来源和目的地,可以是标准输入输出(键盘和屏幕),文件或者网络,甚至可以是内存块. 抽象类InputStream和OutputS

Java实验二实验报告:java面向对象程序设计

java实验二实验报告 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2.完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等).解决办法(空洞的方法如“查网络”.“问

[Java面试二]Java基础知识精华部分.

一:java概述(快速浏览): 1991 年Sun公司的James Gosling等人开始开发名称为 Oak 的语言,希望用于控制嵌入在有线电视交换盒.PDA等的微处理器: 1994年将Oak语言更名为Java: Java的三种技术架构: JAVAEE:Java Platform Enterprise Edition,开发企业环境下的应用程序,主要针对web程序开发: JAVASE:Java Platform Standard Edition,完成桌面应用程序的开发,是其它两者的基础: JAVA

java生成Excel及操作Excel

JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表.因为它是使用Java编写的,所以我们在Web应用中可以通过JSP.Servlet来调用API实现对Excel数据表的访问. 下载: 官方网站 http://www.andykhan.com/jexcelapi/ 下载最新版本(本人下的是jexcelapi_2_6

Java学习:二 基础

2014 - 5 - 22 上午 Java对大小写敏感. 点号(.)用于调用方法,Java的能用语法是: object.method(parameters); Java中的常量声明使用final关键字.且仅能赋值一次.习惯上,常量名大写. 可使用static final 定义一个类常量,以便在一个类中的多个方法中使用. 类常量定义在main方法外部,以便同一类其它方法可以使用.若使用public关键字,则其它类的方法也可以使用此常量. 字符串: Java中,允许使用+号拼接两个字符串. Java

Java进阶(二十五)Java连接mysql数据库(底层实现)

Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜索.特将之前使用的方法做一简单的总结.也能够在底层理解一下连接数据库的具体步骤. 实现 首先需要导入相关的jar包,我使用的为:mysql-connector-java-5.1.7-bin.jar. 下面来看一下我所使用的数据库连接方法类: MysqlUtil.java package cn.edu