【问题标题】:seek() method not working with InputStream available() method in javaseek() 方法不适用于 java 中的 InputStream available() 方法
【发布时间】:2021-09-16 09:45:58
【问题描述】:

我正在解决这个 java 问题,我必须写入系统上的文本文件而不修改该文件上的现有文本数据,我使用 randomAceessFile.seek((inputStream.available()+1)); 将指针指向现有数据前 1 个空格,然后我已经使用randomAceessFile.write((newData.trim()).getBytes()); 写入该文件,现在的问题是,在此操作之后文件数据应该在现有数据和添加的新数据之间有空间,但下面的代码只将新数据添加到文件和\00 而不是数据之间的空格。

import java.io.RandomAccessFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class Random{
    public static void main(String[] args) {
        try {
            File file = new File("data.txt");
            InputStream inputStream = new FileInputStream(file);
            RandomAccessFile randomAceessFile = new RandomAccessFile(file, "rw");
            randomAceessFile.seek((inputStream.available()+1));
            String newData = "new data on file";
            randomAceessFile.write((newData.trim()).getBytes());
            randomAceessFile.close();
            inputStream.close();
        } catch (Exception e) {
            System.err.println(e.getCause());
            System.out.println(e.getStackTrace());
            System.out.println(e.getMessage());
        }
    }
}

这个程序给出的输出是

现有数据 \00文件中的新数据

【问题讨论】:

  • 你为什么要为此创建一个单独的输入流?使用available() 不是正确的方法,因为它的返回值不能保证是长度。最好使用RandomAccessFile.length()
  • @MarkRotteveel 谢谢你的建议,其实我是java新手,所以不太了解
  • ' 我正在使用 RandomAccessFile.seek((inputStream.available()+1)); 将指针指向现有数据前 1 个空格':不,你不是。您正在使用它来将指针 1 指向可在没有阻塞的情况下读取的字节数之前的空间。您正在做的是记录在案的available() 滥用。它不返回流中剩余的字节数。请参阅 Javadoc。

标签: java file-handling java-io seek randomaccessfile


【解决方案1】:

零字节是因为您寻求现有长度加一。现有字节编号从 0 到长度为 1,因此您希望精确地查找现有长度。

也就是说,没有在偏移量“现有长度”处专门写入文件,所以你得到一个零字节。

没有人会神奇地插入一个以前没有的空格(0x20 字节)。你需要这样做。这很简单:newData = " new data on file"(并省略对您所写内容的修剪调用)。

也许您之前阅读的内容是在“位置”的意义上使用“空间”这个词?

【讨论】:

  • 感谢 iggy!对于您的回答,实际上,您是对的,我试图仅通过操纵指针位置来写入文件,但忘记在实际数据中留出空间
猜你喜欢
  • 2020-04-25
  • 2017-04-04
  • 1970-01-01
  • 2018-07-19
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多