我正面临一个不寻常的问题.我正在建造一个计划每5分钟运行一次的工具.它将从特定目录中获取zip文件,并将文件(取决于文件名)提取到目标.我zipentry用来获取zip文件中的每个文件名然后根据需要提取然后我将它们(zip文件,一旦我完成zip中的所有文件)备份到特定目录然后删除zip文件.但有时(并非总是)zip文件不会被删除.因为我正在使用fileutils.forcedelete().我收到一个例外:无法删除文件.所以我改为代码使用fileutils.forcedeleteonexit()仍然有些文件保留在源代码中.
以下是我的代码示例:
sourceFile=new file(zipfile);
zipFile = new ZipFile(sourceFile);
zEnum = (Enumeration<ZipEntry>) zipFile.entries();
for (int a = 0; a < zipFile.size(); a++)
{
ZipEntry zE = zEnum.nextElement();
//Function uses zip4j for extracting. No streams used.
extract(String sourceZipFile, String fileNameToExtract, String outputFolder);
}
//I tried it with finally either
zipFile.close();
//Using fileutils to copy. No streams used.
copyFile(sourceFile, backup);
FileUtils.forceDeleteOnExit(sourceFile);
Run Code Online (Sandbox Code Playgroud)
没有使用流,但我有时(不总是)锁定文件.什么似乎是这里的错误?是zip4j提取导致问题还是其他什么?我使用的是zip4j 1.3.1.
有人可以准确地解释我(更好,如果有例子)FileUtils.cp_r中的dereference_root选项和同一类的其他类方法的含义?
先感谢您.
我有一个简单的Java应用程序,试图通过WAN(从爱尔兰到纽约)复制文件.
我最近修改它使用,FileUtils因为本机Java文件副本太慢.我研究并发现,因为Fileutils使用NIO它更好.文件副本现在工作得很好但偶尔我需要复制非常大的文件(> 200Mb)并且副本失败并显示错误:
java.io.IOException: Failed to copy full contents from...
Run Code Online (Sandbox Code Playgroud)
我知道错误意味着目标文件大小与源不一样,所以最初我认为这是网络问题.该过程会反复尝试每隔几个小时复制一次该文件,但它永远不会成功.但是,当我通过Windows浏览器手动复制文件时,它工作正常.这似乎排除了网络...但我不太确定.
我已搜索但找不到任何相同问题的帖子.任何帮助将不胜感激.
谢谢!
另外:
我正在使用这个FileUtils方法:
public static void copyFile(java.io.File srcFile, java.io.File destFile) throws java.io.IOException
Run Code Online (Sandbox Code Playgroud) 仅当目录不存在时,如何才能通过 SFTP 在 Ruby 上创建目录?
我现在有以下代码:
Net::SFTP.start( ip, id, :password => pass, :port=> port ) do |sftp|
sftp.mkdir! remotePath
sftp.upload!(localPath + localfile, remotePath + remotefile)
end
Run Code Online (Sandbox Code Playgroud)
我第一次创建目录没有问题,但它会尝试重新创建相同的目录,即使它已经存在并且它会抛出一个错误。
有谁知道如何做到这一点?
在使用 fileutils 时,有这样的代码:
FileUtils.mkdir_p(remotePath) unless File.exists?(remotePath)
Run Code Online (Sandbox Code Playgroud)
有什么办法可以通过 SFTP 做同样的事情吗?
正如我发现的,底层操作系统调用 is copyToFile(),Libcore.os.read(fd, bytes, byteOffset, byteCount)whiletransferTo()基于内存映射文件:
MemoryBlock.mmap(fd, alignment, size + offset, mapMode);
...
buffer = map(MapMode.READ_ONLY, position, count);
return target.write(buffer);
Run Code Online (Sandbox Code Playgroud)
Q1:我的发现是对还是错?
Q2:有什么理由使用FileUtils.copyFile()asFileChannel.transferTo()似乎应该更有效吗?
谢谢
如何使用 apache commons FileUtils 传递用于下载文件的用户凭据?
我正在使用如下身份验证器,但似乎不起作用。它甚至不会抱怨凭据不良,因此看起来我的身份验证器被忽略了。我不断收到 403。
import java.net.Authenticator;
import java.net.PasswordAuthentication;
public class MyAuthenticator extends Authenticator {
private static String username = "myUser";
private static String password = "myPass";
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication (username,
password.toCharArray());
}
}
Run Code Online (Sandbox Code Playgroud)
然后在主要:
public static void main( String[] args )
{
// Install Authenticator
Authenticator.setDefault(new MyAuthenticator());
try {
FileUtils.copyURLToFile((new URL("https://example.com/api/core/v3/stuff/611636/data?v=1"),
new File("d:\\example\\dir1\\subdir1\\myFile.tar"));
} catch (IOException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
我可以使用正确的凭据通过邮递员下载。我可以使用 FileUtils 在不使用凭据的情况下下载非安全文件。
有谁知道实现Apache的进度条的任何方式FileUtils.copyDirectory(File src, File dst)?我没有看到任何有用的JavaDocs和API.在处理批量磁盘操作时似乎是一个常见的用例,所以我不确定我是否会错过一些明显的东西.
我们有一个 150 Gb 的数据文件夹。其中,文件内容可以是任何格式(doc、jpg、png、txt 等)。我们需要相互检查所有文件内容以检查是否有重复的文件内容。如果是,则打印文件路径名列表。为此,我首先使用ArrayList<File>存储所有文件,然后使用FileUtils.contentEquals(file1, file2)方法。当我尝试处理少量文件(文件夹)时,它可以工作,但是对于这个 150Gb 数据文件夹,它没有显示任何结果。我认为首先将所有文件存储在 ArrayList 中会产生问题。JVM 堆问题,我不确定。
任何人都有更好的建议和示例代码来处理如此大量的数据?请帮我。
我正在尝试使用Apache Commons逐行迭代1.2GB文件FileUtils.lineIterator.然而,一旦LineIterator打电话hasNext()我就得到了java.lang.OutOfMemoryError: Java heap space.我已经分配1G到java堆了.
我在这里做错了什么?在阅读了一些文档之后,LineIterator是不是应该从文件系统中读取文件而不是将其加载到内存中?
请注意代码在Scala中:
val file = new java.io.File("data_export.dat")
val it = org.apache.commons.io.FileUtils.lineIterator(file, "UTF-8")
var successCount = 0L
var totalCount = 0L
try {
while ( {
it.hasNext()
}) {
try {
val legacy = parse[LegacyEvent](it.nextLine())
BehaviorEvent(legacy)
successCount += 1L
} catch {
case e: Exception => println("Parse error")
}
totalCount += 1
}
} finally {
it.close()
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
在尝试使用 Android Studio 使用 Apache commons IO 第三方 API 时,我偶然发现了这个问题。
基本上,当我尝试调用FileUtils.readLines()方法时,有 3 个选项:
第一个选项已经被弃用,这意味着我不应该再使用它,所以我只输入readLines(file,null)但是,现在的问题是 Android Studio 不知道我使用哪个 readLines() 方法签名m 使用是因为readLines(file,null)对第二个和第三个方法签名都有效。
下面的屏幕截图进一步解释了我的意思:
任何人都可以请教我吗?如何告诉 Android Studio 我想用于FileUtils.readLines()的特定方法签名?
fileutils ×10
java ×7
android ×2
ruby ×2
algorithm ×1
apache ×1
checksum ×1
collections ×1
dereference ×1
directory ×1
file-copying ×1
filechannel ×1
io ×1
ioerror ×1
large-files ×1
readlines ×1
scala ×1
sftp ×1
unzip ×1