`

如何在文件末尾写入新数据,适用JavaNIO

    博客分类:
  • java
 
阅读更多

转:http://stoneli88.iteye.com/blog/891288

在对文件进行写入操作时,我们经常会碰到的一个棘手的问题可能是:如何在一个已经有内容的文件末尾写入新数据而不覆盖掉原来的内容?现在本人介绍以下四种方法:

首先,假设在程序的当前目录中有一个文件“data.txt”,该文件中已经有内容,现在要进行的操作是在data.txt文件末尾定放字符串"Write in the end".

法一:

在FileOutputStream 或者 FileWriter 的构造器中加个参数 “true”,就如:

Java代码  收藏代码
  1. FileOutputStream fos =  new  FileOutputStream( "data.txt" , true );   
  2. //加个参数true表示在文件末尾写入,不加或者加上false表示在文件开头处定入   
  3. fos.write("Write in the end" .getBytes()); //用write(byte[] b)写入字符串   
  4. fos.close();//记得关闭文件流   


或者可以用FileWriter

Java代码  收藏代码
  1. FileWriter fos =  new  FileWriter( "data.txt" , true );  //同样加个参数true   
  2. fos.write("Write in the end" ); //该类有不同于FileOutputStream的write(String s)   
  3. fos.close();  



法二:

利用java.nio.channel包里面的FileChannel类,该类有个position(long newPosition),参数newPosition表示“计算从文件开始的字节数 ”该方法的功能就是把指针位置设置在文件的newPosition处,而文件的末尾我们可以用FileChannel.size()来得到!也就是我们用 position(FileChannel.size())
就可以把指针指向末尾,从而写入新数据,就如:

Java代码  收藏代码
  1.  FileChannel fc =  new  RandomAccessFile( "data.txt" "rw" ).getChannel();  // rw模式   
  2. //必须用RandomAccessFile("data.txt", "rw").getChannel();   
  3. //而不能用FileOutputStream.getChannel   
  4. fc.position(fc.size()); // //把指针移到文件末尾   
  5. fc.write(ByteBuffer.wrap("Write in the end " .getBytes()));  //写入新数据   
  6. fc.close()  
  7. //如果我们硬是要用FileOutputStream.getChannel,可以写成:   
  8. FileChannel fc = new  FileOutputStream( "data.txt" true ).getChannel();  //参数true也必须加上   
  9. fc.position(fc.size());  
  10. fc.write(ByteBuffer.wrap("Write in the end " .getBytes()));  
  11. fc.close();  



法三:

用RandomAccess类的seek(long pos)代替方法二的position(long newPosition),不多讲,看例题:

Java代码  收藏代码
  1. RandomAccessFile rf =  new  RandomAccessFile( "data.txt" "rw" );  
  2. rf.seek(rf.length());    //length()方法,而不是上面的size()   
  3. rf.writeChars("Write in the end" );  //wiriteChars写入字符串,写入的字符串中的每个字符在文件中都是占两个字节,比如write在文件中看到的是 w r i t e 。   


法四:
 
   利用FileChannel的 map(FileChannel.MapMode mode,long position,long size)方法创建一个MappedByteBuffer(内存映射文件),但是可“读/写”的MappedByteBuffer必须通过 RandomAccessFile.getChannel.map()来创建,因为FileChannel.MapMode(文件映射模式的类型)只有三 种:
1,MapMode.READ_ONLY      只读
2,MapMode.READ_WRITE     读/写
3,MapMode.PRIVATE        专用
而我们要在文件末尾写入的话就必须有到“写文件”,也就是要用到MapMode.READ_WRITE ,如果我们用FileInputStream或者FileOutputStream来获取通道的话都是“只读”或者“只写”,就没办法与 MapMode.READ_WRITE 搭配起来,所以我们只能通过RandomAccessFile的"rw"模式来与MapMode.READ_WRITE搭配。
map方法中的参数:
1.mode :根据是按只读、读取/写入或专用(写入时拷贝)来映射文件,分别为 2.FileChannel.MapMode 类        中所定义的 READ_ONLY、READ_WRITE 或 PRIVATE 之一
3.position : 文件中的位置,映射区域从此位置开始;必须为非负数
4.size: 要映射的区域大小;必须为非负数且不大于 Integer.MAX_VALUE
有了position与size这两个参数,我们就可以把position设置为原文件的末尾,然后再写入size字节数
现在让我们一起来看下如何在文件末尾写入:

Java代码  收藏代码
  1. FileChannel fc =    new  RandomAccessFile( "data.txt" , "rw" ).getChannel();  
  2. long  length = fc.size();  //有来设置映射区域的开始位置   
  3. MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_WRITE,length,20 );  
  4. //由于要写入的字符串"Write in the end"占16字节,所以长度设置为20就足够了   
  5. mbb.put("Write in the end" .getBytes());  //写入新数据   

 

分享到:
评论

相关推荐

    java 写文件 java 写文件 java 写文件 java 写文件

    9. **NIO(非阻塞I/O)**:Java NIO API(New IO)提供了一种新的方式来处理I/O,它允许进行非阻塞的读写操作,适用于大文件和高并发的场景。 10. **文件路径**:在Java中,文件路径可以是相对路径或绝对路径。相对...

    java文件读写操作

    在Java编程语言中,文件读写操作是程序与外部数据交互的基本能力。这篇学习笔记将带你初探这个领域,适合新手入门。我们将讨论如何使用Java进行文件的读取、写入以及一些常见的应用场景。 首先,Java提供了java.io...

    基于Java的源码-二进制IO类与文件复制操作实例.zip

    传统IO流的方式通常包括创建一个InputStream来读取源文件,再创建一个OutputStream来写入目标文件,然后使用循环读取和写入数据。 4. **复制文件的步骤**: - 打开源文件的InputStream。 - 创建目标文件的...

    java 文件操作及IO流

    - 如果希望在文件末尾追加内容,可以在创建`FileOutputStream`时传入`true`作为第二个参数,如`new FileOutputStream(file, true)`。 通过以上知识点,我们可以实现对文件的各种操作,包括创建、读取、写入、移动...

    读写文件到指定位置

    - 在读取源文件内容后,你可以选择追加到已有文件末尾,或者覆盖已有内容。如果是追加,可以使用`FileWriter`的构造函数指定`append`参数为`true`。 - 示例代码(追加内容): ```java FileWriter writer = new ...

    java的IO流实现文件复制20190726.zip

    在Java中,我们可以使用InputStream类来读取数据,OutputStream类来写入数据。这两个类都是抽象类,不能直接实例化,但它们有许多子类可以用于不同的输入/输出场景。在文件复制中,我们通常使用FileInputStream和...

    文件的复制

    在Java中,可以利用NIO(New I/O)中的`FileChannel`类和`ByteBuffer`类来进行高效的文件复制。下面将详细介绍这种方法的具体实现。 #### 示例代码解析 以下是一个使用`FileChannel`和`ByteBuffer`进行文件复制的...

    java读写文件的集中方式

    使用`FileWriter`的构造函数可以指定是否在文件末尾追加内容,避免覆盖已有数据。 以上就是Java中常见的文件读写方式,每种方法都有其适用的场景,开发者应根据实际需求选择合适的方法。理解并熟练掌握这些技术...

    JAVA-Degree-ordinal.rar_Java degree

    - **追加模式**:使用`FileWriter`的构造函数设置`true`参数,可以使写入的数据追加到文件末尾,而不是覆盖原有内容。 - **缓冲策略**:大文件读写时,可以使用缓冲区一次性读写大量数据,减少磁盘I/O次数。 8. *...

    java IO操作 (读写、追加、删除、移动、复制) 源码集合

    - **追加模式**:使用`FileWriter`或`PrintWriter`创建时指定`true`作为构造参数,这样写入的内容会被添加到文件末尾,而不会覆盖原有内容。 - **覆盖模式**:默认情况下,`FileWriter`和`PrintWriter`会覆盖现有...

    Java读写文本文件的示例代码.7z

    如果希望在文件末尾追加内容,可以使用`FileWriter`的构造函数中的`append`参数,或者在打开`BufferedWriter`时调用`newLine()`方法。 7. **NIO (非阻塞I/O)** Java NIO (New IO) 是从Java 1.4版本引入的一个新...

    Java语言存取文本文件的研究.zip

    使用readLine()方法逐行读取文件内容,直到返回null表示文件末尾。例如: ```java File file = new File("path_to_file"); BufferedReader reader = new BufferedReader(new FileReader(file)); String line; while...

    java file

    使用循环读取和写出数据,直到文件末尾。这种方法的优点是它可以处理不同类型的文件,只要数据能被读取和写入即可。确保目标文件存在或创建新文件是很重要的步骤。 3. 写文件: - `PrintStreamDemo`方法展示了如何...

    Java之IO流学习总结.pdf

    在Java中,流(Stream)是一个抽象的概念,它代表了一个数据序列,可以是从硬盘、内存、键盘读取数据,也可以向这些地方写入数据。流的机制使得开发者能够灵活地控制数据的流向。 IO流主要分为两大类:字节流(Byte...

    java_IO操作

    - **追加写入**:通过设置`FileOutputStream`的构造函数中的`append`参数为`true`,可以在文件末尾追加内容。 3. **文件操作**: - **创建文件**:使用`File`类的`createNewFile()`方法创建新文件。 - **删除...

    txt文件分割源代码

    `while`循环遍历文件的每一行,每当达到指定的块大小或者文件末尾时,就创建一个新的输出文件并继续写入。 在实际应用中,可以根据需要调整`chunkSize`参数,以满足特定的需求。例如,如果要将文件分割成固定大小的...

    读写文件操作

    在Java编程语言中,文件操作是一项基础且至关重要的任务,无论是读取数据、保存用户配置还是处理日志,都离不开对文件的操作。本篇将详细讲解如何在Java中进行读写文件。 首先,我们从“java读文件”这个主题开始。...

    java实现断点续传

    4. **文件分块读取与写入**:在Java中,使用`java.nio`包的`FileInputStream`和`FileOutputStream`配合`Channels`进行文件的分块读写。通过设置缓冲区大小,可以从特定位置开始读取或写入文件。 5. **记录已下载...

    java IO操作 (读写、追加、删除、移动、复制) 源码集合.pdf

    - **追加模式**:通过在创建 `FileOutputStream` 或 `FileWriter` 时设置 `true` 作为构造函数的第二个参数,可以启用追加模式,使得新写入的内容添加到文件末尾而不是覆盖原有内容。 3. **文件操作**: - **删除...

    java io 系列操作代码练习 Java学习资料

    3. 文件追加:使用FileWriter的append()方法可以在文件末尾添加内容。 4. 文件流的关闭:始终确保在完成操作后关闭流,防止资源泄漏。try-with-resources语句可以简化资源管理。 四、NIO(New IO) Java 1.4引入了...

Global site tag (gtag.js) - Google Analytics