标签: randomaccessfile

Java RandomAccessFile从开始截断

我知道如何截断RandomAccess文件,以便删除末尾的字节.

raf.getChannel().truncate(file.length() - 4);
Run Code Online (Sandbox Code Playgroud)

要么

raf.setLength(file.length() - 4);
Run Code Online (Sandbox Code Playgroud)

但是如何以一种开头的字节被删除的方式截断RandomAccessFile?我不需要将此文件的内容写入新文件.我用Google搜索,无法找到答案.请帮忙.提前致谢.

java java-io randomaccessfile

5
推荐指数
1
解决办法
2457
查看次数

如何正确关闭MappedByteBuffer?

这是我正在运行的代码:

import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

public class Main {
    public static void main(String[] args) throws Exception {
        String filePath = "D:/temp/file";
        RandomAccessFile file = new RandomAccessFile(filePath, "rw");

        try {
            MappedByteBuffer buffer = file.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 128);

            // Do something
            buffer.putInt(4);
        } finally {
            file.close();
            System.out.println("File closed");
        }

        System.out.println("Press any key...");
        System.in.read();

        System.out.println("Finished");
    }
}
Run Code Online (Sandbox Code Playgroud)

在按下某个键之前,我正在尝试在FAR Manager中手动删除该文件.但FAR说该文件被锁定:

 The process cannot access the file because it is being used by another process.
                     Cannot delete the file
                         D:\temp\file
                    Object is being opened …
Run Code Online (Sandbox Code Playgroud)

java randomaccessfile mappedbytebuffer java-9

5
推荐指数
2
解决办法
2289
查看次数

从Java中的多个文件读取分散的数据

我正在为DNG / TIFF文件编写读写器。一般而言FileInputStream,有几种处理文件的选项(FileChannelRandomAccessFile),我不知道哪个策略是适合我的需要。

DNG / TIFF文件由以下内容组成:

  • 一些(5-20​​)小块(几十到一百个字节)
  • 很少(1-3)个连续的大图像数据块(最大100 MiB)
  • 几个(也许20-50个)非常小的块(4-16个字节)

整个文件的大小范围从15 MiB(压缩的14位原始数据)到大约100 MiB(未压缩的浮点数据)。要处理的文件数为50-400。

有两种使用模式:

  1. 从所有文件中读取所有元数据(图像数据以外的所有数据)
  2. 从所有文件读取所有图像数据

我目前正在使用,FileChannel并执行map()来获取MappedByteBuffer覆盖整个文件的信息。如果我只想读取元数据,这似乎很浪费。另一个问题是释放映射的内存:当我四处传递映射缓冲区的切片以进行解析等时,底层MappedByteBuffer将不会收集。

我现在决定FileChannel使用几种read()方法复制较小的块,并仅映射大的原始数据区域。缺点是读取单个值似乎非常复杂,因为没有readShort()诸如此类:

short readShort(long offset) throws IOException, InterruptedException {
    return read(offset, Short.BYTES).getShort();
}

ByteBuffer read(long offset, long byteCount) throws IOException, InterruptedException {
    ByteBuffer buffer = ByteBuffer.allocate(Math.toIntExact(byteCount));
    buffer.order(GenericTiffFileReader.this.byteOrder);
    GenericTiffFileReader.this.readInto(buffer, offset);
    return buffer;
}

