- 浏览: 1152002 次
- 性别:
- 来自: 火星郊区
博客专栏
-
OSGi
浏览量:0
文章分类
- 全部博客 (695)
- 项目管理 (48)
- OSGi (122)
- java (79)
- Vaadin (5)
- RAP (47)
- mysql (40)
- Maven (22)
- SVN (8)
- 孔雀鱼 (10)
- hibernate (9)
- spring (10)
- css (3)
- 年审 (6)
- ant (1)
- jdbc (3)
- FusionCharts (2)
- struts (4)
- 决策分析 (2)
- 生活 (10)
- 架构设计 (5)
- 破解 (2)
- 狼文化 (4)
- JVM (14)
- J2EE (1)
- 应用服务器 (1)
- 我的链接 (5)
- 数学 (2)
- 报表 (1)
- 百科 (6)
- Flex (7)
- log4j (2)
- PHP (1)
- 系统 (2)
- Web前端 (7)
- linux (6)
- Office (1)
- 安全管理 (5)
- python (2)
- dom4j (1)
- 工作流 (3)
- 养生保健 (4)
- Eclipse (8)
- 监控开发 (1)
- 设计 (3)
- CAS (1)
- ZK (41)
- BluePrint (3)
- 工具 (1)
- SWT (7)
- google (2)
- NIO (1)
- 企业文化 (2)
- Windoes (0)
- RCP (7)
- JavaScript (10)
- UML (1)
- 产品经理 (2)
- Velocity (10)
- C (1)
- 单元测试 (1)
- 设计模式 (2)
- 系统分析师 (2)
- 架构 (4)
- 面试 (2)
- 代码走查 (1)
- MongoDB (1)
- 企业流程优化 (1)
- 模式 (1)
- EJB (1)
- Jetty (1)
- Git (13)
- IPV6 (1)
- JQuery (8)
- SSH (1)
- mybatis (10)
- SiteMesh (2)
- JSTL (1)
- veloctiy (1)
- Spring MVC (1)
- struts2 (3)
- Servlet (1)
- 权限管理 (1)
- Java Mina (1)
- java 系统信息 (6)
- OSGi 基础 (3)
- html (1)
- spring--security (6)
- HTML5 (1)
- java爬虫搜索 (1)
- mvc (3)
最新评论
-
Tom.X:
http://osgia.com/
将web容器置于OSGi框架下进行web应用的开发 -
chenyuguxing:
你好, 为什么我的bundle export到felix工程中 ...
在Apache Felix中运行bundle -
string2020:
<niceManifest>true</ni ...
Bundle Plugin for Maven -
jsonmong:
OSGI,是未来的主流,目前已相当成熟。应用OSGI比较好的, ...
基于OSGi的声明式服务 -
zyhui98:
貌似是翻译过来的,有很少人在linux上做开发吧
如何成为“10倍效率”开发者
几个文件读写的工具类:文本文件读写、二进制文件读写、对象读写。其中对象读写工具类有错误,在试图进行多个对象读取时,读第二个对象就抛出异常,这是为什么?此外怎样把一个存放对象的文件中所有的对象读出来?
这个问题已经解决,非常感谢Aguo的文章: 自定义ObjectOutputStream,解决追加写入后,读取错误的问题 。在这篇文章中我找到了答案,同时对作者的源代码添加了一些注解。解决方案请看文章最后。
1、文本文件读写工具类
package mine.util; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /** * 此工具类用于文本文件的读写 * * @author Touch */ public class TextFile { // 读取指定路径文本文件 public static String read(String filePath) { StringBuilder str = new StringBuilder(); BufferedReader in = null; try { in = new BufferedReader(new FileReader(filePath)); String s; try { while ((s = in.readLine()) != null) str.append(s + '\n'); } finally { in.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return str.toString(); } // 写入指定的文本文件,append为true表示追加,false表示重头开始写, //text是要写入的文本字符串,text为null时直接返回 public static void write(String filePath, boolean append, String text) { if (text == null) return; try { BufferedWriter out = new BufferedWriter(new FileWriter(filePath, append)); try { out.write(text); } finally { out.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package mine.util; public class TestTextFile { public static void main(String[] args) { TextFile.write("file/textfile.txt", false, "这是一个文本文件的读写测试\nTouch\n刘海房\n男\n"); TextFile.write("file/textfile.txt", true, "武汉工业学院\n软件工程"); System.out.println(TextFile.read("file/textfile.txt")); } }
2、二进制文件读写工具类
package mine.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /** * 此工具类用于二进制文件的读写 * * @author Touch */ public class BinaryFile { // 把二进制文件读入字节数组,如果没有内容,字节数组为null public static byte[] read(String filePath) { byte[] data = null; try { BufferedInputStream in = new BufferedInputStream( new FileInputStream(filePath)); try { data = new byte[in.available()]; in.read(data); } finally { in.close(); } } catch (IOException e) { e.printStackTrace(); } return data; } // 把字节数组为写入二进制文件,数组为null时直接返回 public static void write(String filePath, byte[] data) { if (data == null) return; try { BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream(filePath)); try { out.write(data); } finally { out.close(); } } catch (IOException e) { e.printStackTrace(); } } }
package mine.util; import java.util.Arrays; public class TestBinaryFile { public static void main(String[] args) { BinaryFile.write("file/binaryfile.dat", new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'a', 'b', 'c' }); byte[] data = BinaryFile.read("file/binaryfile.dat"); System.out.println(Arrays.toString(data)); } }
3、对象读写工具类(有问题,在读取多个对象时有问题,怎样把一个对象文件中的所有对象读出来?)
package mine.util; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; /** * 此类用于对象的读写 * * @author Touch */ public class ObjectFile { // 把一个对象写入文件,isAppend为true表示追加方式写,false表示重新写 public static void write(String filePath, Object o, boolean isAppend) { if (o == null) return; try { ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream(filePath, isAppend)); try { out.writeObject(o); } finally { out.close(); } } catch (IOException e) { e.printStackTrace(); } } // 把一个对象数组写入文件,isAppend为true表示追加方式写,false表示重新写 public static void write(String filePath, Object[] objects, boolean isAppend) { if (objects == null) return; try { ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream(filePath, isAppend)); try { for (Object o : objects) out.writeObject(o); } finally { out.close(); } } catch (IOException e) { e.printStackTrace(); } } // 读取对象,返回一个对象 public static Object read(String filePath) { Object o = null; try { ObjectInputStream in = new ObjectInputStream(new FileInputStream( filePath)); try { o = in.readObject(); } finally { in.close(); } } catch (Exception e) { e.printStackTrace(); } return o; } // 读取对象,返回一个对象数组,count表示要读的对象的个数 public static Object[] read(String filePath, int count) { Object[] objects = new Object[count]; try { ObjectInputStream in = new ObjectInputStream(new FileInputStream( filePath)); try { for (int i = 0; i < count; i++) { //第二次调用in.readObject()就抛出异常,这是为什么? objects[i] = in.readObject(); } } finally { in.close(); } } catch (Exception e) { e.printStackTrace(); } return objects; } }
4、对象读写工具类(解决了3中的问题,能够写入及读取多个对象)
3中到底问题出在哪呢?先来看一段ObjectOutputStream构造方法的源代码,此源代码来自jdk1.6版。
public ObjectOutputStream(OutputStream out) throws IOException { verifySubclass(); bout = new BlockDataOutputStream(out); handles = new HandleTable(10, (float) 3.00); subs = new ReplaceTable(10, (float) 3.00); enableOverride = false; </span><span style="font-size:16px;"><span style="color:#ff0000;">writeStreamHeader(); </span> bout.setBlockDataMode(true); if (extendedDebugInfo) { debugInfoStack = new DebugTraceInfoStack(); } else { debugInfoStack = null; } }
这段代码中我们只需要关注writeStreamHeader(); 方法,这个方法在源代码中的解释是
/** * The writeStreamHeader method is provided so subclasses can append or * prepend their own header to the stream. It writes the magic number and * version to the stream. * * @throws IOException if I/O errors occur while writing to the underlying * stream */
也就是说我们打开(new)一个ObjectOutputStream的时候,这个ObjectOutputStream流中就已经被写入了一些信息,这些信息会写入到我们的文件中。在第一次写入文件时,这些头部信息时需要的,因为ObjectInputStream读的时候会帮我们过滤掉。但是当我们追加写入一个文件时,这些头部信息也会写入文件中,读取的时候只会把文件第一次出现的头部信息过滤掉,并不会把文件中间的头部信息也过滤掉,这就是问题的根源所在。
怎么解决呢?正如lichong_87 提到的
一、可以在每次写入的时候把文件中所有对象读出来,然后重新写入,这种方法效率比较低。
二、如果不是第一次写入文件,在写入时去掉头部信息,怎么去掉呢?头部信息是在writeStreamHeader(); 方法中写入的,所以我们可以通过继承ObjectOutputStream来覆盖这个方法,如果不是第一次写入文件,这个方法什么也不做。
下面是第二种解决方案的源代码及测试
package mine.util.io; import java.io.File; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.OutputStream; /** * 此类继承ObjectOutputStream,重写writeStreamHeader()方法,以实现追加写入时去掉头部信息 */ public class MyObjectOutputStream extends ObjectOutputStream { private static File f; // writeStreamHeader()方法是在ObjectOutputStream的构造方法里调用的 // 由于覆盖后的writeStreamHeader()方法用到了f。如果直接用此构造方法创建 // 一个MyObjectOutputStream对象,那么writeStreamHeader()中的f是空指针 // 因为f还没有初始化。所以这里采用单态模式 private MyObjectOutputStream(OutputStream out, File f) throws IOException, SecurityException { super(out); } // 返回一个MyObjectOutputStream对象,这里保证了new MyObjectOutputStream(out, f) // 之前f已经指向一个File对象 public static MyObjectOutputStream newInstance(File file, OutputStream out) throws IOException { f = file;// 本方法最重要的地方:构建文件对象,两个引用指向同一个文件对象 return new MyObjectOutputStream(out, f); } @Override protected void writeStreamHeader() throws IOException { // 文件不存在或文件为空,此时是第一次写入文件,所以要把头部信息写入。 if (!f.exists() || (f.exists() && f.length() == 0)) { super.writeStreamHeader(); } else { // 不需要做任何事情 } } }
package mine.util.io; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; /** * 此类用于对象的读写 * * @author Touch */ public class ObjectFile { // 把一个对象写入文件,isAppend为true表示追加方式写,false表示重新写 public static void write(String filePath, Object o, boolean isAppend) { if (o == null) return; try { File f = new File(filePath); MyObjectOutputStream out = MyObjectOutputStream.newInstance(f, new FileOutputStream(f, isAppend)); try { out.writeObject(o); } finally { out.close(); } } catch (IOException e) { e.printStackTrace(); } } // 把一个对象数组写入文件,isAppend为true表示追加方式写,false表示重新写 public static void write(String filePath, Object[] objects, boolean isAppend) { if (objects == null) return; try { File f = new File(filePath); MyObjectOutputStream out = MyObjectOutputStream.newInstance(f, new FileOutputStream(f, isAppend)); try { for (Object o : objects) out.writeObject(o); } finally { out.close(); } } catch (IOException e) { e.printStackTrace(); } } // 读取对象,返回一个对象 public static Object read(String filePath) { Object o = null; try { ObjectInputStream in = new ObjectInputStream(new FileInputStream( filePath)); try { o = in.readObject(); } finally { in.close(); } } catch (Exception e) { e.printStackTrace(); } return o; } // 读取对象,返回一个对象数组,count表示要读的对象的个数 public static Object[] read(String filePath, int count) { Object[] objects = new Object[count]; try { ObjectInputStream in = new ObjectInputStream(new FileInputStream( filePath)); try { for (int i = 0; i < count; i++) { objects[i] = in.readObject(); } } finally { in.close(); } } catch (Exception e) { e.printStackTrace(); } return objects; } }
package mine.util.io; import java.io.Serializable; public class TestObjectFile { public static void main(String[] args) { ObjectFile.write("file/t.dat", new Person(), false); ObjectFile.write("file/t.dat", new Person(), true); ObjectFile.write("file/t.dat", new Person[] { new Person("Touch", 1), new Person("Rainbow", 0), new Person() }, true); for (Object o : ObjectFile.read("file/t.dat", 5)) ((Person) o).display(); } } class Person implements Serializable { private static final long serialVersionUID = 1L; private String name = "刘海房"; private int sex = 0; Person(String name, int sex) { this.name = name; this.sex = sex; } Person() { } void display() { System.out.println("my name is :" + name); String s = (sex == 0) ? "男" : "女"; System.out.println("性别:" + s); } }
运行结果:
my name is :刘海房
性别:男
my name is :刘海房
性别:男
my name is :Touch
性别:女
my name is :Rainbow
性别:男
my name is :刘海房
性别:男
发表评论
-
一个例子全部说明java泛型中的K,V,T,E,?,object的意思及其用法
2013-03-07 11:09 70541.意思 jdk中的K,V,T,E等泛型名称很多人以为 ... -
Log4j 把不同包的日志打印到不同位置
2012-11-29 08:23 1153需要的包和测试的代码下载附件! 如果需要将不同的日 ... -
Java多线程发展简史
2012-09-16 14:25 1039转自:http://www.raychase.ne ... -
Java编码易疏忽的十个问题
2012-09-06 08:52 918在Java编码中,我们容易 ... -
网络编程
2012-09-04 13:30 976计算机网络基础 什么是计算机网络 把分布在 ... -
获取Java程序运行的路径 | 获取当前jar包的路径
2012-09-04 11:55 14087经过试验,不管是否是 Jar 包,不管是否是 Tom ... -
java的concurrent用法详解
2012-08-03 11:28 1023我们都知道,在JDK1.5之前,Java中要进行业务并发时 ... -
Java程序员必知的8大排序
2012-07-05 09:56 10308 种排序之间的关系: ... -
Comparator与Comparable的区别
2012-07-05 08:38 1224当需要排序的集合或数组不是单纯的数字类型的时候,通常可以使用C ... -
RSA算法Java实现
2012-06-27 08:22 1419Java代码 package c ... -
队列阻塞浅析
2012-06-17 18:10 936这几天所做的项目中涉及到了队列阻塞机制,通过研究整理如下 ... -
Java面试过程中会遇到的问题
2012-06-13 13:04 11501、abstract的method是否可同时是static,是 ... -
【解惑】深入jar包:从jar包中读取资源文件
2012-06-13 13:02 1105我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等)。 ... -
java 处理文件路径中的空格
2012-06-13 12:57 1542问题背景: windows下有个目录名称Program ... -
java内存分配机制
2012-06-13 12:52 1176通过这几天对一个 ... -
byte[]转化成其他数据类型
2012-05-14 16:41 1666Java与其他语言数据类型之间的转换方法实例程序 /*** ... -
java中byte转换int时为何与0xff进行与运算
2012-05-14 16:39 1075java中byte转换int时为何 ... -
java整型数与网络字节序的 byte[] 数组转换关系
2012-05-14 16:31 6478工作项目需要在 java 和 c/c++ 之间进行 ... -
利用 Base64 缩短 UUID 至22位
2012-04-15 18:57 7185UUID还是比较常用的,尤其在web应用里。 有时在UR ... -
图解Java中的值传递与引用传递(更新版)
2012-04-09 12:49 1187编程的人,都会遇到值传递与引用传递的困惑,不过很快都会迎 ...
相关推荐
主要讲解了System类、Object类、Arrays类、Cloneable接口、IO系统输入输出类及装饰类、IO系统文本读写工具类、IO系统二进制读写工具类、对象序列化工具类、File类及文件搜索工具类、java异常机制及自定义异常类、...
下面我们将详细探讨Java中28个常用的工具类,主要涉及`IO`相关的开发工具。 1. **java.lang.Math**:这个类提供了许多基础数学函数,如求平方根、最大值、最小值、随机数生成等。 2. **java.util.Arrays**:用于...
本篇文章将全面解析Java IO工具类,帮助你理解并掌握其在实际开发中的应用。 一、Java IO基础 Java IO体系主要由流(Stream)组成,分为字节流和字符流两大类,分别处理字节数据和字符数据。字节流包括InputStream...
本篇文章将详细解析Java中常用的工具类,包括字符处理、文件处理、时间操作以及图片处理等方面的知识点。 1. **字符处理**: - `java.lang.String`:String类是Java中最基础也是最常用的数据类型之一,提供了大量...
2. **RandomAccessFile类**:Java提供了`java.io.RandomAccessFile`类来实现文件的随机读写。它可以定位到文件的任意位置进行读写,非常适合处理大文件或需要频繁跳转的场景。使用`RandomAccessFile`时,需要传入...
"Java常用工具类大全,工作5年精心整理.zip"这个压缩包文件很可能包含了一位有经验的Java开发者在五年工作中积累的各种实用工具类,这些工具类能够极大地提高开发效率,简化代码编写。以下是对可能包含的知识点进行...
本篇将详细介绍一些Java中常用的工具类及其应用。 一、`java.util.Arrays` `Arrays`类是Java提供的一组静态方法,用于操作各种类型的数组。它提供了排序、搜索、填充、复制等操作,例如`sort()`用于对数组进行升序...
"java常用工具类整理"这个主题涵盖了Java开发中常用的工具类,这些类在日常编程中非常实用,能大大提高开发效率。这里我们将深入探讨一些常见的Java工具类,并结合`com-jarvis-base`这个文件名,推测这是一个基础...
2. **IOUtils**:Apache Commons IO库提供了一系列处理输入/输出流的方法,便于文件读写操作。 3. **Quoted-Printable解码**:对于包含特殊编码的字符串,需要使用特定方法进行解码,确保字符正确显示。 #### 五、...
在Java编程语言中,工具类(Utility Class)是封装了常用功能的方法集合,方便开发者在项目中快速调用,提高代码复用性。以下是对给定的九个工具类的详细说明: 1. **FileUtils.java**: 文件操作工具类,提供了处理...
这个压缩包“安卓开发框架工具类相关-安卓开发也会经常用到的28个java常用的工具类源码.zip”包含了多个Java工具类,可能涵盖了多个领域,如网络通信、字符串处理、日期时间操作等。以下是对这些工具类的一些常见...
Java IO中的字节流类主要分为两大类:`InputStream`和`OutputStream`。它们是所有字节流类的基类,其他具体子类都直接或间接地继承自这两个类。 - **InputStream 类** - `ByteArrayInputStream`: 提供了一个从...
总结来说,"java常用工具类集合"是一个涵盖了多种实用工具类的资源,包括但不限于字符串处理、集合操作、日期时间、IO操作等多个方面。通过学习和应用这些工具类,开发者能够更高效地编写代码,同时也能从开源社区中...
"Java常用工具类"集合了多种实用工具类,覆盖了数据库交互、数据格式转换、文件操作和电子邮件发送等多个方面。下面将详细阐述这些领域的知识点。 1. **数据库连接**: - JDBC(Java Database Connectivity):...
5. **文件操作工具类**:如FileUtils,提供读写文件、创建目录、复制文件等常用功能,简化了文件操作。 6. **IO流工具类**:如IOUtils,用于处理输入输出流,支持读取、关闭、复制流等操作,防止资源泄露。 7. **...
4. **FileUtil**: 这个工具类通常用于文件和目录的操作,如读写文件、复制、移动、删除、检查文件是否存在等。它可能包含了Apache Commons IO库中的`FileUtils`类,或者开发者自定义的实现。 5. **RandomUtil**: ...
### 深潜数据海洋:Java文件读写全面解析与实战指南 #### 第一章:走进文件流的世界 —— 字节与字符的交响 在Java中,文件读写是通过流来实现的,流是一种从源头到目的地的数据传输通道。Java支持两种基本类型的...
"开发常用工具类"这个主题涵盖了各种不同领域的实用功能,例如字符串处理、日期时间操作、集合操作等。下面将详细介绍这些工具类中的常见知识点: 1. **字符串工具类**: - `StringUtils`:Apache Commons Lang ...
4. **XML读写工具类**: Java标准库中的`javax.xml`包提供了基础的XML处理,但实际开发中更常用的是`DOM`、`SAX`或`JAXB`等解析器。此外,`org.dom4j`或`com.thoughtworks.xstream`等库提供了更便捷的XML操作。 5....