- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在考虑更改 this question进入我的情况。然后我决定我的情况需要自己的问题并希望得到答案。在调用 FileChannel.truncate()
减小文件大小后,我调用 FileChannel.size()
,关闭 FileChannel
然后调用File.length()
。文件存在于整个操作过程中。 FileChannel.size()
总是准确的。在极少数情况下,File.length()
会在 truncate()
之前返回文件的大小。
这是显示情况的代码。
public static void truncate(File file, long size) throws IOException
{
FileChannel channel;
Path path;
long channelSize, fileLengthOpen, fileLengthClosed;
path = file.toPath();
channel = FileChannel.open(path, StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.CREATE);
try
{
channel.truncate(size);
channelSize = channel.size();
fileLengthOpen = file.length();
}
finally
{
channel.close();
}
fileLengthClosed = file.length();
if ((channelSize != size) || (fileLengthOpen != size) || (fileLengthClosed != size))
throw new IOException("The channel size or file length does not match the truncate size. Channel: " + channelSize + " - Open File: " + fileLengthOpen + " - Closed File: " + fileLengthClosed + " - Truncate: " + size);
}
在极少数情况下,代码会抛出 IOException
。 channelSize
== size
和 fileLengthOpen
== size
但是 fileLengthClosed
!= 尺寸
。
为什么 fileLengthClosed
!= size
?如何确保 File.length()
匹配 FileChannel.size()
?只要不强制刷新文件的内容,刷新文件的元数据就可以了。刷新文件内容会导致不必要的文件 I/O。
告诉我使用 channelSize
或 fileLengthOpen
或忽略问题的答案将不会被接受。我有另一个使用 File.length()
来确定文件长度的类文件。将 channelSize
或 fileLengthOpen
传递给其他类需要将值向上传递到堆栈几帧,然后返回几帧。如果您建议我使用 Files.size()
来解决问题,请解释原因。
我不确定这是否重要。我在 Linux 上运行 Java 10。 (是的,我知道 Java 10 已经过时了,但我一直坚持使用它,直到我可以实现升级到 Java 11 的必要功能。)
编辑:过去,文件的多线程更新引起了问题。为此,我创建了一种文件锁定机制,使得整个进程中只有1个线程可以独占对一个文件进行操作(或者多个线程可以读取该文件)。此外,传递给我的 truncate()
的 File
对象是由调用线程创建的,并且仅由该线程使用。我可以保证进程中没有其他线程可以对磁盘上的文件或 File
对象进行操作。
编辑:我更改了代码以在 channel.close()
之前和之后调用 Files.size()
。 channel.size()
、File.length()
和 Files.size()
报告正确的大小,而 channel
是开放的。在 channel.close()
之后,File.length()
和 Files.size()
在极少数情况下是原始的较长文件长度而不是截短的较短长度。
最佳答案
自旋等待 fileLengthClosed
正确。这是代码。
while (true)
{
fileLengthClosed = file.length();
if (fileLengthClosed == size)
break;
Thread.sleep(1);
}
我已经运行这段代码 3 周了,没有出现任何问题。一个问题是,如果文件长度被修改或 file.length()
永远不会更新,则没有超时代码。
这个解决方案并没有回答为什么 File.length()
首先是不正确的。此外,调用 Thread.sleep()
表明我真的在等待其他操作完成,我真的应该强制该操作完成或阻止该操作。我不确定如何强制或阻止该操作。
关于Java FileChannel.size() 与 File.length() - 在 FileChannel.truncate() 之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55560520/
MySQL 似乎允许 TRUNCATE table_name 并且实际上确实截断了表。似乎存在性能差异,TRUNCATE TABLE table_name 似乎更快。我找不到任何关于差异的信息。我发现
我想避免使用 Aerospike 客户端(例如 Python)并使用 native asinfo 从集合中删除记录命令'truncate'因为它可以快速完成。但在我重新启动 Aerospike 后,所
我缺乏构建存储过程的经验,并且遇到了这个错误,我无法理解背后的原因: [2015-09-29 01:01:55] [22001][1292] Data truncation: Truncated in
这个问题很难用短语来表达,所以让我解释一下。 作为 RSS 缓存系统的一部分,我每天多次将大量行插入到数据库中。其中一列是“片段”,用于 RSS 提要中的 description 节点。 有时这个节点
我想我的标题不是那么清楚。 我会试着解释一下: 我可以使用 FileStream 写入和读取文件 FileStream fs = new FileStream("C:\\Users\\Public\\
我正在尝试优化我的批量加载程序。 目前我分步加载数据(我不遵循下面的 SQL 语法,只遵循算法): BEGIN TRUNCATE table COPY into table ANALYZE table
我正在尝试为我的 Minecraft 服务器编写一个商店插件,但每当有人执行/purchase 命令时我总是收到错误消息。 这是错误: 2012-07-03 04:27:28 [SEVERE]
TRUNCATE TABLE 删除表中的所有行,而不记录单个行删除操作。 语法 ?
备注 与 DELETE 语句相比,TRUNCATE TABLE 具有以下优点: 所用的事务日志空间较少。 DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一个条目。TRUNCA
我最近也遇到了这个问题。当我将表(称为事件和索引)填充到超过 100 万个,并尝试截断它们以进行新测试时,截断后表不为空。 CQL 显示类似 cqlsh> select count(*) from e
如果我尝试截断约 4000 万个文档的大型集合,我会在 arangosh 中超时,并且 arangodb 服务会无响应。留言: arangosh [database_xxx]> db.[collect
我将 spring-data 与 CrudRepository 一起用于任何数据库访问。每天一次,我还必须截断包含大约 100GB 数据的缓存表并重建它。 问题:表被成功截断(我验证表是空的),但是文
这是我正在使用的基于this的sql答案: SET @pattern = '%_movielist'; SELECT concat('TRUNCATE TABLE ', GROUP_CONCAT(co
这是简化的查询。 SELECT `a`, TRUNCATE(`b` / 1000, 3) AS `b` FROM ( ... ) AS `m`
我使用的 MySQL 服务器是 5.5.41。我还想指出,我没有设计这个数据库。 我遇到的问题是,在使用 MySQL 的 TRUCATE 函数时,我似乎因一个错误而中断。因为它不准确。请参阅随附的屏幕
Truncate table语句用来删除/截断表里的所有数据 和delete删除所有表数据在逻辑上含义相同,但性能更快 类似执行了drop table和create table两个语句
前言 上周同事小姐姐问我:“哈哥你看,我发现MySQL有bug,我下午为了清理磁盘,明明删除了100万条MySQL数据,磁盘不仅没有变小,反而更满了呢??” 那你是怎么删除的?
本文主要讲mysql中三种删除表的操作,delete语句、truncate语句以及drop语句的区别: 简介 delete 1、删除整张表的数据: ?
不同点: 1.truncate和delete只删除数据不删除表的结构(定义) drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index);依赖于该
SQLite Truncate Table 在SQLite 中,并没有 TRUNCATE TABLE 命令,但可以使用 SQLite 的 DELETE 命令从已有的表中删除全部的数据,但建议使用 D
我是一名优秀的程序员,十分优秀!