private void readInto(ByteBuffer buffer, long startOffset)
        throws IOException, InterruptedException {

    long offset …
Run Code Online (Sandbox Code Playgroud)

java filechannel memory-mapped-files randomaccessfile

5
推荐指数
1
解决办法
303
查看次数

使用Bytebuffer写出的返回与简单的写出不同

我正在尝试将字节数据写入文件并进行优化,我希望减少写入文件的次数.

目前,我正在使用:

try (RandomAccessFile out = new RandomAccessFile(file, "rw")) {

    for(int i = 0; i < totalPkts; i++) {
        out.writeInt(data.get(i));
    }
}
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作,但由于有很多out.write调用,所以速度很慢.

所以相反,我试图用a ByteBuffer来代替:

try (RandomAccessFile out = new RandomAccessFile(file, "rw")) {
    ByteBuffer buffer = ByteBuffer.allocate(totalPkts*4); // prevent BufferOverflow

    for(int i = 0; i < totalPkts; i++) {
        buffer.putInt(data.get(i));
    }
    out.write(buffer.array());
}
Run Code Online (Sandbox Code Playgroud)

这两种方法生成的文件大小不同.该ByteBuffer文件几乎比普通输出文件大整整mb.这可以解释为什么差异会说他们不一样.

我尝试使用DataOutputStream,结果是一样的.使用的文件ByteBuffer仍然比不使用的文件大约1mb ByteBuffer.

java bytebuffer randomaccessfile

4
推荐指数
1
解决办法
4168
查看次数

知道偏移量和长度后,如何从文件中获取特定字节?

我有一个文件,文件的前4个字节是魔术,如LOL .我怎样才能获得这些数据?

我想象它会是这样的:

byte[] magic = new byte[4];
RandomAccessFile raf = new RandomAccessFile(file, "rw");
raf.read(magic, 0, magic.length);
System.out.println(new String(magic));
Run Code Online (Sandbox Code Playgroud)

输出:

LOL

可悲的是,这对我不起作用.我找不到获取特定值的方法.

有没有人看到任何方法来解决这个问题?

java byte randomaccessfile

3
推荐指数
1
解决办法
2836
查看次数

什么是 stdin 以及它如何与 fscanf 一起使用?

我不明白 stdin 和 fscanf 之间的联系

struct musteri{
    int no;
    char name[40];
    char surname[25];
    double arrear;

};



 int main() {

    struct musteri hesapBilgi={0,"","",0.0};

    FILE *ptr;
    if((ptr=fopen("eleman.txt","r+"))==NULL){
        printf("error");
    }

    else{
        printf("\n enter a no if you want exit enter 0 -->");   
        scanf("%d",&hesapBilgi.no); 
Run Code Online (Sandbox Code Playgroud)

scanf 接受输入并将 no 放入 sturct musteri

while(hesapBilgi.hesapno !=0){


            printf("enter a surname name and arrear --->"); 
            fscanf(stdin,"%s%s%lf",hesapBilgi.surname,hesapBilgi.name,&hesapBilgi.arrear);
Run Code Online (Sandbox Code Playgroud)

在这里 fscanf 读取文件中的数据吗?或者其他事情正在发生?

        fseek(ptr,(hesapBilgi.no-1)*,sizeof(struct musteri),SEEK_SET); 
Run Code Online (Sandbox Code Playgroud)

fseek 在做什么?

        fwrite(&hesapBilgi,sizeof(struct musteri),1,ptr);

        printf("enter a no :");
        scanf("%d",&hesapBilgi.no);


    }
    fclose(ptr);
}


return 0;
Run Code Online (Sandbox Code Playgroud)

}

c stdin file scanf randomaccessfile

3
推荐指数
1
解决办法
9774
查看次数

获取文本文件中行的字节偏移量?

我有一个像文本文件

one
two
three
four
five
Run Code Online (Sandbox Code Playgroud)

我需要获取文件中每一行的偏移量.我如何用Java做到这一点?

我搜索了一些I/O库(如BufferedReader和RandomAccessFile)但我无法找到满意的答案.

任何人都可以建议如何处理这个?

java offset bufferedreader randomaccessfile

2
推荐指数
1
解决办法
4955
查看次数

RandomAccessFile 类如何使用 randomAccessFile.read() 方法返回字节;

我正在使用谷歌翻译器,我希望这个问题很好理解。

有一件事我不了解随机访问文件。不了解该程序的工作原理,但它可以工作。

这是我的程序:

// ---------------------------------------------
RandomAccessFile RandomAccessFile = new RandomAccessFile ( " pathfile ", " r");

byte [] document = new byte [ ( int) randomAccessFile.length ()] ;

randomAccessFile.read (document) ;
// ---------------------------------------------
Run Code Online (Sandbox Code Playgroud)

在第 1 行中,我在 read 中访问文件在第 2 行中,我创建了一个与文件大小相同的字节数组对象在第 3 行中读取了字节数组

但永远不会转储字节数组上的文件。

我认为程序应该是这样的:

/ / ---------------------------------------------
RandomAccessFile RandomAccessFile = new RandomAccessFile ( " pathfile ", " r");

byte [] document = new byte [ ( int) randomAccessFile.length ()] ;

// Line changed
document = randomAccessFile.read();
// ---------------------------------------------
Run Code Online (Sandbox Code Playgroud)

Java 文档说: …

java bytearray randomaccessfile

2
推荐指数
1
解决办法
8811
查看次数

从随机访问文件中读取

我正在从一个简单的 RandomAccessFile 中读取 10 行并打印每一行。文本文件中的具体行如下所示:

蓝色的

绿色的

气泡

奶酪

百吉饼

拉链

糖果

图表

当我逐行阅读时按顺序打印它们时,我的输出是这样的:

绿色的

奶酪

拉链

图表

我无法理解为什么我的方法会跳过文件中的每隔一行。我是否误解了 RandomAccessFile 的工作原理?我的方法如下:

RandomAccessFile file = new RandomAccessFile(FILEPATH, "rw");
    read(file);

public static void read(RandomAccessFile t) throws IOException{
    while (t.readLine()!=null) {
        System.out.println(t.readLine());
    }
}
Run Code Online (Sandbox Code Playgroud)

java randomaccessfile

2
推荐指数
1
解决办法
4358
查看次数

RandomAccessFile字节序问题

我必须从二进制文件中读取字节,整数和长数据大小的数据。我读它RandomAccessFile的方法readIntreadLongreadByte。问题是系统(Windows 8.1)的尾数与文件的尾数不同。例如这个数字 在此处输入图片说明文件中的数字实际上是数字2,但是从系统读取的33554432

如何解决此问题,并能够使用RandomAccessFile的方法读取数据块 ?

java stream endianness randomaccessfile

2
推荐指数
1
解决办法
1241
查看次数

RandomAccessFile.seek()如何工作?

根据API,这些是事实:

  • seek(long bytePosition)简单的说法,将指针移动到与指定的位置bytePosition的参数。
  • bytePosition大于文件长度时,除非在(新)末尾写入一个字节,否则文件长度不会改变。
  • 如果以跳过的长度存在数据,则这些数据将保持不变。

但是,我好奇的情况是:当有一个没有数据的文件(0字节)时,我执行以下代码:

file.seek(100000-1);
file.write(0);
Run Code Online (Sandbox Code Playgroud)

所有的100,000个字节0几乎立即被填满。我可以说10毫秒超过200GB。

但是,当我尝试使用其他方法(例如BufferedOutputStream同一进程)写入100000字节时,将花费几乎无限长的时间。

时间差异的原因是什么?有没有更有效的方法来创建n字节文件并用0s 填充?

编辑: 如果没有实际写入数据,文件中如何填充数据?示例代码:

RandomAccessFile out=new RandomAccessFile("D:/out","rw");
out.seek(100000-1);
out.write(0);
out.close();
Run Code Online (Sandbox Code Playgroud)

这是输出:

输出量

另外,如果文件足够大,由于空间不足,我将无法再写入磁盘。

java file bufferedoutputstream randomaccessfile

2
推荐指数
1
解决办法
4287
查看次数

Java RandomAccessFile通过偏移写入扩展文件

所以我知道您可以通过写一个超过当前大小的文件来扩展RandomAccessFile的大小,但是我似乎找不到特定情况下的任何信息。

如果我有一个10字节的文件,并且我写了5个字节,偏移量为15,则文件扩展为20个字节,但是,对于文件的旧端与我开始写的位置之间的字节,可以保证吗?例如,它们是否保证全为零或未定义?

java randomaccessfile

1
推荐指数
1
解决办法
553
查看次数

使用 Java 中的特定编码写入文件

可能与我之前的问题有关(关于如何将“för”转换为“för”)

所以我在我的代码中创建了一个文件。现在我通过以下代码创建它:

FileWriter fwOne = new FileWriter(wordIndexPath);
BufferedWriter wordIndex = new BufferedWriter(fwOne);
Run Code Online (Sandbox Code Playgroud)

跟着几个

wordIndex.write(wordBuilder.toString()); //that's a StringBuilder
Run Code Online (Sandbox Code Playgroud)

结束(在while循环之后)

wordIndex.close();
Run Code Online (Sandbox Code Playgroud)

现在问题是这个文件很大,我想(需要)在不遍历整个文件的情况下跳转到它。让我这样做的seek(long pos)方法RandomAccessFile

这是我的问题:我创建的文件中的字符似乎是用 UTF-8 编码的,我寻找时唯一的信息是我想跳转到的字符位置。seek(long pos)另一方面,以字节为单位跳转,因此我不会在正确的位置结束,因为 UTF-8 字符可能超过一个字节。

这是我的问题:当我写文件时,我可以用 ISO-8859-15 来写它吗(其中一个字符是一个字节)?这样,这seek(long pos)将使我处于正确的位置。或者我应该尝试使用替代方法RandomAccessFile(是否有替代方法可以跳转到字符位置?)

java encoding utf-8 iso-8859-15 randomaccessfile

0
推荐指数
1
解决办法
1万
查看次数