我知道如何截断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搜索,无法找到答案.请帮忙.提前致谢.
这是我正在运行的代码:
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) 我正在为DNG / TIFF文件编写读写器。一般而言FileInputStream,有几种处理文件的选项(FileChannel,RandomAccessFile),我不知道哪个策略是适合我的需要。
DNG / TIFF文件由以下内容组成:
整个文件的大小范围从15 MiB(压缩的14位原始数据)到大约100 MiB(未压缩的浮点数据)。要处理的文件数为50-400。
有两种使用模式:
我目前正在使用,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) 我正在尝试将字节数据写入文件并进行优化,我希望减少写入文件的次数.
目前,我正在使用:
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.
我有一个文件,文件的前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
可悲的是,这对我不起作用.我找不到获取特定值的方法.
有没有人看到任何方法来解决这个问题?
我不明白 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)
}
我有一个像文本文件
one
two
three
four
five
Run Code Online (Sandbox Code Playgroud)
我需要获取文件中每一行的偏移量.我如何用Java做到这一点?
我搜索了一些I/O库(如BufferedReader和RandomAccessFile)但我无法找到满意的答案.
任何人都可以建议如何处理这个?
我正在使用谷歌翻译器,我希望这个问题很好理解。
有一件事我不了解随机访问文件。不了解该程序的工作原理,但它可以工作。
这是我的程序:
// ---------------------------------------------
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 文档说: …
我正在从一个简单的 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) 根据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)
这是输出:
另外,如果文件足够大,由于空间不足,我将无法再写入磁盘。
所以我知道您可以通过写一个超过当前大小的文件来扩展RandomAccessFile的大小,但是我似乎找不到特定情况下的任何信息。
如果我有一个10字节的文件,并且我写了5个字节,偏移量为15,则文件扩展为20个字节,但是,对于文件的旧端与我开始写的位置之间的字节,可以保证吗?例如,它们是否保证全为零或未定义?
这可能与我之前的问题有关(关于如何将“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(是否有替代方法可以跳转到字符位置?)
randomaccessfile ×13
java ×12
file ×2
byte ×1
bytearray ×1
bytebuffer ×1
c ×1
encoding ×1
endianness ×1
filechannel ×1
iso-8859-15 ×1
java-9 ×1
java-io ×1
offset ×1
scanf ×1
stdin ×1
stream ×1
utf-8 ×1